以下情况:
我在开发分支中做了一些更改(提交 f + g )。不幸的是,master 分支(提交 e + d)发生了一些变化,这些变化现在已经过时,必须被忽略。因此,我正在寻找一种解决方案,将开发分支合并到主分支并忽略提交 e 和 d。
到目前为止,我有以下想法:
你有比3更漂亮的想法吗?
我同意Nikola的回答中的建议:更一般的解决方案是您应该还原
master
上的提交,然后合并到develop
。如果您的团队愿意这样做,那么将 master
重置回这些提交之前也可以很好地发挥作用。
还有另一种选择,即将
master
合并到 develop
中,并忽略 master
带来的变化。但只有在满足某些条件时才应考虑:
master
上的合并提交下引入的,您可以简单地还原合并提交,但是,只有当您希望还原该合并引入的所有提交时,才可以执行此操作。master
上不在 develop
中的所有提交。 (如果情况并非如此,有一些解决方法,但您确实需要将所有希望忽略的提交组合在一起。)如果你想走这条路,命令是:
git switch develop
git pull --ff-only # Update your copy of develop and if it errors you're out of sync!
git merge origin/master --strategy=ours # ignore everything new on master
# now you can merge develop into master
注意
--strategy=ours
有时被写为 -s ours
并且这会合并到提交中而没有相应的更改。我会认为这是异常的,如果你这样做,我建议在合并提交消息中使用详细的注释来解释你这样做的原因。
如果您只有一些提交需要还原,我建议将它们全部还原,因为从读者的角度来看,历史跟踪更清晰、更容易。
我说,如果提交已经在远程并且其他开发人员已经拉取了它们,那么 3 将是唯一可接受的解决方案。如果有人已经拉取了历史记录,您不应该更改它。如果没有,您可以将主机重置为早期状态并强制推送(仅当没有其他人使用它时):
git checkout master
git branch master-backup //just in case
git reset --hard @~2 //(if there's only 2 bad commits, or just use the hash)
git merge develop
git push -f
策略3效果很好。只需在 master
上创建一个
single恢复提交,将 master“重置”回
c
处的状态,即在您的开发分支之前。然后您可以将 develop
合并到 master
而不会发生冲突。
git checkout master
git revert --no-commit c..HEAD # c here is the hash of commit c
git commit -m "Revert master to the state of develop branch base"
git merge develop
将
--no-commit
与 git revert
一起使用的原因是您可以将所有恢复集中到一个提交中。如果您在没有 --no-commit
的情况下进行恢复,则会保存 git commit -m "Revert master to the state of develop branch base"
,但代价是为 c..HEAD
之间的每次提交获得一次恢复提交。