Git的状态转换
? ? ? ???近期公司用Git來管理代碼,用起來是要比svn爽一些。就是剛接觸的時候比較痛苦,特別是那些狀態(tài)(版本號的提交/合并/回退)。差點把我搞暈了。
如今回過頭來總結(jié)一下,就清楚多了。
? ? ? ???就本地倉庫來看。Git能夠分成5個不同的狀態(tài)。能夠通過$ git status來查看。這五個狀態(tài)能夠互相轉(zhuǎn)換。詳細(xì)操作詳見以下的“版本號回退/整合”。
???????? 當(dāng)然。有些文件非常實用。不能刪除又不能提交,如Eclipse的項目文件. project等。
這樣的情況最好就是選擇把他們忽略掉,能夠通過改動根文件夾的.gitignore文件,或者update-index來忽略掉。
status
???????? 顯示Git的版本號管理信息:$ git status
一般分成3個區(qū)域:
a)??Changes to becommitted:暫存區(qū)中有改動的文件,但還沒commit。
b)??Changes notstaged for commit:工作區(qū)中已跟蹤且有改動的文件,但還沒add;
c)??Untrackedfiles:工作區(qū)中未跟蹤文件。未納入Git的管理,每一個新建的文件都屬于這樣的。
? ? ? ???從上面也能看出非常多操作的提示。
[Changes notstaged for commit]和[Untracked files]都能夠通過add把文件加入到[Changes to be committed]。
另外,還能夠使文件消失在Git的監(jiān)控范圍(ignore掉),這樣status就看不到了。
? ? ? ???也能夠使用簡略的顯示模式:$ git status –s
版本號回退 / 整合
? ? ? ???依據(jù)之前工作區(qū)/暫存區(qū)/版本號庫的狀態(tài)跳轉(zhuǎn)圖,可知道回退也是有多種情況。
?
a)?????Untrack區(qū)回退
? ? ? ???Untrack區(qū)存放的是沒有納入Git跟蹤的文件。如新創(chuàng)建的還沒add的文件。一般Git是不會理會這部分文件的,假設(shè)你嫌礙眼,能夠通過clean來清楚他們:
? ? ? ???先通過$ git clean –n查看要會清楚的文件,然后把n去掉,清除。也能夠在后面指定文件名稱,文件-f,文件夾-d。
b)?????工作區(qū)回退
???????? $ git checkout -- XXX意思是,把XXX文件在工作區(qū)的改動所有撤銷:先檢查暫存區(qū)有沒有XXX,假設(shè)有則把工作區(qū)的XXX恢復(fù)到暫存區(qū)的狀態(tài);假設(shè)沒有,則到版本號庫取。
? ? ? ???$ git checkout . 撤銷所有工作區(qū)的改動。
這個命令事實上挺危急的。一運(yùn)行記錄都被恢復(fù)了,改動都被丟棄了。也能夠用$ gitcheckout HEAD XXX。回退暫存區(qū)和工作區(qū)。
c)??????暫存區(qū)回退
???????? 面的checkout --僅僅是撤銷工作區(qū)的文件改動,假設(shè)我們想撤銷暫存區(qū)的,就須要使用$ gitreset HEADXXX。它會把暫存區(qū)的記錄清空掉。
我們通過$ git status就能看到Changes to be committed的內(nèi)容都跑到Changes notstaged for commit中去了。
也能夠用$ git checkout HEAD XXX,回退暫存區(qū)和工作區(qū)。
???????? 對于暫存區(qū)來說。這樣的方式和commit都會清空記錄。前者直接清空,后者先往版本號庫寫。再清空。
d)?????版本號庫回退
? ? ? ???假設(shè)你不小心把臟內(nèi)容commit到本地master了,上面兩種方式就無效了。這時候須要回退版本號庫:$ git reset--hardHEAD^
???????? 在Git中,用HEAD表示當(dāng)前版本號。上一個版本號就是HEAD^,上上一個版本號就是HEAD^^。也能夠?qū)懗蒆EAD~2。你能夠用HEAD后面加n個^。或者HEAD~n來表示回退多少個版本號。
???????? 上面是相對版本號的reset,當(dāng)然也能夠指定某一個詳細(xì)版本號。這時候commitID版本號號就大派用場:? $ git reset --hard3628164
3628164僅僅是版本號的前一小部分,Git會幫我們?nèi)プ约褐鲃悠ヅ洹.?dāng)然也有可能找到多條。所以還是寫全比較靠譜。
?
???????? 事實上對于Git來說。HEAD是一個當(dāng)前版本號號的指針,用reset來切換版本號。實際上是調(diào)整HEAD的指向。
???????? 所以。假設(shè)你reset 到HEAD~10。還行又回去原來的HEAD,那么也能夠通過【reset+ 版本號號】的方式切換過去。
???????? 當(dāng)然你要知道相應(yīng)的版本號號,這時候你能夠通過 $ git relog 來查看你的命令歷史和相相應(yīng)的版本號號。
?
e)?????遠(yuǎn)程版本號回退
???????? Git是分布式版本號控制系統(tǒng),僅僅要你把內(nèi)容push出去了,那么遠(yuǎn)程庫就會有記錄,你也不能主動改動別人的版本號,這時候就僅僅能覆蓋了。
可是你干過的壞事也就公諸于世了。
?
回退merge
???????? 假設(shè)僅僅是在merge。則能夠直接回退: $ git reset--hard HEAD^
???????? 假設(shè)merge 以后還有別的操作和改動,則能夠使用revert:
$ git revert -m merge線的編號? (從1開始計算,或者merge前的版本號號)
?
★ 版本號整合
???????? 東西已經(jīng)commit了。可是又想改動,怎么辦呢?能夠通過上面“版本號庫回退”的方法來實現(xiàn):reset再commit。可是那樣commit的改動就沒有了,須要又一次改動,工作量大。
???????? 所以除此之外。我們還能夠:
l? 假設(shè)僅僅是合并已commit的版本號:$ git rebase -i HEAD~2
l? 假設(shè)有補(bǔ)充的改動:$ git commit --amend
總結(jié)
- 上一篇: C语言_求完数
- 下一篇: VSCode 修改界面字体 代码字体 终