Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 删除合并的分支机构时,会出现“删除”;错误:分支X未完全合并…';_Git_Github_Merge - Fatal编程技术网

Git 删除合并的分支机构时,会出现“删除”;错误:分支X未完全合并…';

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,

我陷入了困境。我无法从其他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, 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

  • 我们建议删除的分行的上游名称是什么?(如果没有,请参见下文。)
  • 分支名称指向一个特定的提交(我们称之为T表示提示)。上游分支名称还指向一个特定的提交(称为提交U)

    他是你的祖先吗

  • 如果问题2的答案是肯定的(即T≤ U) ,则允许删除

    如果没有上游呢?嗯,这就是“1.7中的变化”的由来:最初的测试不是T≤ 而不是≤ 头。那个测试还在那里。现在,如果没有上游,则使用水头试验代替上游试验。同时,在一个“过渡期”中,当每个人都适应新的Git 1.7行为时,如果存在上游,您也可能会得到警告或额外的解释。这个警告甚至在Git2.10中仍然存在(几乎7年后的今天:这是一个非常长的过渡期!):

    (为了显示,我在这里修剪了一些代码):基本上,如果
    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