? ? ? ???近期公司用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)?????工作區回退
???????? $ git checkout -- XXX意思是,把XXX文件在工作區的改動所有撤銷:先檢查暫存區有沒有XXX,假設有則把工作區的XXX恢復到暫存區的狀態;假設沒有,則到版本號庫取。
? ? ? ???$ git checkout . 撤銷所有工作區的改動。
這個命令事實上挺危急的。一運行記錄都被恢復了,改動都被丟棄了。也能夠用$ gitcheckout HEAD XXX。回退暫存區和工作區。
c)??????暫存區回退
???????? 面的checkout --僅僅是撤銷工作區的文件改動,假設我們想撤銷暫存區的,就須要使用$ gitreset HEADXXX。它會把暫存區的記錄清空掉。
我們通過$ git status就能看到Changes to be committed的內容都跑到Changes notstaged for commit中去了。
也能夠用$ git checkout HEAD XXX,回退暫存區和工作區。
???????? 對于暫存區來說。這樣的方式和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