1. 程式人生 > >從什麼都不懂開始(四)——Git掌握時空之力

從什麼都不懂開始(四)——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

執行reset

在執行git diff,看到這次的結果和之前第一次diff不同:
diff

以上操作只是回檔某個檔案,所以log並不會變。

我每次提交不小心帶上了些不該提交的檔案,就用這個命令撤銷一些提交。

git reset [HEAD]

如果執行的時候不帶最後個[fileName],那麼所有檔案都會回到那次提交的節點。

如果直接執行 git reset ebd535064bd1b2a2739b40c3a9356ce4c0fd6cba
再執行git log,看到剛剛我們提交的”test for reset commit”已經沒了:
reset log

剛才所有的reset都只是把head指向了當前branch的指定commit僅此而已,可以執行git status,發現還是需要add的,工作區和暫存區都沒變化。

預設的都是不寫模式 – mixed 模式

git reset –hard

這個用法和剛才的類似,就是多了個–hard,意味著你工作區的程式碼也會回檔,和暫存區保持一致,都回到了那個節點的commit時的狀態。

git reset –soft

–soft,意味著工作區不會收到影響,暫存區回到了那個節點的commit時的狀態。

revert

憋著急,先往下看,最後會解釋的。

執行 git revert ebd535064bd1b2a2739b40c3a9356ce4c0fd6cba

revert

程式碼會出現衝突的現象,因為兩次結果不一樣:

merge

合併完程式碼,add再commit會出現如下提示:

commit-revert

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 status

說明當前修改還未進入暫存區,還是在工作區,這個時候執行
git checkout [你的檔案絕對路徑]

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。

歡迎關注我們的公眾號:魔都三帥,歡迎大家來投稿~

公眾號