我有这种情况:
master ...->My1-->My2-->O1-->O2
master ...->My1-->My2-->O1-->O2--My1'-->My2'-->O3 \ fix \--
问题是如果我现在将master
合并到fix
,那么这将合并My1'和My2'这将修复修复中的代码,这不是我想要的。
处理这种情况的正确方法是什么?我目前的方法是挑选O1,O2,O3,但这听起来太手工了。容易出错,所以我在寻找是否有更好的方法(也许是创建分支的另一种方式&还原提交开始?)。我无法重写历史记录,因为所有内容都已存在于中央存储库中
更新:要强调的是,情况是该bug是一个阻止程序,无法轻松修复。该功能也不是可以在代码中切换的功能。因此,恢复master中的功能是使代码库恢复正常工作的必要条件。
答案 0 :(得分:0)
那么你可以做一个rebase并编辑bug发生的提交。如果它发生在My1并且你在O2那么你想要做:
git rebase -i HEAD~4
然后你会看到这样的东西:
pick 880606e My1
pick 9e84c00 My2
pick 17e4289 O1
pick 73b8f2e O2
# Rebase aab4d7f..73b8f2e onto aab4d7f
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
对于您要编辑的提交,请删除单词选择并将其替换为“e”或“edit”:
e 880606e My1
pick 9e84c00 My2
pick 17e4289 O1
pick 73b8f2e O2
# Rebase aab4d7f..73b8f2e onto aab4d7f
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
您将被退回到该提交中。修复错误,然后git add
新编辑的文件返回到提交,然后执行git commit --amend
。您可能想要更新提交消息。
我相信在修改之后,这一变化将自动继续。如果没有尝试git rebase --continue
。
然后,您可能需要使用更改后的代码解决后期提交中的冲突,但希望git可以自行对其进行排序。
然后你应该把它推回到中央仓库,其他人应该在下次拉动时获得更改。
警告:强>
我真的只推荐这个,如果只是在最新版本中修复它在您的环境中被认为是不可接受的。重新定位可能会变得棘手。在玩这样的游戏之前备份你的回购当然是可以的。如果在rebase期间的任何时候你觉得出现了问题,那么最好的(即最安全的)就是运行git rebase --abort
并重新开始。
答案 1 :(得分:0)
您说fix
上构建的My2
中的更改与My1'
和My2'
中的更改冲突。
首先要说的是:如果它会发生冲突,那么git会在合并操作期间检测到冲突,并让你有机会编辑冲突文件,以便保持正确的版本。
第二:即使合并提交没有按照您的意愿行事,您也可以更正代码,并在其上添加额外的提交。
最后:使用merge
选项致电--no-commit
。然后你可以检查合并是否正常运行,如果需要的话修复它,并提交批次 - 无需任何额外的提交。
如果合并已从文件path/file.ext
中的修补程序中删除了更改,则您始终可以使用
git checkout fix -- path/file.ext
答案 2 :(得分:-3)
只需检查文件并修复错误!
- Update-- 我不确定是否有人会在这里阅读我的解释,但也许会有一些人,我可能会回到0。
我不明白为什么我的建议太可怕了。大量开发人员的时间浪费在一些愚蠢的事情上,比如试图从源代码存储库中删除提交,因为你输入了一个bug。源代码存储库的重点是你可以看到你引入bug的地方,见什么是bug,现在你可以修复bug并继续前进。
为什么要将其从存储库中删除,这是历史记录。
不要浪费你的时间来修复回购。修复Bug!