每个git都必须成为分支的祖先吗?

时间:2013-05-01 21:07:10

标签: git branch commit ancestor

鉴于这个git树:

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

是否可以将树置于此状态:

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

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

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

2 个答案:

答案 0 :(得分:2)

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

使用:

git fsck --unreachable

看到悬空提交和blob。请注意,由于git的概率为reflog,您所描述的内容不会立即创建悬空提交,C将保留reflog一段时间。 git维护reflog以防万一您犯了错误并需要恢复某些内容。

答案 1 :(得分: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