以编程方式将最后一次提交修复为上一次

Programmatically fixup last commit into previous

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

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

有没有办法在自动脚本中执行此操作而无需人工干预?

我试过了,但没用:

git commit --fixup=HEAD

我仍在寻找 "canonical" 本身具有 Git 的解决方案。

这是我的临时解决方案解决方法:

EDITOR="sed -i "2s/pick/fixup/'" git rebase -i HEAD~2

基本上只是用 sed 替换了交互式文本编辑器。

Every time I want to fixup my latest commit,

这可以直接完成:

git commit --amend

年长的 提交:

git commit --fixup $commit
git rebase HEAD~n -i --autosquash

这将自动解释先前由 --fixup(或手动)生成的 fixup! 前缀。

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指向原始头,在本例中是上次重置前的头,即C。而ORIG_HEAD^表示ORIG_HEAD的第一个父级,即B-C ORIG_HEAD^ 表示重用 B 的提交消息而不进行编辑。

更多关于 --soft, -C and --reset-author

这似乎对我有用,全自动并且不需要任何特定的 sha 或任何东西:

git commit -a --fixup HEAD ; GIT_SEQUENCE_EDITOR=touch git rebase --interactive --autosquash HEAD~2