從什麼都不懂開始(四)——Git掌握時空之力
看到這篇標題是不是有種很叼的感覺!?在Git的工作流程中,不僅能往前走,當然也可以後退。不僅能提交
檔案,當然也能刪除或者修改了。而且你想回到哪個提交節點就回到哪個提交節點,
是不是覺得自己體內的洪荒之力快抑制不住了?
別急,容我短話長說,一一道來。
在這真正講這些也需要普及一個概念:工作區和暫存區
工作區和暫存區
如果有同學對這些概念感覺很懵逼,也沒什麼關係,不影響你的使用,只要掃一眼接下來的兩個標題,
就不會影響理解這篇的內容了。
另外如果有同學想深入理解這個概念的原理,可以自行去Google搜一下。
工作區
比如你正在寫程式碼,那麼你當前的編譯器介面的那些程式碼都屬於工作區裡的。
暫存區
當你在你的git工程裡建立了一個新檔案,並且執行了git add [File Name]
,
那麼這個新的檔案就都被add進了暫存區。
在已經提交過的程式碼裡做修改,還不在暫存區,執行git status
,會發現這些修改過的檔案提示需要add,add後會進入暫存區。
當你執行commit的時候,就是把暫存區的程式碼一次性提交到本地版本庫上。
技能樹
reset
reset這個詞從翻譯上來說叫做重置,我覺得用回檔這個詞比較好理解,每次commit都會有個log記錄,相當於遊戲中的存檔啦,然後你可以使用reset,回檔到某個記錄。
幾個常用的方式
git reset [HEAD] [FileName]
我經常用到這個命令,因為我在提交時,總是不小心把某些寫到一半的檔案也順手給提交上去了。
先不說效果是什麼,給你們演示一下:
先把之前修改的提交了:
修改一下工作區的程式碼,再執行git diff
檢視當前修改了什麼:
然後執行git log
檢視我們當前的提交日誌:
用紅色標起來的就是[HEAD] ,看下面的”test for reset commit”,是我們剛才提交的,所以需要的下面那個HEAD。
執行 git reset ebd535064bd1b2a2739b40c3a9356ce4c0fd6cba app/src/main/java/heh/MasterCodeTest.java
在執行git diff
,看到這次的結果和之前第一次diff不同:
以上操作只是回檔某個檔案,所以log並不會變。
我每次提交不小心帶上了些不該提交的檔案,就用這個命令撤銷一些提交。
git reset [HEAD]
如果執行的時候不帶最後個[fileName],那麼所有檔案都會回到那次提交的節點。
如果直接執行 git reset ebd535064bd1b2a2739b40c3a9356ce4c0fd6cba
再執行git log
,看到剛剛我們提交的”test for reset commit”已經沒了:
剛才所有的reset都只是把head指向了當前branch的指定commit僅此而已,可以執行git status
,發現還是需要add的,工作區和暫存區都沒變化。
預設的都是不寫模式 – mixed 模式
git reset –hard
這個用法和剛才的類似,就是多了個–hard,意味著你工作區的程式碼也會回檔,和暫存區保持一致,都回到了那個節點的commit時的狀態。
git reset –soft
–soft,意味著工作區不會收到影響,暫存區回到了那個節點的commit時的狀態。
revert
憋著急,先往下看,最後會解釋的。
執行 git revert ebd535064bd1b2a2739b40c3a9356ce4c0fd6cba
程式碼會出現衝突的現象,因為兩次結果不一樣:
合併完程式碼,add再commit會出現如下提示:
revert 和 reset 的功能是類似的,區別就是revert不會改變log,而reset會撤銷log。
revert需要一個新的commit記錄這次revert。如果沒衝突,那麼會自動commit;如果有衝突,則會需要解決衝突後手動commit
一句話總結就是revert只是撤銷某次commit,其他的commit和整個log記錄不會受到影響,而reset會幹掉某次commit之後的所有commit,包括log。
checkout
在上一節的分支操作裡也講過這個命令,是切換分支用的,而在這裡將會講解用checkout命令起到撤回的作用。
git checkout [fileName]
或者
git checkout -- [fileName]
在提交過的檔案裡隨便新增一行,然後在命令列中輸入git status
會出現如下圖所示:
說明當前修改還未進入暫存區,還是在工作區,這個時候執行
git checkout [你的檔案絕對路徑]
:
為什麼用絕對路徑呢,就是避免你的檔名和branch名一樣,結果就切換到分支上了。加上 – 後面的就一定是檔案了
git checkout [commit] [fileName]
該命令就是將某個檔案的暫存區和工作區都回撤到某個commit節點上。
git checkout .
注意到 checkout 後面有個”.”,就是代表所有檔案的意思把所有檔案都撤回剛才在工作區上的改動。
log
這個命令在之前的例子總經常用到,就是看提交日誌用的。
之前從同事那邊學來一條黑科技命令:
git log --oneline --decorate --graph --all
用一下就知道效果了,不瞭解裡面引數的執行git log --help
檢視文件。
rm
這個命令linux中也有,就是刪除檔案或者移動的意思。
在git中也是這個意思。
如果你在本地物理刪除了一堆檔案,但是沒有執行git rm
,那麼其實這些檔案還是在git系統裡的,在git project中直接執行git rm
刪除要你刪的檔案,提交之後就可以完成刪除了。
總結
寫到這裡把git的回撤、檢視的功能都寫完了,大家應該也有一個比較系統的認知了,具體還是需要多在專案中應用。
希望大家能一起討論,共同學習進步!
歡迎加入QQ群:568863373。
歡迎關注我們的公眾號:魔都三帥
,歡迎大家來投稿~