繁体   English   中英

恢复合并到主,保持功能分支的变化,不改变历史

[英]revert merge to master, keep feature branch changes, without changing history

我有一个功能分支和一个主分支。 我对该功能做了一些工作,合并到 master 中,推送更改,然后远程和本地删除功能分支。 到现在为止还挺好。

合并后,我意识到我的功能更改存在问题。 我想撤消对 master 的合并,但仍保留功能更改,以便我可以再次处理它们。 我不想重写master的历史,因为其他人也在努力。 我认为我最好的选择是使用revert进行新的提交来解决问题?

我原来的:

A---B---C---D   [master]
     \      
      E----F    [feature]

我现在所拥有的:

A---B---C---D---E'---F' [master]

我想要的是:

A---B---C---D---E'---F'---RE'---RF'        [master]
                                 \
                                  E"---F"  [feature]

RE' 还原 E',RF' 还原 F'。 同时E”包含与原始E相同的内容,F”包含与原始F相同的内容。

我该如何实现?

同样,有很多方法可以做到这一点。 考虑到您想要的最终状态,这是我最喜欢使用的命令序列 - 它最终只是与您绘制的头发不同:

  1. git checkout master如果需要,然后git revert HEAD~2..HEAD得到:

     A--B--C--D--E'--F'--RF'--RE' <-- master (HEAD)

    请注意,带有范围的git revert以相反的顺序提交。

  2. git checkout -b feature

     A--B--C--D--E'--F'--RF'--RE' <-- master, feature (HEAD)
  3. git cherry-pick HEAD~4..HEAD~2 ,再次复制E--F

     A--B--C--D--E'--F'--RF'--RE' <-- master \\ E"--F" <-- feature (HEAD)

如果它有帮助——使用更长的提交链,它可能——你可以为各种提交添加临时标签。 例如,如果您从以下内容开始:

A--B--C--D--E'--F'   <-- master

并运行:

git tag T1 HEAD~2; git tag T2 HEAD

你得到:

        T1     T2
         |      |
         v      v
A--B--C--D--E'--F'   <-- master

所以现在你可以在任何地方使用T1..T2来表示“提交E'F' ,这样 revert 命令变成:

git revert T1..T2

樱桃选择变成:

git cherry-pick T1..T2

完成后,您可以删除两个临时标签:

git tag -d T1 T2

因为他们只是在那里记住两个特定提交的哈希 ID,这些提交划定了“有趣”提交的范围。 相对名称( HEAD~2..HEADmaster~2..master )随着您添加更多提交并导致名称移动而更改其编号。

我会:

  1. 将还原提交添加到master
git checkout master
git revert HEAD~2..HEAD
git push
  1. 重新创建feature分支
git checkout -b feature
  1. 樱桃挑选feature提交
git cherry-pick HEAD~4..HEAD~2
git push

你可以做

# make sure you're working from master
git checkout master

# revert commits E and F
# (but in reverse chronological order is better to avoid unnecessary conflicts)
git revert F E

此时你的树看起来像

A---B---C---D---E---F---F'---E'        [master]

# then create your new branch
git checkout -b feature

# and here you might as well revert the reverts
git revert E' F'

最终获得

A---B---C---D---E---F---F'---E'        [master]
                              \
                               E''---F''   [feature]

但是我建议在第一次还原期间使用-nEF进行分组(然后您必须在之后提交),在下一阶段还原还原会更容易,并且历史记录将更具可读性。 像这样 :

git checkout master
git revert -n F E
# (at this point, if you had to resolve conflicts, don't forget to add them)
git commit
git checkout -b feature
git revert E'

最后一棵树:

A---B---C---D---E---F---E'        [master]
                         \
                          E''     [feature]

(其中最后一个模式E'EF的还原)

仅当您对整个情况感到满意时才推动所有这些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM