下面是我从主分支中使用的命令

git branch experiment
git checkout experiment

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

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

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

git checkout master
git merge experiment

最后,我把这些改动推到了GitHub上。

git push -u origin master

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

git branch -d experiment

我得到了错误信息:

错误:分支'experiment'没有完全合并。 如果你确定要删除它,运行'git branch -D experiment'。

我对git有点陌生,我不知道我还能合并多少两个分支。我错过了什么?


当前回答

如果你在Github上做了合并,看到下面的错误。在远程服务器识别本地的合并之前,您需要从远程服务器提取(获取并提交)更改。完成此操作后,Git将允许您删除分支,而不会提示错误。

错误:分支'x'没有完全合并。 如果你确定要删除它,运行'git branch -D 'x'。

其他回答

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

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

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

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

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

在你的例子中,实验的“上游分支”可能是origin/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。在上游完全合并表明实验中的提交已经被推到原始存储库,因此即使在这里丢失了它们,它们至少可以保存在其他地方。

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

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

我相信旗力才是你真正想要的。使用git branch -d——force <branch_name>强制删除分支即可。

正如Drew Taylor指出的那样,使用-d删除分支只考虑当前的HEAD来确定分支是否“完全合并”。即使分支与其他分支合并,它也会报错。在这方面,错误信息绝对可以更清楚…… 你可以在删除之前签出合并的分支,或者只是使用git branch -D。大写的-D将完全覆盖支票。