Git的狀態轉換

2021-09-07 17:42:59 字數 2989 閱讀 2464

近期公司用git來管理**,用起來是要比svn爽一些。就是剛接觸的時候比較痛苦,特別是那些狀態(版本號的提交/合併/回退)。差點把我搞暈了。

如今回過頭來總結一下,就清楚多了。

就本地倉庫來看。git能夠分成5個不同的狀態。能夠通過$ git status來檢視。這五個狀態能夠互相轉換。詳細操作詳見以下的「版本號回退/整合」。

當然。有些檔案非常實用。不能刪除又不能提交,如eclipse的專案檔案. project等。

這樣的情況最好就是選擇把他們忽略掉,能夠通過改動根資料夾的.gitignore檔案,或者update-index來忽略掉。

status

顯示git的版本號管理資訊:$ git status

一般分成3個區域:

a)  changes to becommitted:暫存區中有改動的檔案,但還沒commit。

b)  changes notstaged for commit:工作區中已跟蹤且有改動的檔案,但還沒add;

c)  untrackedfiles:工作區中未跟蹤檔案。未納入git的管理,每乙個新建的檔案都屬於這樣的。

從上面也能看出非常多操作的提示。

[changes notstaged for commit]和[untracked files]都能夠通過add把檔案加入到[changes to be committed]。

另外,還能夠使檔案消失在git的監控範圍(ignore掉),這樣status就看不到了。

也能夠使用簡略的顯示模式:$ git status –s

版本號回退 / 整合

依據之前工作區/暫存區/版本號庫的狀態跳轉圖,可知道回退也是有多種情況。

a)     untrack區回退

untrack區存放的是沒有納入git跟蹤的檔案。如新建立的還沒add的檔案。一般git是不會理會這部分檔案的,假設你嫌礙眼,能夠通過clean來清楚他們:

先通過$ git clean–n檢視要會清楚的檔案,然後把n去掉,清除。也能夠在後面指定檔名稱,檔案-f,資料夾-d。

b)     工作區回退

$ gitcheckout --***意思是,把***檔案在工作區的改動所有撤銷:先檢查暫存區有沒有***,假設有則把工作區的***恢復到暫存區的狀態;假設沒有,則到版本號庫取。

$ gitcheckout .撤銷所有工作區的改動。

這個命令事實上挺危急的。一執行記錄都被恢復了,改動都被丟棄了。也能夠用$ gitcheckout head***。回退暫存區和工作區。

c)      暫存區回退

面的checkout --僅僅是撤銷工作區的檔案改動,假設我們想撤銷暫存區的,就須要使用$ gitreset head***。它會把暫存區的記錄清空掉。

我們通過$ git status就能看到changes to be committed的內容都跑到changes notstaged for commit中去了。

也能夠用$ gitcheckout head***,回退暫存區和工作區。

對於暫存區來說。這樣的方式和commit都會清空記錄。前者直接清空,後者先往版本號庫寫。再清空。

d)     版本號庫回退

假設你不小心把髒內容commit到本地master了,上面兩種方式就無效了。這時候須要回退版本號庫:$ git reset--hardhead^

在git中,用head表示當前版本號。上乙個版本號就是head^,上上乙個版本號就是head^^。也能夠寫成head~2。你能夠用head後面加n個^。或者head~n來表示回退多少個版本號。

上面是相對版本號的reset,當然也能夠指定某乙個詳細版本號。這時候commitid版本號號就大派用場:  $ git reset --hard3628164

3628164僅僅是版本號的前一小部分,git會幫我們去自己主動匹配。當然也有可能找到多條。所以還是寫全比較靠譜。

事實上對於git來說。head

是乙個當前版本號號的指標,用reset來切換版本號。實際上是調整head的指向。

所以。假設你reset 到head~10。還行又回去原來的head,那麼也能夠通過【reset+ 版本號號】的方式切換過去。

當然你要知道相應的版本號號,這時候你能夠通過 $ git relog 來檢視你的命令歷史和相相應的版本號號。

e)     遠端版本號回退

git是分布式版本號控制系統,僅僅要你把內容push出去了,那麼遠端庫就會有記錄,你也不能主動改動別人的版本號,這時候就僅僅能覆蓋了。

可是你幹過的壞事也就公諸於世了。

回退merge

假設僅僅是在merge。則能夠直接回退: $ git reset--hard head^

假設merge 以後還有別的操作和改動,則能夠使用revert:

$ git revert -m merge

線的編號  (從1開始計算,或者merge前的版本號號)

★ 版本號整合

東西已經commit了。可是又想改動,怎麼辦呢?能夠通過上面「版本號庫回退」的方法來實現:reset

再commit。可是那樣commit的改動就沒有了,須要又一次改動,工作量大。

所以除此之外。我們還能夠:

l  假設僅僅是合併已

commit的版本號:$ git rebase -i head~2

l  假設有補充的改動:$ git commit --amend

執行緒的狀態轉換

執行緒的狀態轉換是執行緒控制的基礎。執行緒狀態總的可分為五大狀態 分別是生 死 可執行 執行 等待 阻塞。對於執行緒的阻止,考慮一下三個方面,不考慮io阻塞的情況 1.睡眠 2.等待 3.因為需要乙個物件的鎖定而被阻塞。睡眠 thread.sleep long millis 和thread.slee...

執行緒的狀態轉換

從執行緒被建立到執行完畢共經過了五個階段 新建 可執行 執行 等待 阻塞 睡眠 終止。關係圖如下所示 新狀態 new 執行緒以建立,但未呼叫任何方法 可執行狀態 runnable 已呼叫start 方法,進入就緒狀態,或程式剛從等待 阻塞 睡眠狀態回來,等待執行 執行狀態 run 程式在正常執行 等...

執行緒的狀態轉換

執行緒的狀態有 new runnable running waiting timed waiting blocked dead 當執行new thread runnabler 後,新建立出來的執行緒處於new狀態,這種執行緒不可能執行 當執行thread.start 後,執行緒處於runnable狀...