Git:在同一操作中添加、提交和 rebase/squash

Git: add, commit and rebase/squash in same operation

我经常发现自己在功能分支上,提交了更改。然后,我发现我必须做出改变,所以我:

  1. 做出改变
  2. 使用 git add -A
  3. 将所有文件更改添加到索引
  4. 使用 git commit -m <commit message>
  5. 提交更改
  6. Rebase 更改并使用 git rebase -i HEAD~2 压缩最后两个提交,并压缩最新的提交,这样我最终得到 1 个提交

这是我常用的一个流程,但是感觉比较繁琐,需要手动操作。有没有更聪明的方法来做到这一点,或者更常见的是为这种任务创建 shell 函数或别名?我说的是第 2 步到第 4 步。

也许修改您刚刚对功能分支的 HEAD 提交的提交的最简单方法是 修改 通过以下方式提交的提交:

git commit --amend 'your commit message here'

Git commit amend 通过创建一个 new 提交来工作,功能上与旧提交相同,加上您的新更改,然后将旧的 HEAD 提交替换为新的。

请注意,这会重写历史记录,因此它不适用于您已经推送并且可能已经被其他人拉取的分支。但是在这方面它并不比你现在的变基方法差。

作为重型变基方法的替代方法,有一种更简单的方法来压缩分支的两个顶级提交。您可以进行软重置,然后进行提交:

git reset --soft HEAD~2
git commit -m 'made a small change to latest commit'

Git reset soft 通过将 HEAD 指针移回两次提交(在本例中)来工作,同时将工作目录和阶段保持原样。这实际上是将第一次提交中完成的工作,加上第二次补丁提交,放在第一次提交之前的提交之上。然后,当您提交这项工作时,您将有效地将所有内容压缩为一次提交。

但大多数时候我发现自己使用 commit amend 而不是 reset soft 来处理这种情况。