为啥 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 clone
d 项目以获得新副本
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
?
它不希望您对远程分支进行仅本地更改(尽管我自己从未见过该消息)。我将在源代码中挖掘以找到其背后的逻辑。
在这种情况下,它知道second
是origin/second
的跟踪分支,因此它想知道对second
所做的更改已被推送到origin
。如果它不是一个跟踪分支,我认为它不会抱怨这一点。在这一点上,second
已在本地合并到 first
对 git
来说似乎并不重要,尽管您似乎可以提出这样的情况,因为它至少已合并到其他东西中,删除分支应该是可以接受的。
【参考方案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
)并删除远程分支时。
在我的实验中不删除远程分支并在本地使用-d
FIRST是解决方案。
【讨论】:
以上是关于为啥 git 不允许我安全地删除分支?的主要内容,如果未能解决你的问题,请参考以下文章