Sha*_*tin 11 git git-amend git-commit
我在独立的HEAD状态下看过GIT commit --amend.这个问题要求答案比需要的要复杂得多.我想了解git commit --amend在正常HEAD情况下的工作原理.
jub*_*0bs 23
假设您处于干净的工作状态,并且您的仓库看起来如下:

如果你然后运行
git commit --amend
Run Code Online (Sandbox Code Playgroud)
编写提交消息,保存并退出编辑器,发生以下情况:
f42c5- 用于创建新的提交:31b8e.它的父母将与你修改的提交的那些(那些)相同:f42c5.master(分支参考移到点到新的提交31b8e).HEAD参考如下master.
请注意,修改后的commit(f42c5)现在无法从repo中的任何引用访问(因此在我的图形中它是"透明"样式).它仍然存在于您的存储库的对象数据库中,但最终将被删除,当Git运行其定期内务处理时,或者如果您通过运行git gc(垃圾收集)显式触发它.
附录(基于Jason Baker的评论):请注意,只要修改后的提交f42c5仍然存在于您的仓库中,并且您有办法找到其提交ID(例如,通过从master分支机构的reflog中捕获它),你仍然可以检查出来.运行
git checkout master # just to be sure that master is the current branch
git reset --hard f42c5
Run Code Online (Sandbox Code Playgroud)
或者(假设您在此期间没有进行任何新的提交master,重置master或以其他方式移动master分支引用)
git checkout master # just to be sure that master is the current branch
git reset --hard master@{1}
Run Code Online (Sandbox Code Playgroud)
会让你处于以下情况:

但现在,提交31b8e将无法实现.
说你刚刚承诺"B"
... --- A --- B
^
|
master
HEAD
Run Code Online (Sandbox Code Playgroud)
修改"B"将创建一个并行提交,它将成为新的分支头.
+---- B
|
... --- A --- B'
^
|
master
HEAD
Run Code Online (Sandbox Code Playgroud)
B'是由B的变化加上您发布的变更组合而产生的提交git commit --amend.