每当我想将最新提交修复到第二个最新提交时,我都会这样做
git rebase HEAD~2 -i
<replace pick with fixup on line 2>
有没有办法在自动脚本中执行此操作,而不受人为干扰?
我尝试过这个并不起作用:
git commit --fixup=HEAD
答案 0 :(得分:5)
git reset HEAD~1 --soft
git commit --amend --no-edit
或
git reset HEAD~2 --soft
git commit -C ORIG_HEAD^ --reset-author
或
head=`git log -1 --pretty=%H HEAD~1`
git reset HEAD~2 --hard
git merge --squash ORIG_HEAD
git commit -C $head --reset-author
或
head=`git log -1 --pretty=%h HEAD~1`
git reset HEAD~2 --hard
git cherry-pick -n HEAD..ORIG_HEAD
git commit -C $head --reset-author
第一个就足够了。其他三个只是为了好玩,在其他情况下可能会有用。
更新:第二个解释:
假设我们有A-B-C
作为最新的三次提交,而C
是头部。你想要的是将B
和C
压缩成一个重用B
提交消息的提交。
git reset HEAD~2 --soft
将HEAD
重置为A
,并将B
和C
的更改保留在索引和工作树中。然后,以下git commit
创建一个提交,其中包含索引中的更改,即B
和C
的更改。
顾名思义,ORIG_HEAD
指向原始头部,在这种情况下是最后一次重置之前的头部,C
。 ORIG_HEAD^
表示ORIG_HEAD
的第一个父级,即B
。 -C ORIG_HEAD^
表示重用B
的提交消息而不进行编辑。
有关--soft,-C和--reset-author的更多信息。
答案 1 :(得分:2)
我还在寻找&#34;规范&#34;与Git本身的解决方案。
这是我的临时解决方案解决方法:
EDITOR="sed -i "2s/pick/fixup/'" git rebase -i HEAD~2
基本上只是用sed
替换了一个交互式文本编辑器。
答案 2 :(得分:2)
每次我想修复最新提交时,
这可以直接完成:
git commit --amend
旧提交:
git commit --fixup $commit
git rebase HEAD~n -i --autosquash
这将自动解释之前由(fixup)生成的fixup!
前缀(或手动)。
答案 3 :(得分:0)
这似乎对我来说是全自动的,并且不需要任何特定的阴影或任何东西:
git commit -a --fixup HEAD ; GIT_SEQUENCE_EDITOR=touch git rebase --interactive --autosquash HEAD~2