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并不检查存储库中的所有其他分支。 只有两个:
- 当前分支(HEAD)
- 上游分支,如果有的话
实验的“上游分支”,如你的情况,可能是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重新设定和强制更新上游和合作公共分支之间的变化是有用的