为什么git不允许我安全删除分支?

39

我需要合并两个分支--将second合并到first,然后摆脱second。这是我所做的:

  • git clone项目以获取新副本
  • git checkout --track origin/second,进行了一些更改,并提交
  • git checkout --track origin/first,进行了一些更改,并提交
  • git merge second(git说"merge made by recursive")
  • git branch -d second

然后Git说:

$ git branch -d second
warning: not deleting branch 'second' that is not yet merged to
         'refs/remotes/origin/second', even though it is merged to HEAD.
error: The branch 'second' is not fully merged.
If you are sure you want to delete it, run 'git branch -D second'.

为什么会出现这种情况?我以前合并分支从来没有遇到过这个消息。合并进程很顺利,没有冲突。如何安全地删除second分支?


git checkout second 然后 git push origin second 可以让 git 不再抱怨,但我不明白为什么。 - Matt Fenwick
1
猜测一下,也许是因为你在删除 second 之前没有将其推送到远程仓库,导致 git 报错?同时确保你不处于“分离 HEAD”状态。 - knittl
1
它不希望您失去本地分支的本地修改(尽管我自己从未看到过这个消息)。我将在源代码中查找其背后的逻辑。 - knittl
1
在这种情况下,它知道secondorigin/second的跟踪分支,因此它想知道对second所做的更改是否已推送到origin。如果不是跟踪分支,我认为它不会对此表示抱怨。second已经在本地合并到first似乎对于git而言并不重要,尽管看起来你可能可以证明,由于它至少已经被合并到其他分支,删除该分支应该是可以接受的。 - twalberg
不幸的是,我已经做了更多的修改,所以我无法尝试那个。 - Matt Fenwick
显示剩余3条评论
3个回答

58

根据我的实验以及@knittl和@twalberg的评论,看起来git只是希望我在删除second分支之前将我的更改推送到此分支。

我执行了以下操作:

$ git checkout second
$ git push origin second
$ git checkout first
$ git branch -d second

这个方法没有警告。


git branch -D second 也能解决这个问题吗?还是说这样做很危险? - Bart
1
@Bart 这取决于你所说的“解决它”的含义。这样做的结果不会与我的解决方案相同——origin远程的状态将会有所不同。 - Matt Fenwick
1
@Bart 只有在你知道自己在做什么的情况下才应该使用它。Git通常会给出有用的警告,因此最好不要强制执行操作。 - cst1992
对于像我这样的新用户来说,“push origin”比强制删除分支更可接受。 - user26742873

0

我认为这种情况通常发生在你已经通过 Pull Request 合并了一个分支到远程仓库,并且删除了该远程分支。

在我的实验中,不要删除远程分支并先使用本地的 -d 命令是解决方案。


0

基本上,本地的“second”分支与远程的“second”分支不同步,而Git不希望您丢失任何工作。

在这种情况下,更新不确定是否会丢失,因为它已经合并到“HEAD”中。如果将“HEAD”分支推送到远程,则不应该有问题。但是,如果“HEAD”出现问题,仍然有可能丢失您的工作。

总之,这只是额外的保证,请随意强制删除。


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