git如何提交 – 准确的工作?
我看到GIT提交 – 在分离HEAD状态下 。 这个问题要求答案比需要更复杂。 我想了解git commit --amend在正常情况下的工作方式。
假设你处于干净的工作状态,你的回购看起来如下:

如果你然后运行
git commit --amend
写一个提交信息,保存并退出你的编辑器,会发生以下情况:
- 你的暂存区域 – 如果你还没有进行任何新的更改,将与提交
f42c5相同 – 用于创build一个新的提交:31b8e。 它的父代将和你正在修改的那个(那些)一样:f42c5。 -
master分支引用被移动到指向新的提交(31b8e)。 -
HEAD参考跟随master。

请注意,修改后的提交( f42c5 )现在无法从您的f42c5任何参考(因此其graphics上的“透明”风格)无法访问。 它仍然存在于你的仓库的对象数据库中,但是当Git运行周期性的pipe理,或者如果你通过运行git gc (garbage collection)来明确地触发它时,它最终会被删除。
附录 (基于Jason Baker的评论 ):请注意,只要修改后的提交f42c5仍然存在于您的repo中,并且您有办法find它的提交ID(例如,通过将其从master分支的引用日志),你仍然可以检查出来。 运行
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将变得无法访问。
说你刚刚承诺“B”
... --- A --- B ^ | master HEAD
修改“B”将创build一个并行提交,成为新的分支头。
+---- B | ... --- A --- B' ^ | master HEAD
B'是由B的变化加上你在发出git commit --amend时已经上演的变化所产生的git commit --amend 。
据我所知,这样ammend工作是:
对于git commit --ammend作品,修改的修改必须放入Stagging Area(SA)
- 它使得
git reset -- soft将最后一次提交(提交给ammend)提交的更改带回到SA,并将索引移动到之前的提交(提交之前提交ammend)。 一切都保持之前,git commit命令被使用。 - 它使
git add所有文件添加到新的提交(这将是ammend的提交 )。 要添加的文件是在git reset --soft之前进入SA的文件git reset --soft已经登陆,重置后这些文件将进入WD,因此有必要将它们添加到SA中以生成受支持的提交 。 - 使混帐提交。 它将生成一个新的提交,并因此提供一个新的修改提交 ID。 为此,git commit –ammend不应该与推送提交一起使用
如果你使用--no-edit这个注释被重新使用,那么你必须引入一个新的注释(因为它是一个新的提交,每一个提交都需要注释)。
有关Stagging区域和工作目录的更多信息,请参阅Reset Demystified