我们可以将最新的提交压缩到特定的先前提交吗?

can we squash the latest commit to a specific previous commit?

例如,如果我们想将 HEAD 处的提交压缩为提交 HEAD~4,我们有一个选项可以通过

来完成
  1. 将提交从 HEAD 重置为 HEAD~3
  2. 构建一个临时提交,更改与我们的旧 HEAD 相同(比如,temp
  3. 隐藏其他 staged/unstaged 更改
  4. 用我们的旧 HEAD~4
  5. 压缩 temp
  6. 弹出我们隐藏的零钱
  7. 构建再次提交作为旧提交(HEAD~3HEAD)。

还有其他更快更方便的方法吗?

所以正如@jthill 建议的那样,git 存在一个 autosquash 选项。

例如,在我的例子中,让初始情况为,

$ git log --oneline --decorate
ddd4444 (HEAD, my-feature-branch) A fourth commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 (master) Old stuff on master

我现在要添加我想用 HEAD~4 压缩的最近更改 如:

$ git add .
$ git commit --fixup aaa1111
[my-feature-branch eee5555] fixup! A first commit

所以,我的历史现在看起来像:

$ git log --oneline --decorate
eee5555 (HEAD, my-feature-branch) fixup! A first commit
ddd4444 A fourth commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 (master) Old stuff on master

现在 $ git rebase --interactive --autosquash master 使用 autosquash 进行变基会自动选择提交,并在正确的位置提交 --fixup

在 rebase 并与提交消息编辑合并之后,您将成功完成提交 rebase!

就像变魔术一样! :)

来源:thoughtbot