git:如何从提交创建分支并恢复提交?

时间:2012-02-14 07:41:22

标签: git

我有这种情况:

  • 我创建了一系列提交并推送到中央存储库。其他人已经推动了他们自己的承诺。所以历史是(Myx是我的承诺,Ox是其他人的承诺):
master ...->My1-->My2-->O1-->O2
  • 现在我在我的提交中发现了一个严重的错误。我想创建一个分支并恢复我的提交。这创建了这个历史记录(Myx'是恢复提交,O3是其他人的提交):
master ...->My1-->My2-->O1-->O2--My1'-->My2'-->O3
                    \
                fix  \--

问题是如果我现在将master合并到fix,那么这将合并My1'和My2'这将修复修复中的代码,这不是我想要的。

处理这种情况的正确方法是什么?我目前的方法是挑选O1,O2,O3,但这听起来太手工了。容易出错,所以我在寻找是否有更好的方法(也许是创建分支的另一种方式&还原提交开始?)。我无法重写历史记录,因为所有内容都已存在于中央存储库中

更新:要强调的是,情况是该bug是一个阻止程序,无法轻松修复。该功能也不是可以在代码中切换的功能。因此,恢复master中的功能是使代码库恢复正常工作的必要条件。

3 个答案:

答案 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!