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 分支没有被污染。我主要担心的是我希望主人干净。
问题:
- 如何返回到使 master 干净的提交?
- 有分支与污染的主同步。如何清理 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 -i
或 git 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,因为它会让其他人的生活变得非常困难。
问题陈述:
我有 2 个主要分支:master(PROD) 和 dev(UAT)。 每当我的团队收到应用程序的更改请求时,我们都会从 master 创建一个分支来进行更改,并且在将分支合并到 master 之前,我们会执行“git pull origin master”,因此我们的分支代码必须在与主代码同步。
2月初,我的同事将一个分支合并到master。但是这里的分支不是从 master 创建的。所以主人被污染了。我还原了更改,但还原不正确。我所做的是“git revert -m 2”。还原提交后,master 上有 3 个合并提交。
我有最后一个提交 ID,直到 master 分支没有被污染。我主要担心的是我希望主人干净。
问题:
- 如何返回到使 master 干净的提交?
- 有分支与污染的主同步。如何清理 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 -i
或 git 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,因为它会让其他人的生活变得非常困难。