为啥 git 不允许我安全地删除分支?

Posted

技术标签:

【中文标题】为啥 git 不允许我安全地删除分支?【英文标题】:Why doesn't git allow me to safely delete a branch?为什么 git 不允许我安全地删除分支? 【发布时间】:2012-09-11 19:46:03 【问题描述】:

我需要将两个分支——second 合并到 first 中,然后去掉 second。这是我所做的:

git cloned 项目以获得新副本 git checkout --track origin/second,做了一些修改,并提交了 git checkout --track origin/first,做了一些修改,并提交了 git merge second(git 说“递归合并”) git branch -d second

然后 git 说:

$ git branch -d second
warning: not deleting branch 'second' that is not yet merged to
         'refs/remotes/origin/second', even though it is merged to HEAD.
error: The branch 'second' is not fully merged.
If you are sure you want to delete it, run 'git branch -D second'.

为什么会这样?我以前从未在合并后收到此消息。合并工作得很好,没有冲突。如何安全地删除second 分支?

【问题讨论】:

git checkout second 后跟 git push origin second 让 git 停止抱怨,但我不明白为什么。 一个疯狂的猜测,但也许 git 抱怨你在删除之前没有将 second 推送到原点?还要确保您没有处于“分离 HEAD”状态 @knittl 是的,你似乎是对的,但是为什么 git 会关心我是否推了second 它不希望您对远程分支进行仅本地更改(尽管我自己从未见过该消息)。我将在源代码中挖掘以找到其背后的逻辑。 在这种情况下,它知道secondorigin/second 的跟踪分支,因此它想知道对second 所做的更改已被推送到origin。如果它不是一个跟踪分支,我认为它不会抱怨这一点。在这一点上,second 已在本地合并到 firstgit 来说似乎并不重要,尽管您似乎可以提出这样的情况,因为它至少已合并到其他东西中,删除分支应该是可以接受的。 【参考方案1】:

根据我的实验以及@knittl 和@twalberg 的 cmets,似乎 git 只是希望我在删除之前将更改推送到 second 分支。

我做到了:

$ git checkout second
$ git push origin second
$ git checkout first
$ git branch -d second

在没有警告的情况下工作。

【讨论】:

不会git branch -D second 也解决它还是危险的做法? @Bart 这取决于您所说的“解决它”是什么意思。这样做不会产生与我的解决方案相同的结果——origin 遥控器的状态会有所不同。 @Bart 只有在您知道自己在做什么时才应该使用。 Git 大多会给出有用的警告,所以最好不要强加于它。 @Bart 对于新用户(比如我)“推送来源”比强行删除分支更容易接受。【参考方案2】:

基本上,本地“第二”分支与远程“第二”分支不同步,git 不希望您丢失任何工作。

在这种情况下,更新不一定会丢失,因为它已经合并到“HEAD”。如果“HEAD”分支被推送到远程,应该没有问题。但是,如果“HEAD”有问题,你仍然有可能失去工作

总之,这只是一个额外的保证,随意强行删除。

【讨论】:

【参考方案3】:

我认为这实际上发生在您合并远程分支(即通过Pull Request)并删除远程分支时。

在我的实验中删除远程分支并在本地使用-dFIRST是解决方案。

【讨论】:

以上是关于为啥 git 不允许我安全地删除分支?的主要内容,如果未能解决你的问题,请参考以下文章

git:为啥我不能在壁球合并后删除我的分支?

切换分支时Git不删除文件

如何从 Git 主分支中间删除一些提交? [复制]

git:使用分支

github 强制删除历史记录

安全删除 TFS 分支项目