【发布时间】:2021-09-01 14:12:40
【问题描述】:
晚上好,
在我们的一个实习项目中,我们遇到了以下 git 问题。我们有两个分支,main 和 feat/smth,它们在开发过程中都出现了分歧。从feat/smth 到main 创建了一个拉取请求,显示了这些冲突。这些冲突是使用 GitHub 的图形工具解决的,基本上是执行从 main 到 feat/smth 的合并以解决冲突。此合并错误,导致文件损坏,暂时没有注意到。
因此,feat/smth 分支被合并(使用 GitHub 的拉取请求)到发现错误的main。为了恢复更改,学生们在 main 上的合并提交上运行了 git revert 并推送了所有这些更改。现在,问题是我们希望从我们的feat/smth 分支中获得更改并将它们“再次”合并到main。显然,这不起作用,因为提交已经合并,因此出现在 main 上。
假设我们不想强制推送,因为许多其他开发人员已经检查了代码并继续工作。我的第一个想法是使用git reset -m <commit_sha> 在本地恢复两个合并并重新执行合并。在合并期间,我从第一次合并尝试中“避免”了错误。我已经隐藏了文件,拉feat/smth 分支并应用了我的隐藏。使用这种方法,我们从合并中得到了正确的更改,但是分支上的所有其他更改都不再应用,因为它们仍然在主分支上恢复。我们feat/smth 分支的提交已经存在于main 上并且被还原。我们使用此尝试引入的唯一更改是来自合并的正确更改。
这就是我基本上被卡住的地方。为了撤消推送到 main 的合并并重新应用分支中的原始更改,正确的方法是什么?我的第一个想法是 cherry picks,尽管这可能会因为大量提交而变得很麻烦(并且可能导致很多合并冲突?)或者获取正确版本的“硬拷贝”分支,然后将它们复制粘贴到主分支上。但是,这也可能导致不需要的更改。如果已经对 main 进行了更改,后一种方法可能会变得棘手。作者必须仔细检查所有更改,并区分来自feat/smth 分支的更改和来自main 分支的更改。此外,copy paste 感觉它不是正确的“git 方式”。有任何想法吗?我真的不知道如何解决“git方式”。
我已经绘制了 git 历史图,也用于说明目的。
非常感谢!我很好奇这些方法。
【问题讨论】:
-
有一个著名的文件关于我认为是这个问题,你可能想看看:github.com/git/git/blob/master/Documentation/howto/…
标签: git merge git-merge revert git-revert