如何将开发分支合并到master并忽略master中的更改?

问题描述 投票:0回答:3

以下情况:

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

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

  1. 通过使用开发中的更改来合并并解决合并冲突:不可能,因为 master 中也存在不会显示为合并冲突的更改
  2. 将开发分支重新设置为 master:不,不是真的,因为提交 d + e 仍然存在
  3. 只能工作但有点丑陋的解决方案:在 master 上创建一个“恢复”分支,恢复提交 d + e,将其合并到 master 分支,然后合并开发分支。

你有比3更漂亮的想法吗?

git merge rebase revert
3个回答
4
投票

我同意Nikola的回答中的建议:更一般的解决方案是您应该还原

master
上的提交,然后合并到
develop
。如果您的团队愿意这样做,那么将
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
并且这会合并到提交中而没有相应的更改。我会认为这是异常的,如果你这样做,我建议在合并提交消息中使用详细的注释来解释你这样做的原因。

如果您只有一些提交需要还原,我建议将它们全部还原,因为从读者的角度来看,历史跟踪更清晰、更容易。


2
投票

我说,如果提交已经在远程并且其他开发人员已经拉取了它们,那么 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

0
投票

策略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
之间的每次提交获得一次恢复提交。

© www.soinside.com 2019 - 2024. All rights reserved.