我的提交历史如下:
* 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。我已经做了以下步骤:
输入
$ git rebase -i bffd858
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.
#
我已将'pick'替换为'edit'
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
我已经应用了我的错误修复并输入了
$ git commit -a --amend
键入
git rebase --continue
然后我在“8cd26ba”(最后提交)中找到了我的错误修复程序!
我做错了什么?
答案 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.
#
然后保存并关闭文件。
通常,应用错误修复和更正历史记录的最简单方法是:
git commit --fixup=bffd858
,git rebase --interactive --autosquash bffd858~1
进行rebase,然后您的原始提交将使用修补程序进行修补。
在您的情况下,您只进行了一次带有单个提交的rebase,然后进行了修改。 rebase部分,只是在您提交修复程序后将历史记录重新点击(即没有做任何事情)。
答案 1 :(得分:1)
我会这样做:
写一个合适的“修复提交”。
然后 - 保持原样。它有时候足够好。如果它全部发布,它确实是你唯一的好选择。
或者。做git rebase -i <commit to fix>^
- 比想要解决的问题早一个。然后编辑文件:向上移动“修复提交”,使其完全在您要修复的文件之后。然后将“pick”替换为“squash”以将修复应用于该提交并编辑提交消息或“fixup”以应用修复并保留消息原样。
答案 2 :(得分:0)
你完全得到了你的要求。您在thext中编辑了“历史服务器端”提交,而您之前说的是您想要的那个!
如果您之前从一个提交开始rebase并编辑实际预期的一个,那么该进程本身就会起作用。
但更方便的方法是让你的修复程序在顶部,用'Fixup'提交它! ',并最终从下来开始互动反叛。使用自动压缩是默认情况下,它会自动将todo列表移动到正确的位置并标记它们。 (类似于壁球!)。当然你可以手动编辑待办事项。
然后执行。如果某些内容没有达到预期的效果,这种方式更容易重现,编辑中的工作很容易丢失。
答案 3 :(得分:0)
我长时间愚蠢地做了以下事情,因为在工作中没有人告诉我,也找不到讨论这个问题的工作流程基础知识。我曾经做git rebase -i HEAD~#
将旧提交移动到HEAD,可能会修复冲突,执行提交修改,然后再次重新设置以将提交移回历史记录中的原始位置,从而可能再次修复冲突。工作但错误的答案。什么样的恶梦。我很惊讶http://git-scm.com没有讨论这个,它是如此基本。如果确实如此,我就错过了。
答案很简单:
git rebase -i HEAD~10
或者你需要走多远,这通常很好。如果您碰巧知道提交SHA,请使用@ aragaer上面的答案。squash
或fix
您的新提交。完成。