403

我们正在使用 git 存储库来存储我们的项目。我们有我们的分支离开原来的分支。但是现在我们想创建一个小的新项目来跟踪一些文档。为此,我们希望创建一个新的空分支来开始存储我们的文件,并且我希望网络的其他用户克隆该分支。

我们怎么能做到这一点?

我尝试了一些东西,但它们没有用。

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

它似乎可以推送分支,但是当我进行提取或拉取时,它会从其他分支下载信息,然后我还会从其他项目中获取一些额外的文件。最好的解决方案是什么?

4

10 回答 10

767

您可以创建一个孤立的分支:

git checkout --orphan <branchname>

这将创建一个没有父级的新分支。然后,您可以使用以下命令清除工作目录:

git rm --cached -r .

并添加文档文件,提交它们并将它们推送到 github。

pull 或 fetch 将始终更新有关所有远程分支的本地信息。如果您只想拉取/获取单个远程分支的信息,则需要指定它。

于 2012-12-20T09:57:46.573 回答
74

正确的答案是创建一个孤儿分支。我在我的博客上详细解释了如何做到这一点。(存档链接)

...

在开始之前,请升级到最新版本的 GIT。要确保您运行的是最新版本,请运行

which git

如果它吐出旧版本,您可能需要使用包含您刚刚安装的版本的文件夹来扩充您的 PATH。

好的,我们准备好了。将 cd 放入包含 git checkout 的文件夹后,创建一个孤立分支。对于此示例,我将分支命名为“mybranch”。

git checkout --orphan mybranch

删除孤立分支中的所有内容

git rm -rf .

做一些改变

vi README.txt

添加并提交更改

git add README.txt
git commit -m "Adding readme file"

就是这样。如果你跑

git log

你会注意到提交历史是从头开始的。要切换回您的主分支,只需运行

git checkout master

您可以通过运行返回孤立分支

git checkout mybranch
于 2013-09-30T00:15:05.467 回答
15

像这样创建一个空的新分支:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

如果您的 proj-doc 文件已经在单个子目录下的提交中,您可以这样创建新分支:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

这可能比git branch --orphan让你有很多事情要做git rm更方便git mv

尝试

git branch --set-upstream proj-doc origin/proj-doc

看看这是否有助于解决您获取过多的问题。此外,如果您真的只想获取单个分支,那么在命令行上指定它是最安全的。

于 2012-12-20T23:25:10.990 回答
9

如果您的 git 版本没有 --orphan 选项,则应使用此方法:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

做了一些工作后:

git add -A
git commit -m <message>
git push origin <newbranch>
于 2014-09-09T12:46:25.953 回答
8

假设您有一个master包含文件/目录的分支:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

一步一步如何制作一个空分支:

  1. git checkout —orphan new_branch_name
  2. 在执行以下命令之前,请确保您位于正确的目录中:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

在第 2 步中,我们只需在本地删除所有文件,以避免与新分支上的文件和您保留在master分支中的文件混淆。然后,我们在步骤 3 中取消链接所有这些文件。最后,步骤 4 及之后的步骤正在使用我们新的空分支。

完成后,您可以轻松地在分支之间切换:

git checkout master 
git checkout new_branch
于 2016-10-10T10:21:14.520 回答
7

最好的解决方案是使用--orphan选项创建一个新分支,如下所示

git checkout --orphan <branch name>

这样,您将能够创建一个新分支并直接结帐到新分支。这将是一个无父分支。

默认情况下,该--orphan选项不会删除工作目录中的文件,因此您可以通过以下方式删除工作目录文件:

git rm --cached -r

详细说明它的--orphan作用:

--orphan <new_branch>
创建一个新的孤立分支,命名为<new_branch>,开始于<start_point>并切换到它。在这个新分支上进行的第一次提交将没有父母,它将成为与所有其他分支和提交完全断开的新历史的根。

索引和工作树的调整就像您之前运行过 git checkout <start_point> 一样。这允许您通过轻松运行 git commit -a 来创建一个新的历史记录,该历史记录记录一组类似于 <start_point> 的路径以进行根提交。

当您想从提交中发布树而不暴露其完整历史时,这可能很有用。您可能希望这样做以发布一个项目的开源分支,该项目的当前树是“干净的”,但其完整历史记录包含专有或其他受累的代码位。

如果你想开始一个断开的历史记录,记录一组与 <start_point> 完全不同的路径,那么你应该在创建孤立分支后立即通过运行 git rm -rf 清除索引和工作树。从工作树的顶层开始。之后,您将准备好准备新文件、重新填充工作树、从其他地方复制它们、提取 tarball 等。

于 2020-01-25T03:24:21.113 回答
6

基于Hiery Nomus 的这个答案。

您可以创建一个孤立的分支:

git checkout --orphan <branchname>

这将创建一个没有父级的新分支。然后,您可以使用以下命令清除工作目录:

git rm --cached -r .

然后你只需用空提交提交分支,然后推送

git commit -m <commit message> --allow-empty
git push origin <newbranch>
于 2020-02-19T12:42:09.423 回答
4

我找到了这个帮助:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
于 2020-06-10T07:17:24.983 回答
1

我在这里找到了

如果您使用 git 2.23 或更高版本,您可能会习惯git switchgit restore不是git checkout

所以如果你需要一个空分支试试这个:

git switch --orphan YourNewBranch

就是这样 :))

于 2021-09-06T18:00:30.970 回答
1

2022 更新

从 Git 2.23 开始,您可以使用它git switch --orphan <new branch>来创建一个没有历史记录的空分支。与 不同git checkout --orphan的是,所有跟踪的文件都将被删除。

一旦你在这个分支上确实有提交,它就可以被推送到远程存储库:

git switch --orphan <new branch>
git commit --allow-empty -m "Initial commit on orphan branch"
git push -u origin <new branch>
于 2022-01-13T18:19:57.287 回答