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

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有点陌生,我不知道我还能合并多少两个分支。我错过了什么?


当前回答

公认的答案是正确的。在这里,我想补充三点:

这是如何发生的(经常发生在我身上) 举个例子 如何确保在通过-D强制删除之前不遗漏任何更改

我在GitHub上使用Rebase和merge作为默认的PR合并方法。这将为相同的更改创建新的提交(哈希)。

例如,当我跑步的时候

git log --graph --left-right --oneline add-theme-dark-2...main

在我的一个项目中,我得到了这个:

> fba6fce (HEAD -> main, tag: v2.0.9, origin/main) Refactored to semantic class names.
> 4e665bc Refactored to semantic class names. (1a)
....
> 8bd13a6 Added 'font-semibold' to title.     (2a)
< 23f7b8a (add-theme-dark-2) Refactored to semantic class names.
< cf71814 Refactored to semantic class names.  (1b)
....
< d3a774a Added 'font-semibold' to title.      (2b)
(END)

注意1a/1b和2a/2b有不同的提交哈希值。

要确保您没有错过更改,请运行:

git log --graph --left-right --cherry-pick --oneline add-theme-dark-2...main

如果它返回一个列表,则每一行都以“=”开头:

= fba6fce (HEAD -> main, tag: v2.0.9, origin/main) Refactored to semantic class names.
= 4e665bc Refactored to semantic class names.
...
= 346770b Moved text size to component.
= 68cd471 Added theme-dark.
= 8bd13a6 Added 'font-semibold' to title.

使用以下命令可以安全地删除分支:

git branch -D add-theme-dark2

其他回答

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

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

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

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

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

查看没有合并的更改,我这样做:

git checkout experiment
git merge --no-commit master

git diff --cached

注:本图所示为master中未出现的变化。

别忘了:

git merge --abort

当你看完之后。