如何将一个开发分支合并到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。
到目前为止,我有以下想法:
- 使用 develop 中的更改合并并解决合并冲突:不可能,因为 master 中也有不会显示为合并冲突的更改
- Rebase develop 分支到 master:不,不是真的,因为提交 d + e 仍然存在
- 唯一可行但有点丑陋的解决方案:在 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
带来的变化。但这只有在满足某些条件时才应考虑:
- 您有太多的提交需要还原,因此将它们全部还原会很麻烦。请注意,如果提交是在
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
,这会合并到提交中而没有相应的更改。我会认为这是不正常的,如果您这样做,我建议您在合并提交消息中使用详细说明来解释您这样做的原因。
如果您只有少数提交需要还原,我建议您将它们全部还原,因为从 reader 的角度来看,它更清晰,更容易从历史上遵循。
以下情况:
我在开发分支中做了一些更改(commit f + g)。不幸的是,master 分支中有一些更改(commit e + d),现在已经过时,必须忽略。所以,我正在寻找一种解决方案,将开发分支合并到主分支中,并忽略提交 e 和 d。
到目前为止,我有以下想法:
- 使用 develop 中的更改合并并解决合并冲突:不可能,因为 master 中也有不会显示为合并冲突的更改
- Rebase develop 分支到 master:不,不是真的,因为提交 d + e 仍然存在
- 唯一可行但有点丑陋的解决方案:在 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
带来的变化。但这只有在满足某些条件时才应考虑:
- 您有太多的提交需要还原,因此将它们全部还原会很麻烦。请注意,如果提交是在
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
,这会合并到提交中而没有相应的更改。我会认为这是不正常的,如果您这样做,我建议您在合并提交消息中使用详细说明来解释您这样做的原因。
如果您只有少数提交需要还原,我建议您将它们全部还原,因为从 reader 的角度来看,它更清晰,更容易从历史上遵循。