git branch -d会给出警告

144

我刚删除了一个本地分支,想更好地理解这个警告信息。

警告:正在删除已合并到 'refs/remotes/origin/old_branch',但尚未合并到 HEAD 的分支 'old_branch'


69
如果你使用--squash合并旧分支,当你在本地删除该旧分支时,你会一直收到此警告。使用--squash合并后,你的索引将被重置,因此与旧分支的HEAD不匹配。 - Antoine Wils
3
虽然其他答案是正确的,但在我的情况下,安东尼的评论是原因。 - Squrppi
4
@AntoineWils,这应该是一个答案。 - 0TTT0
6个回答

105

这只是提醒您,您已经将更改推送到origin分支,但是它们尚未合并到当前检出的分支中,因此您仅在本地删除它。

它警告您不再具有该分支的本地副本,但它存在于origin中。

如果您还想删除远程分支,请使用git push --delete origin old_branch


11
是的,“主分支(master)”并没有参与其中。你的意思是当前的分支,对吧?;) - Fernando Espinosa
3
即使我执行的是git branch -d branch_name这个命令,也会收到警告,而这个命令只应该在本地删除分支。为什么在这种情况下还需要警告? - Akshay Damle
4
原本/旧分支已合并到原本/主分支。之后我在主分支上执行了git pull origin命令,但仍然出现相同的错误。这不是GitHub上的一个bug吗? - vikramvi
我得到了以下错误信息:error: failed to push some refs to 'https://github.com/repo/repo.git'。 - 629060311

45

假设您当前已检出master,这意味着在old_branch中进行的更改不会出现在master中。 但是,在origin上的old_branch中它们是存在的。


8
是的,这是正确的答案!“但尚未合并到HEAD”,这里的HEAD指的是本地主分支的HEAD - Devy
7
但是 origin/old_branch 已合并到 origin/master 分支中。后来我在 master 分支上执行了 git pull origin 命令,但仍然出现相同的错误。这难道不是 GitHub 上的一个 bug 吗? - vikramvi
4
假设你已经在本地检出了master分支,即使是在origin/old_branch分支上执行了快进式的变基操作(rebase),如果任何提交记录的 SHA 已更改,仍可能发生此情况。即,即使它是一个快进式变更,每个来自 origin/old_branch 的新提交记录都将生成一个新的 SHA,这会导致 Git 在将更改拉取到本地 master 分支后将你本地的old_branch分支上的原始SHA看作未合并的状态。关于为什么会出现这种情况,您可以参考这个答案这个答案 - user711807

10
这意味着您的本地分支old_branch与远程origin上的old_branch分支保持同步,但尚未合并到被认为是repo中主要分支的master分支中。
这只是git的一个预防措施。它给出了一个提示:也许你在topic-branch中完成了工作,却忘记将其合并到主分支中? 更新 Git警告您可能会丢失更改。例如,如果您没有将old_branch合并到主git中,则不允许您删除未合并到主分支的分支(虽然可以使用-D选项进行强制删除)。

9
不一定是“主分支(master)”,而是当前的“HEAD”。 - Frozen Flame
因此,-D 是在您尚未与任何远程分支共享要删除的分支(实际上是提交)时使用的。而警告是为了通知您已经将该分支(提交)与远程共享,但它尚未合并到 HEAD 中。HEAD 是 HEAD,remote/refs/HEAD 不同。但如果我对远程 HEAD 和本地 HEAD 之间的区别有误,请纠正我。 - Eric

9

除了其他答案所述,这也可能意味着更改可能会合并到主分支,只是您本地的主分支副本尚未反映出它。无论哪种方式,这只是告诉您,您的主分支本地副本没有您在源上推送的更改。合并/未合并...也许,也可能不是。


7

这里的一些回答完全正确,但似乎没有完全解决问题。因此,我将尝试再次解释。

原问题改述

在GitHub/Bitbucket等上执行一个拉取请求(Pull Request)并通过完成拉取请求自动删除分支后,当我尝试删除本地分支时,会看到以下错误消息:warning: deleting branch 'old_branch' that has been merged to 'refs/remotes/origin/old_branch', but not yet merged to HEAD.

时间线理解

GitHub或其他远程仓库不知道您计算机的本地状态。

当拉取请求被完成并要求删除原始PR分支时,它不知道您的本地分支。

此时,您删除了本地分支。您的本地repo/计算机知道以下时间线:

  1. myfeature ==> origin/myfeaturemyfeature已经推送到远程仓库)
  2. 然后删除myfeature
  3. 所以,origin/myfeature仍然存在,尽管它没有本地表示

当然,这是不正确的,因为origin/myfeature分支已在完成PR时被销毁,但您的本地计算机不知道这一点。所以,Git会给您一个警告。

GitHub/BitBucket等难道不能让这更容易吗?

因为

PR完成 ==> 删除远程分支

范例是如此普遍,如果远程分支可以以某种方式通知本地分支发生了这种情况,那就好极了。但Git在“单向通信”方面做得非常出色,只有在请求信息时才发送未请求的信息。在某个领域进行"双向通信"可能会使人们想要在其他领域中使用它,很快我们就会回到Git看起来更像SVN或其他"中央仓库"范例的情况,而这些仓库过于脆弱以至于无法成功。比我懂得多的人可能可以更好地解释这种“双向通信”会引起的所有问题。


2
另外需要注意的是:阅读一下 git prune 可能会很有价值,因为它是一种简单的清理“额外垃圾”的方法,当你有指向不再工作的远程分支的指针时。 - Mike Williamson

0

这意味着你对该分支的更改已经合并到远程(main/master),但却没有合并到本地(main/master)。

为避免这些警告,必须切换到 main/master 并进行拉取操作。


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