git如何提交 – 准确的工作?

我看到GIT提交 – 在分离HEAD状态下 。 这个问题要求答案比需要更复杂。 我想了解git commit --amend在正常情况下的工作方式。

假设你处于干净的工作状态,你的回购看起来如下:

在这里输入图像描述

如果你然后运行

 git commit --amend 

写一个提交信息,保存并退出你的编辑器,会发生以下情况:

  1. 你的暂存区域 – 如果你还没有进行任何新的更改,将与提交f42c5相同 – 用于创build一个新的提交: 31b8e 。 它的父代将和你正在修改的那个(那些)一样: f42c5
  2. master分支引用被移动到指向新的提交( 31b8e )。
  3. 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)

  1. 它使得git reset -- soft将最后一次提交(提交给ammend)提交的更改带回到SA,并将索引移动到之前的提交(提交之前提交ammend)。 一切都保持之前, git commit命令被使用。
  2. 它使git add所有文件添加到新的提交(这将是ammend的提交 )。 要添加的文件是在git reset --soft之前进入SA的文件git reset --soft已经登陆,重置后这些文件将进入WD,因此有必要将它们添加到SA中以生成受支持的提交
  3. 使混帐提交。 它将生成一个新的提交,并因此提供一个新的修改提交 ID。 为此,git commit –ammend不应该与推送提交一起使用

如果你使用--no-edit这个注释被重新使用,那么你必须引入一个新的注释(因为它是一个新的提交,每一个提交都需要注释)。

有关Stagging区域和工作目录的更多信息,请参阅Reset Demystified