鑑於這種混帳樹:每個git commit都必須是分支的祖先嗎?
A <--- B <--- C (HEAD, master)
是有可能把樹進入此狀態:
A <--- B (HEAD, master) <--- C
(有沒有分支機構或標籤以外master
)換句話說,可以一commit(C
)是否存在既不是由分支(或標記)指向的提交或由分支(或標記)指向的提交的祖先?
(這個問題是純粹的理論來幫助我更好地瞭解如何分行的git的工作原理。)
鑑於這種混帳樹:每個git commit都必須是分支的祖先嗎?
A <--- B <--- C (HEAD, master)
是有可能把樹進入此狀態:
A <--- B (HEAD, master) <--- C
(有沒有分支機構或標籤以外master
)換句話說,可以一commit(C
)是否存在既不是由分支(或標記)指向的提交或由分支(或標記)指向的提交的祖先?
(這個問題是純粹的理論來幫助我更好地瞭解如何分行的git的工作原理。)
當然,
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
提交C
可以暫時存在(如懸空提交);一旦GC發生,它將被回收。
用途:
git fsck --unreachable
看到叼着提交和斑點。請注意,因爲git
有一個reflog
的概念,所描述的不會立即創建懸掛提交,因此C
將保留在reflog
一段時間。 git
維護reflog
以防萬一你犯了一個錯誤,需要恢復的東西。