Master 被污染,使 master 干净以及与被污染的 master 同步的干净分支

Master polluted, make master clean as well clean branch which are in sync with polluted master

问题陈述:

我有 2 个主要分支:master(PROD) 和 dev(UAT)。 每当我的团队收到应用程序的更改请求时,我们都会从 master 创建一个分支来进行更改,并且在将分支合并到 master 之前,我们会执行“git pull origin master”,因此我们的分支代码必须在与主代码同步。

2月初,我的同事将一个分支合并到master。但是这里的分支不是从 master 创建的。所以主人被污染了。我还原了更改,但还原不正确。我所做的是“git revert -m 2”。还原提交后,master 上有 3 个合并提交。

我有最后一个提交 ID,直到 master 分支没有被污染。我主要担心的是我希望主人干净。

问题:

  1. 如何返回到使 master 干净的提交?
  2. 有分支与污染的主同步。如何清理 master,使 master 的还原操作也适用于分支?

提前致谢。

PS: 我没有任何 GUI 工具。

如果你知道你想要的好点(比如good123),那么在本地回到原始状态的最简单方法是:

git checkout master
git reset --hard good123

这会让你的本地master在good123之后就好像什么都没有发生过一样。

如果您希望服务器 (origin/master) 处于相同状态,那么您需要“强制推送”。这很危险,因为它会覆盖远程状态,并迫使您的同行处理这种情况。请先确保您有备份。

git push -f origin

团队中的任何其他人都需要为他们的工作创建一个新分支(例如 mytask2),并 re-sync 使用这个更新后的母版。最好的方法取决于他们在“污染”状态之上做了多少工作。在最简单的情况下,他们在“污染”之前只有一次提交 mytaskcommit123 是做一个“樱桃采摘”:

git fetch origin
git checkout master
git reset --hard origin/master
git checkout -b mytask2
git cherry-pick mytaskcommit123

请注意,在 git 中没有单一的主控。每个开发者有 2 个 master 副本:

  • 本地 PC:master
  • 远程服务器:origin/master

因此每个开发人员都需要更新两者。在上面的脚本中,“fetch”更新远程脚本,“reset”更新本地脚本。

对于更复杂的情况,git rebase -igit reset --mixed 可能会有所帮助。

根据它的工作量,考虑保持被污染的历史原样,只恢复损坏的提交。

What I did was "git revert -m 2". After the revert commit, there are 3 merge commits on master.

首先,git revert 不会删除任何提交。这就是 git revert 的重点。因此,如果您抱怨合并提交仍然存在,那是正常的,您不应该抱怨它。

另一方面,您似乎下达了错误的命令。恢复合并提交以使传入分支对主线分支没有影响的方法是说

git revert -m 1 <SHA>

换句话说,你在应该说 -m 1 的时候说了 -m 2

此时你有两个选择。

  • 一种可能是先恢复不好的恢复,然后再进行良好的恢复。

  • 另一种可能性只是 reset --hard 回到错误合并之前的状态——但如果这是共享的,那是不受欢迎的 material,因为它会让其他人的生活变得非常困难。