【问题标题】:Reverting changes by a merge commit and re merging later通过合并提交恢复更改并稍后重新合并
【发布时间】:2020-10-04 21:52:54
【问题描述】:

我在 Branch X 工作,并从由其他开发人员维护的 Branch Y 接收交付。 我将 Y 合并到 X 中,但需要通过 Y 中的一些错误提交将更改恢复到文件“KKK”,并在修复该问题时继续处理其他更改。这会导致我在分支 X 中恢复提交文件“KKK”[我通常从未接触过]。这意味着“KKK”在我的分支中恢复为“版本 A”,而在分支 Y 中继续处理它。(见图.)

接下来,当“KKK”在“版本 I”变得更加成熟时,我再次将 Y 合并到 X,这一次期待“KKK”更新到“版本 I”。相反,git 在进行合并时会自动接受我的还原提交“版本 A”并忽略“版本 I”。该文件仍处于“版本 A”。为什么会这样?我的工作方式有问题吗?

我感觉这在某种程度上与“快进合并”有关,但我不确定。 I have tried to visualize this here.

提前致谢。

【问题讨论】:

    标签: git merge revert


    【解决方案1】:

    当你恢复某些东西时,它的意思是“我不想要这个改变,永远”(因为它被破坏了)。

    合并分支时,Git(或任何 DVCS)仅合并来自新提交的新更改。您还原的更改已经合并,因此不会重新合并(否则还原的全部意义将是徒劳的——SCM 怎么知道哪些还原是真正的还原,哪些不是?)。

    视觉上:

    A-B-M-C'--X-... <- branch a
       /     /
    C-D-----E--..   <- branch b
    

    随着提交C 引入更改并提交C' 恢复所述提交的更改。提交 MX 都是合并。当您第一次调用合并以创建提交 M 时,CD 的所有更改都包括在内。当您再次运行合并以提交X 时,只有E 的更改被合并,因为分支b 的所有其他更改已经存在于分支a 中。

    现在,如何将初始和后续更改放入分支a?重新恢复提交,换句话说,在再次合并分支 b 之前运行 git revert C'。这样,分支a 再次包含原始更改,然后再应用任何新更改(例如提交E)。

    【讨论】:

    • 感谢您的回复。在您绘制的提交树中,每个提交是否更改到同一个文件?
    • @AnshGandhi 这一事实与还原工作的方式是正交的。但是,是的,如果您还原仅涉及单个文件的提交,那么所有其他提交/更改仍将“正常”显示。但这对于这个讨论并不重要
    • 我会尝试改写-@knittl假设这些提交是对同一个文件,为什么git没有显示文件的版本C'和版本E之间的冲突,说明工作已经完成对两个分支中的文件都完成了吗?
    • @AnshGandhi 一种可能性是更改文件的不同部分。例如。提交C更改第21行,提交C'恢复第21行和提交E更改第42行。都触摸同一个文件,但不会有内容冲突。如果它们确实触及相同的线,那么您应该会发生冲突。你有 MWE 吗?
    • 对不起,无线电沉默,已经消失了。我和我的另一位同事讨论过这个问题,他说“git 不看文件,而是看内容。”这让我更清楚......所以在这种情况下,版本 X 实际上是 C' 和 E 内容更改的合并,对吗?如果是这样,那么您恢复还原的建议也是有道理的。抱歉,我没有“mwe”。才知道那是什么。好奇的问题 - 对于 git 不可读代码的文件怎么办,那么在合并 E 时它应该引发冲突吗? @knittl
    猜你喜欢
    • 2018-07-01
    • 2013-10-23
    • 2018-11-29
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多