2

鉴于此 git 树:

A <--- B <--- C (HEAD, master)

是否可以将树置于这种状态:

A <--- B (HEAD, master) <--- C

(除了 . 之外没有分支或标签master。)换句话说,提交 ( C) 是否可以存在而不是分支(或标签)指向的提交或分支(或标签)指向的提交的祖先?

(这个问题纯粹是理论上的,可以帮助我更好地理解 git 分支是如何工作的。)

4

2 回答 2

2

提交C可以暂时存在(作为悬空提交);一旦发生 GC,它将被回收。

利用:

git fsck --unreachable

查看悬空提交和 blob。请注意,因为您所描述git的概念reflog不会立即创建悬空提交,C所以会保留reflog一段时间。git保持reflog以防万一您犯了错误并需要恢复某些东西。

于 2013-05-01T21:09:33.503 回答
2

当然,

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
于 2013-05-01T21:09:55.677 回答