假设我们有分支:
A <-- B <-- C
假设我们进一步使用git commit --amend
将C
更改为C'
:
A <-- B <-- C'
问题: C
会发生什么事(从字面上讲)?这个提交是否仍然存在于git的对象存储中(它只是悬挂在我们的主分支中)?
答案 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