gpt4 book ai didi

git - 强制git merge无法正常工作

转载 作者:太空狗 更新时间:2023-10-29 14:31:18 26 4
gpt4 key购买 nike

我的承诺树看起来像

---A---B---C   master
\
D-----E dev

我想将e合并到master上,以便主提交看起来与e完全相同:
---A---B--C--F   master
\ /
D-----E dev

所以f应该和e完全相同。
我所做的是:
> git checkout master
> git merge -X theirs E

生成f时没有错误消息,但是e和f之间有几个不同点。它们不一样,就像我需要它们一样。
我知道我可以合并并手动修复差异。但是,1)我真的需要e完全覆盖c,2)我不能搞砸了,所以用一些自动的方法来做这件事比手工做要好得多。
我做错了什么?我需要做什么改变?
更新:
> git merge -X theirs dev

也没用。同样的结果。

最佳答案

DR:你需要-s theirs不存在
不过,有几种替代品。请参阅此问题的其他答案,搜索stackoverflow以查找“git merge strategy their”,和/或仔细阅读Is there a "theirs" version of "git merge -s ours"?(因为原来的queryent实际上正在查找-X theirs,我在下面描述了这一点)。或者使用以下非常神奇的sh/bash脚本代码:

git merge --ff-only $(git commit-tree -p HEAD -p dev dev^{tree} -F /tmp/commitmsg)

将所需的提交消息放入文件 /tmp/commitmsg后。一定要确定这是你真正想做的,因为这几乎从来都不是。
说明
-X(扩展参数)和 ours并不意味着使用我们的版本或使用它们的版本。相反,他们的意思是,当发生冲突时,使用我们的变化或使用他们的变化。
这意味着什么
在您的示例中, theirs的提示是commit masterC的提示是commit dev。因此,如果当前分支是 E,则当前提交是 master。此时,将名称 C或commit dev的hash id传递给 E:都选择commit git merge作为要合并的commit。
在任何情况下,commit E都是合并基,因为从 AC同时向后跟踪到它们相遇的第一个点,就会到达commit E
因此, A将:
针对commit git merge的diff commit A:这是当前分支中发生的更改,即 C
diff commit ours与commit A:这是 E中的更改。
尝试合并这两个差异。
假设在所有三次提交中,其中一个文件名为 theirs。在commit animals.txt中,我们找到了一些关于猫和大象的台词。有更多的行(关于土豚,蝙蝠,狗,雀,沙鼠,仓鼠,鬣蜥,豺兔,等等,每一个字母的字母!)但我们暂时会把注意力集中在猫和大象身上…也在共享的史莱士身上。
在commit A中,有一个关于cats的新的或不同的声明。所以从 CA的差异显示了猫的这种变化。什鲁斯也有变化:
$ git diff <hash-of-A> <hash-of-C>
...
@@ ... @@
blah blah
-something about Cats
+something different about Cats
blah blah
@@ ... @@
etc
-the Shrew flies through the air, carefree
+the Shrew swims the ocean, carefree
etc

在commit A中,与 C相比,有一个新的或不同的关于大象的声明。因此, E-到- A的差异显示了大象的这种变化。什鲁斯有一个不同的、相互冲突的变化,我们将在这里省略除此之外的所有内容:
@@ ... @@
etc
-the Shrew flies through the air, carefree
+the Shrew eats rhinos, though it causes indigestion
etc

当git去合并这些更改时,它将从 A-to- E获取对cats的更改,并从 A-to- C获取对大象的更改。这些更改不会冲突,因此合并它们没有问题。但它也会看到关于什鲁斯的谎言的变化,这些变化相互冲突,不能合并。
A选项指示git选择冲突的一方或另一方
因为这里有冲突,git需要帮助解决合并。默认情况下,git只声明“存在冲突”,将这两个更改写入工作树,然后停止冲突,让您自己清理混乱。(在幕后还有很多事情可以帮助你解决冲突,但现在这些都无关紧要。)
不过,有了其中一个 E选项,git被告知要么选择我们的,要么选择他们的,然后继续前进。但这只会影响相互冲突的变化。Git仍然会像往常一样合并不冲突的更改:在上面的示例中,无论您选择哪个 -X更改,Git都会同时接受猫和大象的更改,而 -X只会选择要选择哪个悍妇的更改。
合并策略不同
有一个名为 -X的git合并策略,调用为 -X,它与 ours选项非常不同。这个策略告诉git根本不需要使用合并基,只需要保持源树不被“ours”提交。git将在根本不做任何工作来生成正确的合并之后,进行合并提交。其效果是“杀死”另一个分支,同时保留其提交;这允许您删除另一个分支名称,保留提交以备将来查看,同时声明您将不再使用它们(但显然不太确定:-)。
如果 git merge -s ours存在,它会做同样的事情,除了它会“杀死”当前分支而支持新的分支。有时候你想要这个,当他们出现的时候,如果git有 -X ours可能会很好,但是不管出于什么原因,它只有 git merge -s theirs
替代品工作,并且使用 git merge -s theirs的技巧允许你任意使用任意现有的源树连接到任意现有的提交,从而覆盖了 git merge -s ours(使用< cc>)和 git commit-tree。生成的commit对象没有名称,但它是 -s ourscommit的直接后代,因此 HEAD^{tree}会将其添加到当前分支。

关于git - 强制git merge无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46715637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com