如何将一个开发分支合并到master中,而忽略master中的变化?

How to merge a development branch into the master and ignore the changes in the master?

以下情况:

我在开发分支中做了一些更改(commit f + g)。不幸的是,master 分支中有一些更改(commit e + d),现在已经过时,必须忽略。所以,我正在寻找一种解决方案,将开发分支合并到主分支中,并忽略提交 e 和 d。

到目前为止,我有以下想法:

  1. 使用 develop 中的更改合并并解决合并冲突:不可能,因为 master 中也有不会显示为合并冲突的更改
  2. Rebase develop 分支到 master:不,不是真的,因为提交 d + e 仍然存在
  3. 唯一可行但有点丑陋的解决方案:在 master 上创建一个“还原”分支,还原提交 d + e,将其合并到 master 分支,然后合并 develop 分支。

你有比though 3更美的点子吗?

我说 3 将是唯一可接受的解决方案,如果提交已经在远程并且其他开发人员已将它们拉走。如果有人已经取消了历史记录,则您不应该更改它。如果没有,您可以将 master 重置为早期状态并强制推送(仅当没有其他人使用它时):

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

我同意 中的建议:更 一般 解决方案是你应该还原 master 上的提交,然后合并到 [=12] =].如果您的团队愿意,将 master 重置回这些提交之前也很有效。

还有一个选择,就是将master合并到develop中,忽略master带来的变化。但这只有在满足某些条件时才应考虑:

  1. 您有太多的提交需要还原,因此将它们全部还原会很麻烦。请注意,如果提交是在 master 的合并提交下引入的,您可以简单地还原合并提交,但是,只有在您希望还原该合并引入的所有提交时才能这样做。
  2. 您希望忽略 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,这会合并到提交中而没有相应的更改。我会认为这是不正常的,如果您这样做,我建议您在合并提交消息中使用详细说明来解释您这样做的原因。

如果您只有少数提交需要还原,我建议您将它们全部还原,因为从 reader 的角度来看,它更清晰,更容易从历史上遵循。