Git和“分支”x“未完全合并”错误

这是我从主分支使用的命令

git branch experiment git checkout experiment 

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

 git commit . git push -u origin experiment 

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

 git checkout master git merge experiment 

最后我把更改推送到GitHub。

 git push -u origin master 

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

 git branch -d experiment 

我得到错误消息error: The branch 'experiment' is not fully merged. 我对git有点新东西,我不知道我能把这两个分支合并在一起。 我在这里错过了什么?

注释为了响应这些内容,措辞发生了变化。 谢谢@slekse
这不是一个错误,这是一个警告。 这意味着您要删除的分支包含无法从其上游分支或HEAD(当前签出的修订版)中获取的提交。 换句话说,当你可能会失去承诺¹。

实际上,这意味着您可能已经修改,重新发布或过滤了提交,并且看起来不完全相同。

因此,您可以通过删除一个包含提交的分支来避免这个警告 ,通过删除那个分支来取消这个分支。²

你会想validation你实际上是不是没有错过任何重要的提交:

 git log --graph --left-right --cherry-pick --oneline master...experiment 

这将给你一个分支之间的任何非共享列表。 如果你有好奇心,可能会有一个不同--cherry-pick – 这种差异可能是你得到警告的原因:

--cherry-pick

当提交集合被限制为对称差异时,省略任何提交引入与“另一侧”上的另一个提交相同的更改的提交。 例如,如果你有两个分支,A和B,通常只列出所有提交的方法是–left-right,就​​像上面那个选项描述中的例子一样。 然而,它显示了从其他分支挑选的提交(例如,可以从分支A挑选“b上的第三个”)。 使用这个选项,这样的提交对从输出中排除。


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

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

正如Drew Taylor所指出的那样,使用-d进行分支删除时只考虑当前的 HEAD来确定分支是否“完全合并”。 即使分支与其他分支合并,也会抱怨。 在这方面,错误消息肯定会更清晰…您可以在删除之前检出合并的分支,也可以只使用git分支-D。 首都-D将完全覆盖支票。

我今天遇到了这种情况,因为我正在将我的第一个function分支合并到主控中。 正如一些人在SO的其他地方所说的,在试图删除分支之前,这个技巧就是切换回主人。 一旦回到master,git很乐意删除没有任何警告的分支。

我试过sehe的答案,它不起作用。

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

 git log oldbranch ^newbranch --no-merges 

Git警告你可能会通过删除这个分支而失去历史。 即使实际上不会立即删除任何提交,但是如果它们不属于其他分支,那么分支上的部分或全部提交将变得无法访问。

为了将分支experiment “完全合并”到另一个分支中,它的tip提交必须是另一个分支的提示的祖先,使experiment的提交成为另一个分支的一个子集。 这样可以安全地删除experiment ,因为所有提交都将通过其他分支保留在存储库历史logging中。 它必须被“完全”合并,因为它可能已经被合并了好几次了,但是现在有了自上次合并以来增加的未被包含在其他分支中的提交。

尽pipe如此,Git并不检查存储库中的所有其他分支。 只有两个:

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

实验的“上游分支”,如你的情况,可能是origin/experiment 。 如果experiment在当前分支中完全合并,那么Git会删除它,而不会投诉。 如果不是,但它完全合并在上游分支,那么Git会收到警告,如下所示:

 warning: deleting branch 'experiment' that has been merged to 'refs/remotes/origin/experiment', but not yet merged to HEAD. Deleted branch experiment (was xxxxxxxx). 

其中xxxxxxxx表示提交ID。 在其上游完全合并表明, experiment提交已经被推到原始库,所以即使你在这里失去了它们,它们至less可以被保存在其他地方。

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

要查看未合并的更改,请执行以下操作:

 git checkout experiment git merge --no-commit master git diff --cached 

注意:这显示了没有在experiment中的master变化。

不要忘记:

 git merge --abort 

当你看完了。

我在本地git上没有上游分支。 我从master,git checkout -b mybranch创build了一个本地分支。 我在上游的git上用bitbucket GUI创build了一个分支,并将我的本地分支(mybranch)推送到上游分支。 一旦我在我的本地git获取git获取上游分支,我可以做一个git分支-d mybranch。

你可以简单地弄清楚:

git log –cherry master …实验

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

git-log手册页说

限制输出到我们这边的提交是有用的,并且用git log –cherry upstream … mybranch标记已经应用到分叉历史的另一端的那些,类似于git cherry上游mybranch。

仅供参考。 – – – select省略等效提交,但 – – – – 标记不。 find重新设定和强制更新上游和合作公共分支之间的变化是有用的