修改工作,完全是?

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


假设您处于干净的工作状态,并且您的回购看起来如下所示:

在这里输入图像描述

如果你然后运行

git commit --amend

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

  • 您的暂存区 - 如果您尚未执行任何新更改,则与提交f42c5相同 - 用于创建新的提交: 31b8e 。 它的父代将与您正在修改的提交(那些)相同: f42c5
  • master分支引用被移动以指向新提交( 31b8e )。
  • HEAD参考跟随master
  • 在这里输入图像描述

    请注意,修改后的提交( f42c5 )现在无法从您的f42c5任何参考(因此其图形上的“透明”样式)无法访问。 它仍然存在于你的存储库的对象数据库中,但是当Git运行周期性的内务管理时,或者如果通过运行git gc (垃圾回收)显式触发它,它最终会被删除。


    附录 (基于Jason Baker的评论):请注意,只要修改的提交f42c5仍然存在于您的repo中,并且您有一种方法可以找到它的提交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”将创建一个并行提交,并成为新的分支头。

            +---- 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,并将索引移动到先前的提交(在提交之前提交以进行修改)。 在使用git commit命令之前,一切都保持了。
  • 它使git add所有文件以添加到新的提交中(这将是推荐的提交)。 要添加的文件是在git reset --soft之前进入SA的文件git reset --soft已着陆,重置后此文件将保存到WD中,因此需要将它们添加到SA以生成受支持的提交。
  • 使混帐提交。 它会生成一个新的提交,并因此产生一个用于修正提交的新ID。 为此,git commit --ammend不应该与推送提交一起使用
  • 如果使用--no-edit注释在被修正的提交中被重用,否则你必须引入新的注释(因为它是一个新的提交并且每个提交都需要注释)。

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

    链接地址: http://www.djcxy.com/p/8777.html

    上一篇: amend work, exactly?

    下一篇: 10 GIT lines erased 8Gb form my pc