使用`git commit --amend`后旧提交会发生什么?

时间:2015-08-21 13:30:45

标签: git

假设我们有分支:

A <-- B <-- C

假设我们进一步使用git commit --amendC更改为C'

A <-- B <-- C'

问题: C会发生什么事(从字面上讲)?这个提交是否仍然存在于git的对象存储中(它只是悬挂在我们的主分支中)?

2 个答案:

答案 0 :(得分:4)

是的,它存在,如果你知道它的sha,你可以做

git show <SHA>

看到它。

它只是“孤儿”,它最终被垃圾收集器修剪。

最终情况将是

A -- B -- C'
      \
       \-- C (this commit is unreachable, so it's not shown in normal git logs)

关于垃圾收集器,又名git gc

  

在当前存储库中运行许多内务处理任务,例如压缩文件修订(以减少磁盘空间并提高性能)和删除无法访问的对象,这些可能是从之前的git add调用中创建的

     

鼓励用户定期在每个存储库中运行此任务,以保持良好的磁盘空间利用率和良好的运行性能。

     

某些git命令可能会自动运行git gc ;有关详细信息,请参阅下面的--auto标志。如果您知道自己在做什么,并且您想要的是永久禁用此行为而无需进一步考虑,请执行以下操作:

     

git config --global gc.auto 0

答案 1 :(得分:1)

根据官方文件,git commit --amend是对历史的重写:

  

您需要小心这项技术,因为修改了提交的SHA-1。这就像一个非常小的变形 - 如果你已经推动它,不要修改你的最后一次提交。

来源:https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History

所以回答你的问题:

  

C(从字面上讲)会发生什么?

它仍然存在,实际上已被隐藏(git stash)。您可以使用此处标识的流程将其恢复:

http://blog.pivotal.io/pivotal-labs/labs/rewinding-git-commit-amend