我有时会遇到这样一种情况:我需要在提交中修复一行代码而不再在分支的尖端。 (它是从顶部的第二或第三)。 我当然可以将最后一次或两次提交放在某个地方,修改有问题的提交,然后将这两个提交放回顶部,如果它,但我想知道是否有一个单击解决方案
1) SourceTree
2) git command line
因为我认为上面描述的整个hoopla-doopla有点乏味。
不言而喻,我说的是私有代码,功能分支,没有任何东西被推送到神圣的公司存储库,所以改变历史根本就不是问题。
任何帮助,想法?
答案 0 :(得分:7)
当我遇到这种情况时,我会使用git rebase -i
,例如,如果我想更改bad_commit:
git rebase -i bad_commit^
然后将结果列表中bad_commit的操作更改为e
或edit
。重新定位将停止此消息:
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
你可以自由地做出你想要的任何改变bad_commit。然后当你git rebase --continue
后面的提交将被适当地重新创建。
答案 1 :(得分:2)
从命令行,如果要修改第二次提交中的内容:
git rebase -i HEAD~2
将第一行从pick
更改为edit
,并按照常规程序进行操作。
请注意,这实际上是通过交互式rebase脚本进行新提交,并且通过您调用它来执行“hoopla-doopla”;它只是为你自动完成它(这就是计算机的用途,对吧?:-))。
如果你有一个非常新的提交链,或者到达很远的地方,那么(例如)HEAD~7
(或者你需要走多远)就会带你到根提交,你可能需要使用:
git rebase -i --root
相反(但是如果你要回到很远的地方,你可能需要注意跨合并的变基;请参阅rebase文档)。
答案 2 :(得分:1)
这是一个“修复”。它不是一键式解决方案,而只是两个命令。基本上,您使用
提交更改git commit --fixup=<commit that should have included this change> ...
此新提交将有一个标记,其注释以fixup! ...
开头。
然后做一个
git rebase -i --autosquash
并且rebase将自动设置rebase指令,因此fixup commit在目标提交后移动到右边并标记为'fixup',以便rebase将两个提交合并在一起。
一件好事是,您可以等到以后再进行rebase / autosquash,这样您就可以专注于当前的工作。你甚至可以收集一些并立即自动将它们全部装好。
如果您经常忘记--autosquash
选项,则可以自动设置
git config rebase.autosquash true
但是@torek注意到最近对autosquash功能进行了错误修复,他建议使用rebase.autosquash时要小心,除非你至少使用1.7.10.5或1.8.4。
===
--fixup=<commit>
Construct a commit message for use with rebase --autosquash.
The commit message will be the subject line from the specified
commit with a prefix of "fixup! ". See git-rebase(1) for details.
--squash=<commit>
Construct a commit message for use with rebase --autosquash.
The commit message subject line is taken from the specified commit
with a prefix of "squash! ". Can be used with additional commit
message options (-m/-c/-C/-F). See git-rebase(1) for details.
--autosquash
--no-autosquash
When the commit log message begins with "squash! ..."
(or "fixup! ..."), and there is a commit whose title
begins with the same ..., automatically modify the todo
list of rebase -i so that the commit marked for squashing
comes right after the commit to be modified, and change
the action of the moved commit from pick to squash (or fixup).
Ignores subsequent "fixup! " or "squash! " after the first,
in case you referred to an earlier fixup/squash with git
commit --fixup/--squash.