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


294

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

git branch experiment
git checkout experiment

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

git commit . -m 'changed files'
git push -u origin experiment

后来,我决定将实验分支合并到master分支中。

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有点陌生,而且我不知道我可以合并两个分支还有多少。我在这里想念什么?


2
这篇文章对您有帮助吗?stackoverflow.com/questions/1710894/...
Chrisdigital

2
当我完成git commit --amend
Arcolye

12
另外-请注意,此消息将在以下位置出现squashstackoverflow.com/q/41946475/109941
Jim G.

我认为最常见的情况是,在本地删除分支之前,只需要提取新合并的更改即可。
RaisinBranCrunch

Answers:


313

注意更改措辞以响应此评论。谢谢@slekse
这不是一个错误,这是一个警告。这意味着您将要删除的分支包含无法从其上游分支或HEAD(当前签出的修订版)中的任何一个进行的提交。换句话说,当您可能会丢失提交¹。

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

因此,您可以通过删除另一个分支来检出包含确实要取消引用的提交的分支,从而避免发出警告。²

您将要验证您实际上是否没有丢失任何重要的提交:

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

这将为您提供分支之间任何非共享的列表。如果您好奇,可能会有一些不同,--cherry-pick并且这种不同很可能是您收到警告的原因:

--cherry-pick

当提交集受对称差异限制时,请忽略任何与“另一端”的另一次提交引入相同更改的提交。例如,如果您有两个分支A和B,则通常只使用--left-right列出所有提交的一侧,就像上面该选项说明中的示例一样。但是,它显示的是从另一个分支挑选的提交(例如,“ 3rd on b”可能是从分支A挑选的)。使用此选项,这样的提交对将从输出中排除。


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

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


24
谢谢。关键短语是“包含其他引用头无法达到的提交”。即使我不再需要实验分支,并且已经将其合并到master中,并计划将其从源中删除,但是git直到我将更改推送到源中后才会感到高兴。我猜这个警告是某种程度的健全性检查。
mellowsoon 2011年

35
-1“这意味着您将要删除的分支包含任何其他引用头都无法访问的提交。” 这是不正确的。该警告表示分支无法从其上游(如果有分支)或当前HEAD到达。请参见git-branch的联机帮助页。
sleske 2012年

3
@TachyonVortex尼斯链接。git branch -vv命令确实为我澄清了发生了什么。
杰森·梅西

11
@sleske感谢您的评论-这个答案应该进行编辑。很可惜,因为主要的解释性句子不正确,所以遭到了强烈谴责。我只是遇到了这个问题,花了很长时间烦人地试图找出问题所在,而这只是作为请求请求的一部分删除了远程跟踪分支,并且自从我从主服务器撤回更改以来在本地分支上。唯一的“问题”是找不到远程跟踪分支,该分支已被删除(出于同样的原因,我试图删除本地分支)。
2014年

3
是的,仅当您尝试删除本地分支时,如果您所在的分支与创建时所在的分支不在同一分支上,这可能会发生。“其他引用无法访问的提交”是不正确的,不必要的令人恐惧!
Amalgovinus 2015年

80

正如Drew Taylor指出的那样,使用-d删除分支仅在确定分支是否“完全合并” 时才考虑当前 HEAD。如果分支,它会抱怨,甚至与其他一些分支合并。在这方面,错误消息肯定会更清楚...您可以在删除前检出合并的分支,或者仅使用git branch -D。大写字母-D将完全覆盖支票。


2
有关当前HEAD的部分为我修复了该问题。我的主人不同于我创建了冲突分支的功能分支:D
viki.omega9,2015年

1
对于学习git的人来说,“当前”一词与“ HEAD”似乎是多余的吗?有作为uncurrent HEAD没有这样的事情-通过定义HEAD 当前分支。我想念什么吗?我想您可以说“当前分支”或“ HEAD”,但不能说“当前HEAD”。
Mark Lakata '17

有什么方法可以更改/配置(例如,是否始终对其进行检查origin/master?)我想origin/master首先进行检查并不太麻烦,但是感觉就像是一种怪异的流程-为什么我需要在origin/master本地进行检查只是为了您验证我的更改是否已合并?
亚历克

15

我尝试了sehe的答案,但没有成功。

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

git log feature-branch ^master --no-merges

14

今天,当我将我的第一个功能分支合并回master时,我发生了这种情况。正如某些人在SO上其他地方的线程中所说的那样,技巧是在尝试删除分支之前切换回master。再次回到master之后,git很高兴在没有任何警告的情况下删除了分支。


7
看起来这不是这里的具体问题,但是我遇到了您刚才描述的问题,所以谢谢!
Daniel Buckmaster 2012年

4

Git警告您删除该分支可能会丢失历史记录。即使它实际上并不会立即删除任何提交,但如果分支上的某些或所有提交也不属于其他分支的一部分,它们将变得不可访问。

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

但是,Git不会检查存储库中的所有其他分支。仅两个:

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

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为您确认完全合并的状态。


1
密钥是“在当前分支中完全合并”。我有一个X分支X'完全合并回X,并且已经删除了origin / X'。但是当Y签出后,我得到了这个警告。当我签出时,XI可以删除X'。我认为这很愚蠢。
劳伦斯·多尔

2
这个答案就是从这里剽窃不归属chimera.labs.oreilly.com/books/1230000000561/...
马克Lakata

3

要查看未合并的更改,我这样做:

git checkout experiment
git merge --no-commit master

git diff --cached

注意:此处显示的更改master不在中experiment

不要忘记:

git merge --abort

完成查找后。


完全是@IgorGanapolsky Dunno,尽管通常man git-reset和git reset命令足以从状态问题中恢复。
ThorSummoner

3

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

问题是:

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”进行回购。

之后,我再次切换到主服务器,并尝试删除分支,问题(警告消息)消失,分支成功删除


3

您可以简单地找出:

git log-樱桃大师...实验

--cherry option是的同义词 --right-only --cherry-mark --no-merges

git-log手册页说

将输出限制在我们这一边的提交并用git log --cherrystream ... mybranch标记已应用到派生历史的另一端的提交非常有用,类似于git cherry上游mybranch。

仅供参考。--cherry-pick省略等效的提交但--cherry-marks没有。查找基准并强制上游和协同工作的公共分支之间进行更新更改非常有用


1

我的本地git上没有上游分支。我已经从master git checkout -b mybranch创建了一个本地分支。我在上游git上使用bitbucket GUI创建了一个分支,并将本地分支(mybranch)推送到该上游分支。一旦我对本地git进行git提取以检索上游分支,就可以执行git branch -d mybranch了。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.