`git rebase -i HEAD~N` 和 `git reset --soft HEAD~N` 有什么区别?

What is the difference between `git rebase -i HEAD~N` and `git reset --soft HEAD~N`?

我们可以压缩 Git 中的最后 N 个提交。据我了解,我们可以使用 or git reset --soft HEAD~N.

压缩最后 N 次提交

在这个问题 (Squash my last X commits together using Git) 的答案中,大多数 upvoted 答案建议使用 git reset --soft HEAD~N,但未被接受。接受的答案推荐 git rebase -i HEAD~N。因此我很困惑,最好使用哪个。

这些方法之间有何不同?推荐或安全使用哪一种?

git rebase -i 允许您以交互方式重新设定提交范围的基数 - 您可以选择要接受的提交、删除的提交、重新排序、在某个时间点手动干预,以及如您所述,压缩它们等。

git reset --soft 只是删除所有提交,保持索引不变。

你给出的两个命令都可以用来重写一个分支的历史。软重置选项:

git reset --soft HEAD~N

会将分支的 HEAD 指针移回 N 个提交,同时将这些提交中的工作放入阶段。如果您要从这一点开始提交,您将把这些提交压缩成一个 new 提交。

变基选项:

git rebase -i HEAD~N

将显示一个 window 显示之前的 N 次提交。在每一行上,对于每次提交,您可以选择选择(保留)、压缩、改写等。您 可以 通过选择 [=] 获得与上述软重置选项相同的结果12=] 对于有问题的提交。然而,交互式变基比这更强大。

使用哪种方法取决于操作的复杂程度。我们可能会将软重置视为一个穷人版本的交互式 rebase,后者是重型的。