commit --amend 和 Reset --soft 之间有什么区别

cra*_*ter 3 git

我的问题的想法是研究...和
之间的本质区别是什么commit --amendreset --soft

调查过程分步骤:

vim index.js > edit > save
git add index.js
git commit -m '...'
git push origin
Run Code Online (Sandbox Code Playgroud)

现在我需要重写之前发送的提交。为此,我应该使用:

vim index.js > edit > save
git add index.js
git commit --amend --no-edit
git push --force origin
Run Code Online (Sandbox Code Playgroud)

本质上,我还有另一个 SHA1,为了类比目录objects中的3 .git/objects,但git log显示了两个 SHA1,我完全同意它,因为提交已被修改。

让我们回顾一下。HEAD 指针代表文件的版本,而不是git commit --amend我执行了,编写一些代码并执行:git reset --soft HEAD~stage

git add index.js > git commit -m '...' > git push --force origin
Run Code Online (Sandbox Code Playgroud)

.git/objects 目录又包含一个 SHA1,但历史记录已用新的 SHA1 进行了修改。

所以我所说的命令git commit --amendgit reset --soft具有相同的行为

还是我不对?

Tim*_*sen 7

这两个命令都可以用来实现类似的最终目标,但它们做的事情不同。 git commit --amend使用阶段中的任何内容进行新的提交,并且该新的提交将替换分支的前一个 HEAD 的任何提交。

另一方面,git reset --soft将分支的 HEAD 指针移回一次提交,但保持阶段和工作目录不变。这会导致您的分支现在似乎位于上一个提交上,但您为生成旧 HEAD 提交所做的所有工作现在都显示为正在暂存。如果您现在更改工作目录中的内容,暂存这些更改并提交,您还将进行新的提交来替换旧的 HEAD,这与git commit --amend.

git reset --soft与相比(与说相同git reset --soft HEAD~1)的一个优点git commit --amend是前者可以在多个提交之间重置。如果您想重写分支中的最新 4 次提交,这会很有用。另一方面,git commit --amend这是一个单马表演,并且仅适用于 HEAD 提交。

  • @ElpieKay:当我注意到“git show”输出中存在拼写错误时,我经常使用“git commit --amend --no-edit”将快速的一行修复填充到提交中,以保留我之前的提交消息。 (2认同)