Git和"分支'x'没有完全合并"错误

mel*_*oon 270 git git-branch

以下是我在master分支中使用的命令

git branch experiment
git checkout experiment
Run Code Online (Sandbox Code Playgroud)

然后我对我的文件进行了一些更改,提交了更改,并将新分支推送到GitHub.

git commit .
git push -u origin experiment
Run Code Online (Sandbox Code Playgroud)

请注意,在git commit .提示我提交提交消息后,我给了它一个.后来我决定将我的实验分支合并到主分支中.

git checkout master
git merge experiment
Run Code Online (Sandbox Code Playgroud)

最后我将更改推送到GitHub.

git push -u origin master
Run Code Online (Sandbox Code Playgroud)

一切顺利,直到我尝试删除我的实验分支使用

git branch -d experiment
Run Code Online (Sandbox Code Playgroud)

我收到了错误消息error: The branch 'experiment' is not fully merged.我对git有点新鲜,我不知道我有多可能合并这两个分支.我在这里错过了什么?

seh*_*ehe 288

注意措辞根据提交而改变.谢谢@slekse
这不是一个错误,它是一个警告.这意味着您要删除的分支包含以下任何一个都无法访问的提交:其上游分支或HEAD(当前已检出的修订版).换句话说,当你可能失去提交¹.

在实践中,这意味着您可能修改,重新设置或过滤了提交,但它们看起来并不相同.

因此,您可以通过删除其他分支来检查包含您未引用的提交的分支来避免该警告

您需要验证您实际上没有遗漏任何重要的提交:

git log --graph --left-right --cherry-pick --oneline master...experiment
Run Code Online (Sandbox Code Playgroud)

这将为您提供分支之间任何非共享的列表.如果你很好奇,可能会有所不同--cherry-pick,这种差异很可能是你得到警告的原因:

--cherry-pick

当提交集受限于对称差异时,省略任何引用与"另一方"上的另一个提交相同的更改的提交.例如,如果您有两个分支A和B,通常只在一侧列出所有提交的方法是--left-right,就​​像上面该选项说明中的示例一样.然而,它显示了从另一个分支中挑选出来的提交(例如,"b上的第3个"可以从分支A中挑选出来).使用此选项,将从输出中排除此类提交对.


¹默认情况下,他们真的只是一段时间后才收集垃圾.此外,该git-branch命令不会检查所有分支的修订树.警告是为了避免明显的错误.

²(我的偏好是强制删除,但你可能想要额外的保证).

  • -1"这意味着您要删除的分支包含无法从任何其他引用头访问的提交." 这是不正确的.警告意味着分支无法从其上游(如果有)或从当前HEAD到达.请参阅git-branch的联机帮助页. (34认同)
  • 谢谢.关键短语是"包含无法从任何其他引用头部访问的提交".即使我不再需要实验分支,并且已经将它合并到master中,并计划从原点删除它,git也不会高兴,直到我将更改推送到实验原点.我想这个警告是一种健全的检查. (23认同)
  • @sleske感谢您的评论 - 这个答案应该真的被编辑.令人遗憾的是,由于主要解释性句子不正确,因此被高度赞成.我刚刚遇到这个问题并花了很长时间试图弄清楚问题是什么,而且只是远程跟踪分支已被删除作为拉取请求的一部分,并且在我从主人那里取出更改的时候在当地的分支机构.唯一的"问题"是没有找到被删除的远程跟踪分支(我试图删除本地分支出于同样的原因). (10认同)
  • @TachyonVortex不错的链接.命令git branch -vv真的澄清了我的想法. (3认同)
  • 是的,如果您在与创建它时所在的分支不同的分支上尝试删除本地分支,则只会发生这种情况."无法通过任何其他参考提交的提交"是不正确的,不必要的可怕! (3认同)
  • @sleske和其他人:最后再来测试这个并收紧措辞.感谢您的意见. (2认同)
  • 恕我直言,git 没有检查每个分支是一个错误。要么在真实准确的警告时发出警告,要么从不发出警告。有时正确有时错误时发出警告是没有帮助的。 (2认同)

drw*_*owe 77

正如Drew Taylor指出的那样,使用-d的分支删除仅考虑当前 HEAD来确定分支是否"完全合并".它会抱怨即使转移合并一些其他的分支.在这方面错误消息肯定会更清楚......您可以在删除之前签出合并的分支,或者只使用git branch -D.首都-D将完全覆盖支票.

  • 对于学习 git 的人来说,“current”这个词与“HEAD”似乎是多余的?不存在非当前 HEAD 之类的东西 - 根据定义,HEAD *是*当前*分支。我错过了什么吗?我想你可以说“当前分支”或“HEAD”,但不能说“当前HEAD”。 (3认同)
  • 关于当前HEAD的部分为我修复了它.我的主人不同于我创建冲突分支的功能分支:D (2认同)

qwe*_*guy 14

我尝试了sehe的答案但它没有用.

要查找尚未合并的提交,只需使用:

git log feature-branch ^master --no-merges
Run Code Online (Sandbox Code Playgroud)


Dre*_*lor 13

今天我发生了这件事,因为我将我的第一个功能分支合并为主人.正如一些人在SO的其他地方所说的那样,诀窍是在尝试删除分支之前切换回master.一旦回到master中,git很乐意在没有任何警告的情况下删除分支.

  • 看起来这不是这里的具体问题,但我遇到了你刚才描述的问题,谢谢! (7认同)

Elt*_*lab 12

带解释的最简单解决方案(双重检查解决方案)(之前遇到过问题)

问题是:

1-我无法删除分支

2- 终端不断显示一条警告消息,指出有些提交尚未批准

3- 知道我检查了 master 和 branch 并且它们是相同的(最新)

解决方案:

git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name
Run Code Online (Sandbox Code Playgroud)

解释:

当您的分支连接到上游远程分支(在 Github、bitbucket 或其他任何地方)时,您需要将其合并(推送)到 master 中,并且您需要将新更改(提交)推送到远程存储库(Github、bitbucket 或无论如何)来自分支机构,

我在代码中所做的是切换到 master,然后将分支合并到其中(以确保它们在本地机器上相同),然后我再次切换到分支并将更新或更改推送到远程在线使用“git push”的回购。

之后又切换到master,尝试删除分支,问题(警告信息)消失,分支删除成功


小智 5

你可以简单地算出:

git log --cherry master...实验性的

--cherry选项是同义词--right-only --cherry-mark --no-merges

git-log 手册页说

将输出限制为我们这边的提交并使用 git log --cherry upper...mybranch 标记那些已应用于分叉历史记录另一侧的输出很有用,类似于 gitcherryupstreammybranch。

供参考。--cherry-pick省略了等效的提交,但--cherry-marks没有。找到变基并强制上游和协同工作公共分支之间的更新更改很有用


tro*_*ore 5

Git 警告您删除此分支可能会丢失历史记录。尽管它实际上不会立即删除任何提交,但如果分支上的部分或全部提交也不属于其他分支,则它们将变得无法访问。

\n\n

对于experiment要 \xe2\x80\x9c 完全合并 \xe2\x80\x9d 到另一个分支的分支,其尖端提交必须是另一个分支 \xe2\x80\x99s 尖端的祖先,使提交成为experiment另一个分支的子集分支。这使得删除变得安全experiment,因为它的所有提交都将通过另一个分支保留在存储库历史记录中。它必须被 \xe2\x80\x9cfully\xe2\x80\x9d 合并,因为它可能已经被合并了几次,但现在自上次合并以来添加了不包含在其他分支中的提交。

\n\n

不过,Git 不会检查存储库中的每个其他分支;只有两个:

\n\n
    \n
  1. 当前分支(HEAD)
  2. \n
  3. 上游分支,如果有的话
  4. \n
\n\n

正如您的情况一样,的 \xe2\x80\x9cupstream 分支\xe2\x80\x9dexperiment可能是origin/experiment。如果experiment完全合并到当前分支中,Git 会毫无怨言地删除它。如果不是,但它已完全合并到其上游分支中,则 Git 会继续显示如下警告:

\n\n
warning: deleting branch 'experiment' that has been merged\nto 'refs/remotes/origin/experiment', but not yet merged to\nHEAD.\nDeleted branch experiment (was xxxxxxxx).\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中xxxxxxxx表示提交 ID。在其上游完全合并表明提交已experiment被推送到原始存储库,因此即使您在这里丢失它们,它们至少可以保存在其他地方。

\n\n

由于 Git 不会检查其他分支,因此删除一个分支可能是安全的,因为您知道它已完全合并到另一个分支中;您可以使用-D指示的选项来执行此操作,或者先切换到该分支并让 Git 为您确认完全合并的状态。

\n

  • 这个答案是从这里抄袭的,没有归属http://chimera.labs.oreilly.com/books/1230000000561/ch05.html#branch-deletion (4认同)