git commit --amend是如何工作的?

时间:2014-09-26 00:43:05

标签: git git-commit amend

我见过GIT commit --amend in detached HEAD state。这个问题要求答案比需要的要复杂得多。我想了解git commit --amend在正常HEAD情况下​​的工作原理。

3 个答案:

答案 0 :(得分:20)

假设您处于干净的工作状态,并且您的仓库看起来如下:

enter image description here

如果你再运行

git commit --amend

编写提交消息,保存并退出编辑器,发生以下情况:

  1. 您的暂存区域 - 如果您尚未暂存任何新更改,则与提交f42c5相同 - 用于创建新提交:31b8e。它的父母将与您正在修改的提交的那些(那些)相同:f42c5
  2. 移动master分支引用以指向新提交(31b8e)。
  3. HEAD引用跟随master
  4. enter image description here

    请注意,修改后的提交(f42c5)现在无法从您的仓库中的任何引用访问(因此我的图表上的“透明”样式)。它仍然存在于您的存储库的对象数据库中,但是当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}
    

    会让你遇到以下情况:

    enter image description here

    但现在,提交31b8e将无法访问。


答案 1 :(得分:5)

说你刚刚承诺" B"

... --- A --- B
              ^
              |
            master
             HEAD

修改" B"将创建一个并行提交,成为新的分支头。

        +---- B
        |
... --- A --- B'
              ^
              |
            master
             HEAD

B'是由B的变化加上您发出git commit --amend时所发生的变更的组合而产生的提交。

答案 2 :(得分:0)

据我所知,ammend因此起作用:

对于git commit --ammend工作,修改的更改必须是 Stagging Area(SA)

  1. 使git reset -- soft将上次提交(提交修改)中提交的更改带回SA并将索引移至上一次提交(提交之前提交修改)。一切都保持在使用git commit命令之前的状态。
  2. 它使git add包含要添加到新提交的所有文件(它将是 ammend commit )。要添加的文件是在git reset --soft到达之前进入SA的文件,重置后这些文件会保存到WD中,因此有必要将它们添加到SA以生成 ammend commit
  3. 进行git提交。它将生成一个新的提交,因此 ammend commit 的新id。为此,git commit --ammend不应与推送提交
  4. 一起使用

    如果您使用--no-edit,则会在 ammend commit 中重复使用该注释,否则您必须引入新注释(因为它是一个新提交,每次提交都需要注释)

    有关Stagging Area和Working Directory的更多信息,请参阅Reset Demystified