以下是我在主分支中使用的命令
git branch experiment
git checkout experiment
然后我对我的文件进行了一些更改,提交了更改,并将新分支推送到GitHub。
git commit .
git push -u origin experiment
请注意,在git commit .
之后我被提示输入提交消息,并且我给了它一个。后来我决定将我的实验分支合并到主分支。
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有点新鲜,我不知道我有多可能合并这两个分支。我在这里缺少什么?
答案 0 :(得分:265)
注意根据通知更改了措辞。谢谢@slekse
这不是错误,而是一个警告。这意味着您要删除的分支包含以下任何一个都无法访问的提交:其上游分支或HEAD(当前已检出的修订版)。 换句话说,当你丢失提交时。
在实践中,这意味着您可能修改,重新设置或过滤了提交,并且它们似乎相同。
因此,你可以避免警告,方法是通过删除其他分支来检查包含你所提及的提交的分支 un-reference 。
您需要确认您确实没有遗漏任何重要提交:
git log --graph --left-right --cherry-pick --oneline master...experiment
这将为您提供分支之间任何非共享的列表。如果你很好奇,没有--cherry-pick
可能会有差异,这种差异很可能是你得到警告的原因:
--cherry-pick
当提交集受限于对称差异时,省略任何在“另一方”引入相同更改的提交。例如,如果您有两个分支A和B,通常只在一侧列出所有提交的方法是--left-right,就像上面该选项说明中的示例一样。然而,它显示了从另一个分支中挑选出来的提交(例如,“b上的第3个”可以从分支A中挑选出来)。使用此选项,这些提交对将从输出中排除。
¹默认情况下,他们真的只是在一段时间后才收集垃圾。此外,git-branch
命令不会检查所有分支的修订树。警告是为了避免明显的错误。
²(我的偏好是强制删除,但你可能想要额外的保证)。
答案 1 :(得分:71)
正如Drew Taylor指出的那样,使用-d删除分支仅考虑当前 HEAD来确定分支是否“完全合并”。即使分支 与其他分支合并,它也会抱怨。在这方面,错误信息肯定更清楚...... 您可以在删除之前签出合并的分支,或者只使用git branch -D。首都-D将完全覆盖支票。
答案 2 :(得分:13)
今天我发生了这件事,因为我正在将我的第一个功能分支合并为主人。正如一些人在SO的其他地方所说的那样,诀窍是在尝试删除分支之前切换回master。一旦回到master中,git很乐意在没有任何警告的情况下删除分支。
答案 3 :(得分:11)
我尝试了这些答案而且没有用。
要查找尚未合并的提交,只需使用:
git log oldbranch ^newbranch --no-merges
答案 4 :(得分:4)
Git警告您可能会因删除此分支而丢失历史记录。即使它实际上不会立即删除任何提交,但如果它们不属于其他分支,那么分支上的部分或全部提交将无法访问。
要使分支experiment
“完全合并”到另一个分支,其提示提交必须是另一个分支提示的祖先,使experiment
中的提交成为另一个分支的子集。这样可以安全地删除experiment
,因为它的所有提交都将通过另一个分支保留在存储库历史记录中。它必须“完全”合并,因为它可能已经多次合并,但现在已经添加了自上次合并以来未提及的其他分支中的提交。
experiment
的“上游分支”(如您所示)可能是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
中的提交已经被推送到原始存储库,因此即使你在这里丢失它们,它们至少可以保存在其他地方。
由于Git不检查其他分支,因此删除分支可能是安全的,因为您知道它已完全合并到另一个分支中;您可以使用指示的-D
选项执行此操作,或先切换到该分支,然后让Git为您确认完全合并的状态。
答案 5 :(得分:3)
要查看未合并的更改,我这样做了:
git checkout experiment
git merge --no-commit master
git diff --cached
注意:这会显示master
中不属于experiment
的更改。
不要忘记:
git merge --abort
当你完成了看。
答案 6 :(得分:1)
你可以简单地弄明白:
git log --cherry master ... experimental
- cherry选项是--right-only --cherry-mark --no-merges
的同义词git-log手册页说
将输出限制在我们这一侧的提交并将那些已经应用于分叉历史记录另一侧的标记用git log --cherry upstream ... mybranch标记,类似于git cherry upstream mybranch。 / p>
FYI。 --cherry-pick省略了等效的提交,但--cherry-marks没有。在上游和共同工作的公共分支之间找到rebase并强制更新更改是很有用的
答案 7 :(得分:1)
我的本地git上没有上游分支。我从master,git checkout -b mybranch创建了一个本地分支。我在上游git上创建了一个带有bitbucket GUI的分支,并将我的本地分支(mybranch)推送到该上游分支。一旦我在我的本地git上执行git获取以检索上游分支,我就可以做一个git branch -d mybranch。
答案 8 :(得分:1)
最简单的解决方案解释(双重检查解决方案)(之前遇到问题)
问题是:
1-我无法删除分支
2-终端会显示一条警告消息,指出有些提交尚未批准
3-知道我检查了主人和分支,他们是相同的(最新的)
溶液:
git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name
说明:
当你的分支连接到上游远程分支(在Github,bitbucket或其他)时,你需要将它合并(推送)到主服务器,你需要将新的更改(提交)推送到远程服务器(Github) ,bitbucket或其他)来自分支机构,
我在代码中所做的是我切换到master,然后将分支合并到其中(以确保它们在本地计算机上相同),然后我再次切换到分支并推送更新或使用" git push"。
更改远程在线仓库之后,我再次切换到主服务器,并尝试删除分支,问题(警告消息)消失,分支成功删除
答案 9 :(得分:0)
我相信标志--force
是您真正想要的。只需使用git branch -d --force <branch_name>
强行删除分支即可。
答案 10 :(得分:0)
C:\inetpub\wwwroot\ember-roomviewer>git branch -d guided-furniture
warning: not deleting branch 'guided-furniture' that is not yet merged to
'refs/remotes/origin/guided-furniture', even though it is merged to HEAD.
error: The branch 'guided-furniture' is not fully merged.
If you are sure you want to delete it, run 'git branch -D guided-furniture'.
对我来说,解决方案就是将功能分支推到远程。然后当我跑步时:
git push origin guided-furniture
/* You might need to fetch here */
git branch -d guided-furniture
Deleted branch guided-furniture (was 1813496).
答案 11 :(得分:0)
如果您在Github上进行了合并,并看到以下错误。您需要从远程服务器拉出(获取并提交)更改,然后才能在本地识别出合并。完成此操作后,Git将允许您删除分支而不给您错误。
错误:分支“ x”未完全合并。 如果确定要删除它,请运行'git branch -D'x'。