2013-05-01 46 views
2

鑑於這種混帳樹:每個git commit都必須是分支的祖先嗎?

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

是有可能把樹進入此狀態:

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

(有沒有分支機構或標籤以外master)換句話說,可以一commit(C)是否存在既不是由分支(或標記)指向的提交或由分支(或標記)指向的提交的祖先?

(這個問題是純粹的理論來幫助我更好地瞭解如何分行的git的工作原理。)

回答

2

當然,

git checkout -b tmp 
touch whatever.txt 
git add -A 
git commit -m "committed!" 
git checkout master 
git branch -D tmp 

的承諾,其前身是主的現任掌門人現在依然有效,但沒有名字指向它。你仍然可以做到,例如用reflog命令。

另一種可能性,考慮到C處已經存在:

git checkout -b tmp 
git checkout master 
git reset --hard HEAD~1 
git branch -D tmp 
2

提交C可以暫時存在(如懸空提交);一旦GC發生,它將被回收。

用途:

git fsck --unreachable 

看到叼着提交和斑點。請注意,因爲git有一個reflog的概念,所描述的不會立即創建懸掛提交,因此C將保留在reflog一段時間。 git維護reflog以防萬一你犯了一個錯誤,需要恢復的東西。

相關問題