鉴于此 git 树:
A <--- B <--- C (HEAD, master)
是否可以将树置于这种状态:
A <--- B (HEAD, master) <--- C
(除了 . 之外没有分支或标签master
。)换句话说,提交 ( C
) 是否可以存在而不是分支(或标签)指向的提交或分支(或标签)指向的提交的祖先?
(这个问题纯粹是理论上的,可以帮助我更好地理解 git 分支是如何工作的。)
提交C
可以暂时存在(作为悬空提交);一旦发生 GC,它将被回收。
利用:
git fsck --unreachable
查看悬空提交和 blob。请注意,因为您所描述git
的概念reflog
不会立即创建悬空提交,C
所以会保留reflog
一段时间。git
保持reflog
以防万一您犯了错误并需要恢复某些东西。
当然,
git checkout -b tmp
touch whatever.txt
git add -A
git commit -m "committed!"
git checkout master
git branch -D tmp
其前身是 master 的当前 HEAD 的提交现在仍然可用,但没有名称指向它。您仍然可以使用 reflog 命令来访问它。
鉴于 C 已经存在,另一种可能性:
git checkout -b tmp
git checkout master
git reset --hard HEAD~1
git branch -D tmp