以编程方式修复上一次提交到上一次

时间:2018-04-16 03:56:37

标签: git rebase fixup

每当我想将最新提交修复到第二个最新提交时,我都会这样做

git rebase HEAD~2 -i
<replace pick with fixup on line 2>

有没有办法在自动脚本中执行此操作,而不受人为干扰?

我尝试过这个并不起作用:

git commit --fixup=HEAD

4 个答案:

答案 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是头部。你想要的是将BC压缩成一个重用B提交消息的提交。

git reset HEAD~2 --softHEAD重置为A,并将BC的更改保留在索引和工作树中。然后,以下git commit创建一个提交,其中包含索引中的更改,即BC的更改。

顾名思义,ORIG_HEAD指向原始头部,在这种情况下是最后一次重置之前的头部,CORIG_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