Git:如何使用theirs策略进行rebase?

5
基本上,我只想(重新)设置一个特定提交(commit B)的父级(假设为提交A), 这是一些分支x的根提交。建议在这里的一个答案中通过嫁接来完成。我稍后会尝试,也许这是更好的方法。
然而,在阅读此文之前,我认为可以通过rebase实现。但是因为父提交AB略有不同,并且我只想保持整个分支x不变,只是将其根提交B的父级设置为A, 因此我认为可以使用theirs策略--但这似乎并不存在。我以前就遇到过这个问题(并认为这是Git安装中的错误或漏洞),通常都是通过切换分支并使用ours策略来解决。但是,使用rebase时,我在这种情况下被迫使用theirs策略。
我的命令如下:
git rebase -s theirs --onto A --root x x--rebased

虽然不完全符合您的需求,但有一些方法可以模拟“他们的策略”:https://dev59.com/GW445IYBdhLWcg3wWI6L#4912267 - VonC
1
@VonC:我想你不知道我的意思。我知道如何模拟它。问题是,这与“rebase”不兼容。 - Albert
1
这是为了让其他人了解“theirs”策略的一般情况,因此返回仅翻译的文本。 - VonC
2个回答

2

rebase并不适合你想要做的事情。另一位帖子的作者是正确的;你想要做的是设置一个嫁接点将B附加到A,然后运行git filter-branch将其融入提交中。这个确切用例的示例可以在git filter-branch手册中找到。


1
只是好奇:如果有“theirs”策略,那会有什么不同呢?如果这没有区别,为什么在这里使用rebase会有问题?但无论如何,这个问题不是关于如何实现,而是关于如何在rebase中使用“theirs”策略。如何实现,已经在另一个单独的问题这里中回答了。 - Albert
@Albert,rebase会将分支上的每个提交应用为一个补丁。这样可以使历史线性化,并可能引起合并冲突。如果您的历史记录没有父提交,则意味着您将面临新文件/新文件冲突,我怀疑采取take-theirs策略可能会完全清空序列中的第一个提交... - bdonlan
1
在重新定位时,双方的策略会互换,即他们的策略实际上是我们的策略。也就是说,第一个提交将完全保持原样。所有其他提交也是如此。 - Albert

2

我不是完全理解你的问题,但如果你的目标是从这个状态:

o C (X)
|
o B

o A

转换为:

o C' (X)
|
o B'
|
o A

那么git replace --graft B A应该可以实现你想要的效果。

注意,BB'具有相同的文件树,但由于它们的父提交不同,因此具有不同的提交哈希。同样,CC'也是如此。

为什么必须通过git replace --graft而不是git rebase -s theirs来完成,我不知道。可能是出于荒谬的原因

另请参见:这个答案,回答了Git嫁接和替换的区别?(嫁接现在已经被弃用了吗?)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接