通过子分支的不同提交在主分支上添加恢复的更改不会反映在主分支上

Posted

技术标签:

【中文标题】通过子分支的不同提交在主分支上添加恢复的更改不会反映在主分支上【英文标题】:Adding the reverted changes on master branch via different commit from child branch doesn't reflect on master 【发布时间】:2020-01-04 12:14:05 【问题描述】:

我有两个分支'master'和'child'。

我在子分支上添加了一个提交并将其合并到主分支。 我在主分支上恢复了这个提交(也分别在子分支上)。 我在子分支的第一次提交中添加了相同的更改(有点像revert of revert,但通过新提交添加为新更改)。 当我现在尝试将子节点合并到主节点时,它不会接受这些更改。

这是 git 应该如何工作的吗?

创建了一个测试存储库并复制了它以供参考。 大师(https://github.com/ashok-r/test_repo/tree/master), 孩子 (https://github.com/ashok-r/test_repo/tree/child)

在子节点上添加了一个提交(https://github.com/ashok-r/test_repo/commit/fc82cf72a1d284f4eea2354a80ba9bd55fd666d6)并将其合并到主节点。 在主分支和子分支上都恢复了这一点。 在子节点上再次添加了相同的更改 (https://github.com/ashok-r/test_repo/commit/184d08c0ebee1cd5bf88bb042695d45786af20a7) 将子节点合并到主节点 (https://github.com/ashok-r/test_repo/commit/174aad5b1672c32418d1f47c0f83f756fe94b40e),但未包含更改。

关于我们是如何遇到这个问题的背景知识。我们使用“master”分支作为稳定分支,其他分支用于开发。我们必须恢复提交(让我们将更改称为“A”)。我们没有在开发分支上进行并将其带到主分支上,而是在主分支本身上进行了恢复。几天后,我们在开发分支上添加了一个新的提交,其中包括那些恢复的更改('A')以及一些其他更改('B')。当我们将它合并到 master 上时,只会添加新的更改('B'),而之前恢复的更改('A')会被忽略。这是预期的行为吗?看到提交中的一些更改被添加而一些更改被忽略,这看起来很奇怪。

我知道直接在稳定分支上提交/恢复并不理想,但如果我们这样做了,那些确切的更改就不能通过另一个分支恢复?

【问题讨论】:

查看***.com/q/57744902/1256452中的链接 【参考方案1】:

是的,它应该是这样工作的。 我写了一篇关于类似案例的简短博客文章,解释了为什么它会这样工作。你可以在这里阅读https://adventuresinscm.wordpress.com/2019/08/25/merge-from-master-overrides-a-revert-commit/

简而言之,Git 基于一个共同的祖先(在您的示例中为 fc82cf72)执行 3 路合并。它考虑了主到 CA 和子到 CA 之间的差异。在您的情况下,子分支 (184d08c0) 的尖端到 CA 之间没有变化,因此从 Git 的角度来看 您正在合并一个没有变化的分支,因此它会跳过它并离开合并前的 master 内容。

【讨论】:

以上是关于通过子分支的不同提交在主分支上添加恢复的更改不会反映在主分支上的主要内容,如果未能解决你的问题,请参考以下文章

恢复旧的合并提交文件而不影响后续提交

从 GitHub.com 上的受保护分支恢复合并提交

Git在添加主存储库之前恢复主存储库后未删除子模块

sh 将所有未提交的更改移动到新分支,并将现有分支恢复为HEAD。“master”具有未提交的更改。你决定了

将推送的分支恢复为具体的提交

重新提交在 git 中恢复的提交