我见过GIT commit --amend in detached HEAD state了。这个问题要求答案比需要的更复杂。我想了解一下git commit --amend在正常的头部情况下是如何工作的。
发布于 2014-09-26 08:53:12
假设您处于干净的工作状态,并且您的存储库如下所示:

如果您随后运行
git commit --amend编写一条提交消息,保存并退出编辑器,将发生以下情况:
提交你的提交区域-如果你还没有提交任何新的更改,它将与用来创建一个新的提交的提交f42c5-is相同:31b8e。它的父级将与您正在修改的提交的父级相同:移动f42c5.
31b8e).
master.
后面的新提交master. master HEAD引用

请注意,修改后的提交(f42c5)现在不能从您的repo中的任何引用中访问(因此它在我的图中是“透明的”风格)。它仍然存在于存储库的对象数据库中,但最终将被永久删除,当Git运行其定期内务管理时,或者如果您通过运行git gc (垃圾收集)显式地触发它。
附录(基于Jason Baker's comment):请注意,只要修改后的提交f42c5仍然存在于您的存储库中,并且您有办法找出它的提交ID (例如,通过从master分支的reflog中获取它),您仍然可以检查它。正在运行
git checkout master # just to be sure that master is the current branch
git reset --hard f42c5或者(假设在此期间,您没有在master上进行任何新的提交,重置master,或者移动master分支引用)
git checkout master # just to be sure that master is the current branch
git reset --hard master@{1}会让你陷入如下境地:

但现在,提交31b8e将变得无法访问。
发布于 2014-09-26 08:46:54
假设你刚刚提交了"B“
... --- A --- B
^
|
master
HEAD修改"B“将创建一个并行提交,它将成为新的分支头。
+---- B
|
... --- A --- B'
^
|
master
HEADB‘是B中的更改加上您在发出git commit --amend时暂存的更改的组合所产生的提交。
发布于 2017-10-17 23:50:13
据我所知,amend的工作原理如下:
对于git commit --amend工程,需要修改的更改必须位于参差区(SA)中
git reset -- soft用于将在最后一次提交(提交到修改)中提交的更改带回SA,并将索引移动到前一次提交(提交之前修改)。一切保持在git commit命令被使用之前的样子。git add )。要添加的文件是那些在git reset --soft登陆之前已经进入SA的文件,在重置之后这些文件被keept到WD中,因此有必要将它们添加到SA以生成修正的commit.一起使用
如果你使用--no-edit,注释将在修改后的提交中被重用,否则你必须引入一个新的注释(因为它是一个新的提交,并且每次提交都需要一个注释)。
有关参差区和工作目录的详细信息,请参阅Reset Demystified
https://stackoverflow.com/questions/26050327
复制相似问题