【问题标题】:Git: how to use rebase with theirs strategyGit:如何在他们的策略中使用 rebase
【发布时间】:2011-05-22 14:10:59
【问题描述】:

基本上,我只想(重新)设置特定提交(提交B)的父级(假设提交A),这是某个分支x 的根提交。在其中一个答案中建议here 我可以通过移植来做到这一点。我稍后会尝试,也许这是更好的方法。

但是,在阅读本文之前,我认为这应该可以通过rebase 实现。但是因为父提交A 与B 有点不同,我只想保持整个分支x 的原样,只需将父提交设置为其根提交B,我想我可能会使用theirs 策略——似乎不存在。我之前偶然发现了这个(并认为这是一个错误或在我的 Git 安装中)并且总是通过切换分支和使用 ours 策略来解决。但是,使用rebase,在这种情况下我不得不使用theirs 策略。

我的命令如下:

git rebase -s theirs --onto A --root x x--rebased

【问题讨论】:

  • 不完全是您需要的,但有一些方法可以模拟“他们的策略”:stackoverflow.com/questions/4911794/…
  • @VonC:我想你不明白我的意思。我知道如何模拟它。问题是,这不能与 rebase 一起使用。
  • 因此“不完全是您需要的部分”。这是为了让其他人大致了解“他们的”策略。

标签: git rebase


【解决方案1】:

rebase 不是为你想做的事情而设计的。另一张海报是正确的;您要做的是设置一个嫁接以将 B 附加到 A,然后运行 ​​git filter-branch 将其烘焙到提交中。在git filter-branch manpage 中可以找到这个确切用例的示例。

【讨论】:

  • 只是古玩:如果有theirs 策略,那会有什么不同?如果这不会有所不同,为什么在这里使用rebase 会不好?但无论如何,这个问题不是关于如何实现这一目标,而是如何将theirs 策略与rebase 一起使用。如何实现这一点,这已经在另一个单独的问题here 中得到了回答。
  • @Albert,rebase 将分支上的每个提交作为补丁应用。这使历史线性化,并带来了合并冲突的可能性。如果你的历史没有父提交,这意味着你会有一个新文件/新文件冲突,我怀疑采取他们的策略可能最终只是完全清空序列中的第一个提交......
  • 在变基时双方互换,即他们的策略实际上是我们的策略。 IE。第一次提交将完全保持原样。以及所有其他提交。
【解决方案2】:

我不完全确定我理解你的问题,但如果你的目标是从这个出发:

o C (X)
|
o B

o A

到这里:

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

那么git replace --graft B A应该做你想做的事。

注意B 和 B' 具有相同的文件树,但由于其父提交不同,因此提交哈希值不同。同样C 和C'。

为什么这必须通过git replace --graft 而不是git rebase -s theirs 来完成,我不知道。大概是为了hysterical raisins。

另请参阅:this answer 至 How do git grafts and replace differ? (Are grafts now deprecated?)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2019-05-03
    • 2018-01-06
    • 2018-05-27
    • 2014-08-31
    • 2020-06-27
    • 2018-02-14
    相关资源
    最近更新 更多