2017-10-06 76 views
2

我讀Git的書,它有一個奇怪的預留約提交修改:提交修改如何幫助您在Git中切換分支?

然而,在你[變化分支機構],注意,如果你的工作目錄或 暫存區域提交的更改與衝突你正在檢查的分支 ,Git不會讓你切換分支。當您切換分支時,最好 有一個乾淨的工作狀態。有辦法 解決這個問題(即積攢並提交修訂),我們會 蓋以後

https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

我知道如何積攢可以幫助因爲你基本上存儲您在提交的修改隱藏起來,以便以後可以重新應用它們,使您的工作/暫存位置不會有任何未提交的更改。但我真的不知道在這種情況下可以如何使用提交修改來幫助。有任何想法嗎?

+1

沒有看過這個我不確定,但我的猜測是,這意味着你可以說'git commit -am「TEMPORARY:我到目前爲止所做的更改」',切換分支,然後當你來回到這個分支你可以將臨時提交修改爲一個真正的提交。 –

回答

3

正如他們在那裏說的那樣,「我們稍後會介紹」。 :-)關鍵是你可以繼續前進並承諾,永久的,你的臨時工作狀態的不可改變的副本。你可能會與此開始:

...--o--o <-- master 
     \ 
     o--o--o <-- feature 

,並在你的下一個承諾爲feature工作的中間是。它還沒有準備好,但你必須修復其他地方(在master或其他分支)。所以,如果你git add一切,git commit你會得到一個新的,永久性的,但是,你想學它到是暫時性的承諾:

...--o--o <-- master 
     \ 
     o--o--o--● <-- feature 

後來,你回來分支feature,它有這個壞(堅實的黑色圓圈)提交。現在完成意圖的提交工作,並使用git commit --amend

做什麼git commit --amend是使新的承諾像往常一樣,除了沒有加入其分支的末端,它塞到最近提交的旁白:

...--o--o <-- master 
     \ 
     o--o--o--o <-- feature 
       \ 
       ● [abandoned] 

這現在已經放棄了承諾,它仍然與任何Git一樣永久且不可更改,不再是可找到。如果您尋找從feature開始並向後(向左)工作的提交,您將看不到它。如果你從master開始尋找提交併且向後工作,你就不會看到它。唯一能找到它的方法是使用Git的推薦日誌,默認情況下,這些提交日誌至少需要30天才會掛起這些放棄的提交。

最終,保持提交●的reflog條目或條目到期。在這一點上,這個承諾不受git gc蹂躪的鬣狗的保護:他們最終會發現並且肢解這個承諾,消耗掉它的骨頭和所有東西,而且它畢竟永遠不會成爲現實。


作爲永久的事情是在Git中,那就是:Git會努力去記住它,但一旦沒有辦法找到它,這樣的提交被收集起來的垃圾,扔出去。 Mercurial有點不同:永久提交是完全永久的,就像在Git中一樣,直到你運行hg strip,這會消除它們及其所有後代。

+0

這是一個了不起的答案,謝謝!圖表在討論Git時非常有用... – Stephen

-1

使用git修改將您現有的提交更改爲不同的提交,因爲消息是不同的。那麼你基本上在同一個分支上,你可以提交未提交的更改。如果你想回到你的其他分支,你仍然可以發出一個'checkout'命令到達那裏,那不包含你未提交的改變。

我應該補充說,如果你正在修改你真的需要跟蹤提交散列,所以你不會迷路。使用真正的(例如功能)分支或存儲更是一種標準的做法。我會認爲修改是真正的意思,因爲它的名字..修改提交信息,而不是玩哈希。