修改旧提交

时间:2013-06-27 08:55:32

标签: git

我的提交历史如下:

* 8cd26ba 2013-06-26 | history server-side (HEAD, noXHR)
* bffd858 2013-06-25 | popups and modals
* d95c5f4 2013-06-21 | Map update for new interaction
...

当我已经提交'8cd26ba'时,我发现了模态机制中的一个错误,并希望修复它。我试图修改'bffd858'(因为修复与它有关),因为它described here。我已经做了以下步骤:

  1. 输入

    $ git rebase -i bffd858
    
  2. git给我看(纳米)

    pick 6fa566b history server-side
    # Rebase bffd858..6fa566b onto bffd858
    #
    # Commands:
    #  p, pick = use commit
    #  r, reword = use commit, but edit the commit message
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #  f, fixup = like "squash", but discard this commit's log message
    #  x, exec = run command (the rest of the line) using shell
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    # However, if you remove everything, the rebase will be aborted.
    #
    
  3. 我已将'pick'替换为'edit'

  4. git说我:

    Stopped at 8cd26ba... history server-side
    You can amend the commit now, with
    
        git commit --amend
    
    Once you are satisfied with your changes, run
    
        git rebase --continue
    
  5. 我已经应用了我的错误修复并输入了

    $ git commit -a --amend
    
  6. 键入

    git rebase --continue
    
  7. 然后我在“8cd26ba”(最后提交)中找到了我的错误修复程序!

  8. 我做错了什么?

4 个答案:

答案 0 :(得分:5)

您的错误是,当您执行rebase时,您希望提供要修改的最早提交的父级的id。在您的情况下,您希望修改bffd858,其父级d95c5f4也称为bffd858^bffd858~1(我更喜欢最后一种语法,因为它适用于解释的shell ^作为特殊角色)。

你应该完成:

$ git rebase --interactive bffd858~1

并更改了文件,使其显示为:

pick bffd858 popups and modals
fixup 6fa566b history server-side
# Rebase bffd858..6fa566b onto bffd858
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

然后保存并关闭文件。

通常,应用错误修复和更正历史记录的最简单方法是:

  1. 在提交修复时使用git commit --fixup=bffd858
  2. 使用git rebase --interactive --autosquash bffd858~1进行rebase,
  3. 保存打开的文件,然后等待rebase完成。
  4. 然后您的原始提交将使用修补程序进行修补。

    在您的情况下,您只进行了一次带有单个提交的rebase,然后进行了修改。 rebase部分,只是在您提交修复程序后将历史记录重新点击(即没有做任何事情)。

答案 1 :(得分:1)

我会这样做:

写一个合适的“修复提交”。

然后 - 保持原样。它有时候足够好。如果它全部发布,它确实是你唯一的好选择。

或者。做git rebase -i <commit to fix>^ - 比想要解决的问题早一个。然后编辑文件:向上移动“修复提交”,使其完全在您要修复的文件之后。然后将“pick”替换为“squash”以将修复应用于该提交并编辑提交消息或“fixup”以应用修复并保留消息原样。

答案 2 :(得分:0)

你完全得到了你的要求。您在thext中编辑了“历史服务器端”提交,而您之前说的是您想要的那个!

如果您之前从一个提交开始rebase并编辑实际预期的一个,那么该进程本身就会起作用。

但更方便的方法是让你的修复程序在顶部,用'Fixup'提交它! ',并最终从下来开始互动反叛。使用自动压缩是默认情况下,它会自动将todo列表移动到正确的位置并标记它们。 (类似于壁球!)。当然你可以手动编辑待办事项。

然后执行。如果某些内容没有达到预期的效果,这种方式更容易重现,编辑中的工作很容易丢失。

答案 3 :(得分:0)

@aragaer回答了这个问题,但我想澄清一下外行。

我长时间愚蠢地做了以下事情,因为在工作中没有人告诉我,也找不到讨论这个问题的工作流程基础知识。我曾经做git rebase -i HEAD~#将旧提交移动到HEAD,可能会修复冲突,执行提交修改,然后再次重新设置以将提交移回历史记录中的原始位置,从而可能再次修复冲突。工作但错误的答案。什么样的恶梦。我很惊讶http://git-scm.com没有讨论这个,它是如此基本。如果确实如此,我就错过了。

答案很简单:

  1. 使用要应用于旧提交的更改进行新提交。
  2. git rebase -i HEAD~10或者你需要走多远,这通常很好。如果您碰巧知道提交SHA,请使用@ aragaer上面的答案。
  3. 将您的提交移到您希望用它压缩的旧提交的下方。
  4. 然后应用squashfix您的新提交。
  5. 完成。