Git 删除合并的分支机构时,会出现“删除”;错误:分支X未完全合并…';
我陷入了困境。我无法从其他SO问题或阅读git文档中找到我的答案。我非常感谢你在这里的帮助 在Github上合并我的分支后,我从UI(远程)中删除我的分支。 我定期修剪我的本地分支:Git 删除合并的分支机构时,会出现“删除”;错误:分支X未完全合并…';,git,github,merge,Git,Github,Merge,我陷入了困境。我无法从其他SO问题或阅读git文档中找到我的答案。我非常感谢你在这里的帮助 在Github上合并我的分支后,我从UI(远程)中删除我的分支。 我定期修剪我的本地分支: git checkout master git pull origin master git fetch -p git branch -d X Error: error: The branch X is not fully merged. If you are sure you want to delete it,
git checkout master
git pull origin master
git fetch -p
git branch -d X
Error: error: The branch X is not fully merged. If you are sure you want to delete it, run 'git branch -D X'
分支X已合并。当我在
master
上执行git log
时,我可以看到来自X的提交。为什么会发生这种情况?我想使用-d
而不是-d
,因为这可能导致真正没有合并的分支被灾难性地删除 当提交的内容与要删除的分支的内容差异足够大时,就会发生这种情况。这可能是因为挤压提交或连接到前一个基的分支,然后它们被远程上的其他人合并
如果您确信这些更改实际上已经合并(如您所说),那么分支-D
是安全的
最后,
灾难性地删除分支
这是不真实的。删除分支不是一个可撤消的问题。所有操作都存储在git reflog
和分支指向的提交中,至少保留30天。如果你真的有妄想症,你可以改名这个分支。但实际上,只删除分支更容易
换句话说,分支只是一个指针。删除指针不会删除内容。因此,如果需要,您可以轻松地恢复分支。这里有几个不同的技巧 git branch-d(删除而不强制1)的关键问题不是“分支合并了吗?”,因为这个问题实际上是不可回答的。相反,问题是“分支是否合并到?” 这个测试在Git版本1.7(这意味着每个人今天都应该有它,但请检查您的Git版本)中被JUnito C Hamano更改: 分支-d:将“已合并”安全性建立在它合并的分支上 当一个分支被标记为与另一个引用合并时(例如,本地“下一个”引用) 使用“branch.next.merge”从源站的“next”合并并推回到源站的“next” 如果设置为“refs/heads/next”),则以“branch-d”为基础没有什么意义 安全,其目的是不丢失未合并到其他 分支,在当前分支上。更明智的做法是检查 与它合并的另一个分支合并 因此,如果您查看上述提交问题,您(或Git)必须回答两个或三个问题,以确定是否允许
-d
:
HEAD
解析为除我们在T≤ 测试,我们会得到不同的结果≤ 头比我们的T≤ U、 我们添加了额外的警告消息。(请注意,测试的第一部分是多余的:如果我们因为1.7版本之前的兼容性和缺少上游而与HEAD进行比较,那么如果我们再次与HEAD进行比较,我们将得到相同的结果。我们真正需要的是in_merge_base
测试。)
你怎么知道上游是什么?实际上,有一种简单的命令行方法可以找到:
$ git rev-parse --abbrev-ref master@{u}
origin/master
$ git rev-parse --symbolic-full-name master@{u}
refs/remotes/origin/master
--abbrev ref
变量提供Git的典型缩写版本,而--symbolic full name
提供完整的引用名称。如果在没有上游集的分支上运行,则两者都会失败。当然,您也可以使用git branch-vv
查看缩写的上游(对于所有分支)
如何测试整个T≤ 你喜欢什么?git merge base--is祖先命令对shell脚本执行此操作,因此:
$ git merge-base --is-ancestor master origin/master && echo yes || echo no
将告诉您master
是否是origin/master
的祖先(为此,“指向相同的提交”视为“是祖先”),即,这是非常相同的≤ 测试)
每当这个过渡期最终结束时,“use HEAD”测试可能会完全消失,或者可能会继续用于没有上游集的分支。然而,无论如何,问题总是“被删除的分支合并到了γ?”(填空),并且你必须看什么填充了空白。
上游上与您建议删除的分支上的提交相对应的提交必须(或至少在其历史记录中)具有相同的提交(按提交哈希ID),以便“合并到”测试成功。如果feature/X
通过所谓的“挤压合并”(虽然不是合并,但由merging2完成)合并到origin/develope
,则提交ID将不匹配,“合并到”测试将始终失败
1顺便说一句,从Git 2.3开始,您现在可以将
-force
添加到Git branch-d
,而不需要使用Git branch-d
,当然-d
仍然有效
2此处的区别在于“合并”-合并为
$ git merge-base --is-ancestor master origin/master && echo yes || echo no