如何撤销另一个开发者对主分支的 Git 推送?

3
这似乎经常发生,但我找不到答案。 发生了什么: 另一个开发人员在他们的本地服务器上使用git merge命令将一个分支与主分支合并,导致冲突。然后使用git add命令添加了这些冲突,接着进行了git commitgit push操作,将更改和冲突推送到主分支。于是他就扬长而去了。 问题: 有没有办法让我撤销上一个冲突的提交,这样我就可以推送我的代码更改到主分支并继续我的工作,让其他开发人员在他们的本地机器上修复冲突的代码?
我目前找到的答案: 我已经提交了我的本地更改,并将“冲突提交”拉到了我的本地服务器...
我所找到的两个选项是:
选项1:
git revert -m 1 <conflicted commit>

这将撤销由冲突提交所做的所有更改。但是,当其他开发人员进行git pull时,他们的所有更改都将被删除。对吗?
选项2:
git reset --hard <my commit>;
git push --force;

这将完全从git中删除有冲突的提交,就像它从未发生过一样(我不太喜欢这种方式)。但是现在其他开发人员的本地服务器将不同步。
你会怎么做?

这些冲突是否会主动引起痛苦,例如导致测试失败或行为回归?Git会在合并时告诉您是否存在冲突,但只要解决得当,通常就不会有问题。 - Makoto
1
我会选择第二个选项。但是冲突的提交将不会完全被删除。它仍然存在于其他开发者的origin/master分支(直到pull/fetch),以及引用日志中(你的、他的、服务器的)。 - Gregg
你对第一个选项是正确的。如果你还原,其他开发人员的更改将被移除。选项2是可行的方法。在他的机器上,他的本地将超前于从服务器提交的更改。如果他再次进行拉取操作,更改将再次合并,导致冲突,就像之前一样,他需要再次解决冲突。 - Vishwanath
@makoto的网站出了问题。 - user3627605
@Vishwanath 谢谢,我选择了第二个选项。这是我第一次这样做。希望其他开发人员不需要太多帮助就能重新回到轨道上。 - user3627605
3个回答

3
如果你只想撤销一个提交,最安全的修复方式是使用第一种选项:
git revert -m 1 <冲突提交> 总的来说,在远程仓库上使用 git reset 对任何提交进行操作都是危险的。如果有人自从这些更改被推送以来克隆了仓库并进行了自己的更改,当他们尝试使用 git pull 同步时,就会遇到麻烦。存在一个“孤立的提交”和一个“悬空的头部”。虽然这两个问题都可以通过时间解决,但如果可以通过简单的 git revert 解决问题,就没有理由陷入这种麻烦中。

0

也许在这里最简单的解决方案是最好的 - 特别是如果没有进行其他更改。只需对他推送之前的提交执行 git checkout,然后重新提交这些文件,将仍然保留其他开发人员所做的历史记录,同时解决您在冲突状态下遇到的问题。然而,这种方法的一个缺点是它会在您的存储库中留下有冲突/无法编译的代码。


@tcmarch 谢谢,那么在这种情况下 git checkout 和 git revert 有什么不同?除了新文件不会被删除,它们基本上是一样的吗? - user3627605
“checkout”与“revert”的区别在于哪些更改被保留。“revert”将从所选提交中删除更改,而“checkout”将获取所选提交时的存储库状态。在您的情况下,由于您想要将“HEAD”放置在错误代码之前仅提交了一个更改,“checkout”(对您来说很熟悉)是一个非常可行的选择。“revert”可能通常会是更好的选择,除非您经常从服务器版本的存储库中删除最近的更改。希望这有所帮助! - tcmarsh

0

我认为你需要改进你的工作流程。允许每个人在服务器上更新主分支是不好且不安全的。此外,git push --force 太危险了,在团队合作中永远不应该在任何公共分支上使用。你可以允许将代码推送到非主分支。代码审查团队审核更改并通过 git mergegit cherry-pickgit rebasegit applygit am 等方式将提交合并到主分支。一旦提交到主分支,只能使用 git revert 撤销它。如果必要,开发人员可以使用 git pull --rebase 将本地更改与最新的主分支同步。他们也可以 git fetch 主分支并将自己的提交组织到其中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接