使用git修改旧提交时会发生什么?

使用git修改旧提交时会发生什么?,git,git-commit,git-amend,Git,Git Commit,Git Amend,如果我签出一个旧的提交,做一些修改,然后使用git commit--amend提交,我真的不明白会发生什么 该更改是否会自动传播到将来的提交?它是如何工作的?在git中,提交只是对象。当您git commit--amend时,您只是在使用相同的父级创建一个新的提交。最初看起来是这样的: {HEAD} {master} ---[A]---[B]---[C] 现在修改C,创建一个新的提交D:

如果我签出一个旧的提交,做一些修改,然后使用
git commit--amend
提交,我真的不明白会发生什么


该更改是否会自动传播到将来的提交?它是如何工作的?

在git中,提交只是对象。当您
git commit--amend
时,您只是在使用相同的父级创建一个新的提交。最初看起来是这样的:

                  {HEAD}
                  {master}
---[A]---[B]---[C]
现在修改
C
,创建一个新的提交
D

                  {HEAD}
                  {master}
---[A]---[B]---[D]
            \
             \
              [C]

旧的
C
目前仍在那里。但是,它不再被任何分支引用,因此下一次发生垃圾回收时,它将被清除。

将使用与旧提交相同的父级创建一个新提交,当前分支现在引用新提交。旧的提交仍在对象数据库中,可以使用
git reflog

找到它,以补充John的回答,如果您发送一个旧的提交,它的子级将不会发生任何事情

       old commit
            v
o--o--o--o--o--o--o--o--o < original branch tip
          \
           o  < ammended old commit & new branch tip
旧提交
v
o--o--o--o--o--o--o--o--o<原始分支尖端
\
o

也许你想做的事情可以通过一个。

来完成,垃圾收集是由
git gc
完成的,当git决定需要清理时,它会定期运行(尽管可以手动运行)。默认情况下,松散对象只有在至少两周后才会被修剪。结果是,只要你不花一个月的时间去实现它,如果你决定
D
不是你想要的,你就可以拿回旧的
C
。@Jefromi:+1,谢谢你的帮助。对于大多数人来说,“垃圾收集”通常意味着一个非常短的时间框架,所以值得注意的是,你几乎可以在Git中说“哦,我不是有意这么做的”。啊,我明白了。实际上,git显示了一条消息:
分离提交…
,这意味着我的更改将在下一次垃圾收集时消失。这真的很危险…它只有在reflog中过期时才会被gc'ed(我认为默认的过期日期是一个月)@Olivier:它什么时候显示的?你什么时候对C做了些什么?你是用超然的头脑犯下的吗?