在GitHub上创建空分支

308

我想创建一个名为release的新GitHub分支。

这个分支必须是空的!但是,已经存在一条包含x次提交的分支,我不想保留它的提交历史记录。

我找到的唯一方法是创建一个本地的--orphan分支。


3
可能是 Git 中如何在根提交之前插入一个提交? 的重复问题。 - msw
1
你为什么想要这样做?你可以把空集合叫做“Fred”,但它仍然是空集合。 - msw
如果您告诉我们更多关于为什么要这样做的信息,那么可能会帮助我们提供好的答案。 - willoller
只有将代码通过git push origin _branch_推送到GitHub服务器,你在git上所有的操作都是本地的。 - Joe
4
这里需要注意的一点是:从技术上讲,空分支 并不存在。你想要的是一个带有 空索引孤立分支,这正是被接受的答案所产生的结果。这可能看起来像是一个无意义的技术争论,但实际上它是一个非常有意义(如果这是一个词的话)的技术争论:Git 的功能本质上就是一堆技术细节,因此在 Git 中进行技术争论时,你需要非常精确。 - torek
5个回答

671
2021年11月更新:从git版本2.27开始,您现在可以使用以下命令创建一个没有历史记录的空分支:
git switch --orphan <new branch>

git checkout --orphan <new branch>不同,这个分支不会包含来自当前分支的任何文件(除了git不跟踪的文件)。
这应该是创建没有先前历史记录的空分支的首选方法。
一旦在这个分支上有了提交,可以通过git push -u origin <branch name>将其推送到GitHub。
git switch --orphan <new branch>
git commit --allow-empty -m "Initial commit on orphan branch"
git push -u origin <new branch>

原始回答:

--orphan选项有什么问题吗?如果你想要一个空的分支且没有历史记录,这就是正确的方法...

git checkout --orphan empty-branch

然后,您可以删除暂存区中的所有文件(以防止它们被提交):
git rm -rf .

此时,您在您的机器上有一个空的分支。
在您可以推送到GitHub(或任何其他Git存储库)之前,您至少需要一个提交,即使它没有任何内容(即空提交),因为您不能推送一个空的分支。
git commit --allow-empty -m "root commit"

最后,将其推送到远程,并打开一瓶啤酒。
git push origin empty-branch

7
你好,我创建了一个空的GitHub代码库,但当我试图从另一个分支创建拉取请求时,它没有显示任何文件差异。你能告诉我如何解决这个问题吗? - Raghavendra S
1
@RaghavendraS 请看我的回答。我也遇到了同样的问题。 - Greg M. Krsak
3
也许一些人对这个被接受的答案有疑问,因为在删除所有文件之后,在提交之前是否漏掉了 git add . 步骤? - SCoyle
2
git rm -rf . 删除本地文件。 - Talha Anwar
1
问题在于,由于它是一个孤儿,您无法将其用于PR。这基本上没有回答问题:如何在GitHub上创建空分支,而不是在Git中。 - Erik Aronesty

29

--orphan 适用于在本地创建一个空分支,但是,在将其推送或与其他分支交互之前,您需要进行一次提交。

在孤立分支上创建新提交并不是一个好主意,因为您将无法与其他分支交互。例如:

git checkout --orphan test
git commit --allow-empty -m "init test branch"
git merge master
fatal: refusing to merge unrelated histories

相反,您应该首选从主分支的第一个提交中创建一个新分支。如果提交不为空,则可以在第一个提交之前添加一个空提交,如@houtanb所解释的那样。


7

您也可以按照此处的说明在master分支的根位置创建空提交。然后在空根提交所在的位置创建您的release分支。


3

接受的答案导致了一些问题,所以我做了以下操作:

$ git branch
* staging
$ git branch master c74d99cf46f6ed23e742f2617e9908294b4a608b
$ git checkout master
Switched to branch 'master'

我成功完成了我的目标,创建第二个分支时没有遇到合并/拉取请求问题。我只需选择一个基本提交以创建我的第二个分支。


5
根据定义,如果你的分支有一个基础提交,那么它就不是“空”分支。创建孤立分支时,你遇到了什么问题? - C. Augusto Proiete

0

接受的答案确实是正确的方法。然而,如果您已经有其他分支无法合并到新创建的新开发分支中,我个人最喜欢的解决方案是执行rebase,在需要合并到develop的分支上执行以下操作:

git rebase develop

这样,初始提交将是要合并的分支上的第一个提交。当然,这里有一个警告 :) 通过执行rebase,您正在重写分支上的历史。因此,您将不得不强制将分支推送到原点:

git push -f

其他人也使用该分支,现在将无法拉取,因此他们将不得不在获取develop后,在本地执行rebase。假设他们在需要重新定位的分支上:

git fetch
git rebase origin/develop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接