2010-12-17 65 views
8

使用git log我發現我的項目的舊版本,我想混亂。我做了git checkout version52導致項目在'分離'狀態,做了一些修改,然後做了git commit就可以了。我沒有意識到這會在分離的狀態下進行。爲什麼在分離狀態下使用`git commit`?

之後我回到我的主人git checkout master但是當我做git log我的變化不再顯示。我現在意識到這些更改卡在我的version52中。

我可以用git merge version52很容易地得到這些更改,但我只是想知道,能夠在git中以分離狀態提交的意義是什麼?作爲一個新手,這讓我感到困惑了一段時間,我不明白爲什麼它被允許,或者何時使用這樣的功能。

編輯:對不起,我以前寫了「斷開」,但我的意思是「分離」。在git中,當您決定查看以前簽入的項目版本時,會發生這種情況。

+0

這是超級用戶的問題,不是嗎? – yoda 2010-12-17 10:10:44

+0

什麼是斷開連接狀態 - 你是指分離的HEAD? – 2010-12-17 10:11:10

+0

是的,對不起,我的意思是「分離」 – Lan 2010-12-17 10:20:23

回答

6

對於未來,你應該已經創建了一個分公司工作過

git branch branchName version52 
git checkout branchName 

git checkout -b brannchName version52 

評論後編輯

的git的對象模型,這是我寫的約here,只是跟蹤一棵樹的對象。分支是指向提交的指針。雖然這兩者是相關的,但您不必將分支指向提交行的頂端。

當你創建一個提交時,你仍然在創建一個存在於版本庫中的對象樹,直到它變老,並且你運行git-gc來清理這些孤立的提交。我認爲你擔心的是在分支機構中沒有強制要求提交的承諾。這爲工具提供了靈活性,有時可以捕捉用戶,但git是一種高級工具。

在你的情況下,你做了一個提交,然後返回到你的主分支,你認爲你失去了提交,但是如果你看過git reflog的輸出,你會看到你創建的提交的sha它不在分支上。你可以在這裏創建一個分支git branch branchName <sha of commit>。或者,您可以將這些提交與另一個分支進行合併或重新組織,而無需執行爲此創建和刪除分支的額外步驟。好的,所以這只是一些額外的步驟,只有幾個按鍵;但在少數情況下它很有用。

事情是分支只是提交樹的簡寫,就像標籤是特定提交的簡寫。除了在分支上進行提交時,分支指針隨最新提交一起移動。

總是有head指針指向了最新的提交,你已經簽出,所以你從來沒有真正「切斷」

+0

有用的,當在一個團隊工作 – yoda 2010-12-17 10:19:00

+0

是的,我現在意識到這是我應該做的。但是有沒有什麼時候承諾分離狀態是有用的? – Lan 2010-12-17 10:23:15

-3

您似乎對版本控制感到困惑 - 您每次進行一次提交併且通過測試就做出提交。我通常會每隔一小時左右進行一次提交 - 它給了我一個我可以返回的已知狀態,並給了我一些不同的看法。無論你是否「連接」,都不在這裏,也不在那裏。

+0

我認爲你誤解了這個問題。他在談論他的歷史是處於一個無關聯的狀態,並不是說他沒有連接到他的源代碼控制服務器。 – Abizern 2010-12-17 10:15:29

+0

對不起,我原來的問題是寫「斷開」而不是「分離」的錯。 – Lan 2010-12-17 10:19:47

3

承諾本身就是一個分離的頭是相當無用的,但它也是在交互式重新綁定期間使用,如果您標記提交進行編輯,它允許您重寫樹的歷史記錄。

當git達到這樣的提交,而重新綁定它會停止進程,你可以改變這個承諾git commit --amend,甚至可以像平常一樣插入新的提交。最重要的是,這樣的提交屬於no分支,因爲git status清楚地顯示,所以你承諾分離的頭。

許多Git用戶,包括我在內,都認爲交互式重新定義是更有用的git功能之一,如果不可能提交分離的HEAD,它將不起作用。

相關問題