【问题标题】: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 来说似乎并不重要,尽管您似乎可以提出这样的情况,因为它至少已合并到其他东西中,删除分支应该是可以接受的。

标签: git merge branch


【解决方案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是解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-24
      • 2015-10-02
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2017-06-21
      • 2012-10-16
      相关资源
      最近更新 更多