通过合并提交还原更改并稍后重新合并

Reverting changes by a merge commit and re merging later

我在 Branch X 工作,并从由其他开发人员维护的 Branch Y 接收交货。 我将 Y 合并到 X 中,但需要将 Y 中一些错误提交的更改还原到文件 'KKK' 并在他们修复该文件时继续处理其他更改。这导致我在分支 X 中对文件 'KKK' [我从不经常接触] 进行还原提交。这意味着 'KKK' 在我的分支中恢复为 'Version A',而在分支中继续工作Y.(见图)

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

我感觉这与 'fast forward merges' 有某种关系,但我不确定。 I have tried to visualize this here.

提前致谢。

当你还原某些东西时,这意味着 "I don't want this change, ever"(因为它被破坏了)。

合并分支时,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)。