【Git】2. Git常用命令詳解、版本切換原理

把蘋果v咬哭發表於2021-05-07

一、新增檔案

1、設定使用者簽名

簽名的作用就是為了區分不同的人,方便檢視版本的時候知道操作的人是誰。首次安裝好git之後必須設定一下簽名,否則無法提交程式碼。
另外,這裡設定的簽名跟你登入到遠端倉的賬號沒有關係。

git config --global user.name 使用者名稱
git config --global user.email 郵箱

2、初始化本地庫

想通過git管理檔案目錄,首先要讓git獲取到管理權,所以要初始化。

git init


初始化成功,提示初始化了一個空的git倉庫.git,這裡的檔案就別改動了,可以開啟看看。

3、檢視本地庫狀態

初始化本地庫之後,就可以檢視本地庫的狀態了。

git status


看下返回的3行分別說了啥:

  1. 本地庫在master分支,master是預設生成的。
  2. 目前還沒有提交過任何東西。
  3. 除了沒有提交過,而且現在還沒有什麼東西需要你提交。

這時候新增一個檔案的hello.txt,再用git status看這裡就不一樣了。

出現一個新行:Untracked files,未被追蹤的檔案,紅色標記。說明這個檔案只在工作區,但是沒有被git追蹤。
最後一行的描述也變了,說目前還沒有提交檔案,但是存在未被追蹤的檔案。

4、新增暫存區

git的提示做的還是很友好的,基本上都會給你操作提示。接著上面來,現在如何讓檔案被追蹤,提示說了,用git add

git add


出現一個warning,說的是換行符自動替換處理,因為那個檔案我直接在git-bash視窗用linux命令新建的,所以自動轉化了win用的CRLF,不用管它。

現在重新檢視下git status

綠了,綠了,只不過不是古天樂(這是一個傳奇頁遊廣告的梗),而是剛才的hello.txt檔案。

5、刪除暫存區

現在這個檔案也只是在暫存區裡,暫存區裡的檔案是可以刪掉的。如果現在我不想讓這個檔案產生一個歷史版本,那麼要在提交到本地倉庫之前刪掉它,就在暫存區刪吧。
同樣git也給了提示。

git rm --cached <file>


成功刪除,但是記住這裡刪的是暫存區的,你本地工作區的檔案沒動,用ll檢視一下。

6、提交本地庫

把檔案重新提交到暫存區,接下來就可以提交到本地庫,形成一個歷史版本了。

git commit -m "日誌資訊" 檔名


提交成功,看提示資訊:

  • [master (root-commit) a70616d],這裡的a70616d就是版本號了,這個是簡短版的。
  • 1 file changed, 19 insertions(+),1個檔案被改變,插入了19行資訊(文字里有19行內容)。

7、檢視版本資訊

剛才提交本地庫產生一個版本資訊,可以用這個命令檢視。

git reflog


顯示了剛才提交的版本資訊。

  • a70616d是版本號。
  • (HEAD -> master代表指標指向這個第一個版本。
    還可以用這個命令檢視更相信的版本資訊:
git log


可以看到這裡的版本號很長a70616d3fc1c69f948a7b0d4ed2b640bedb1e747,這個就是完整版的版本號了。

二、檔案被修改後

上面是新增一個檔案,但是最多的場景還是同一個檔案被反覆修改,現在我去修改hello.txt檔案,增加寫內容,然後git status


提示有一個檔案被修改了,紅色表示還沒有被追蹤,那麼重複上面的動作,提交到暫存區即可,用git add。提交成功了再次檢視。

最後再提交本地庫。

這裡看到最後的提示,有一行新增,一行刪除,可是我只是在第一行後面繼續增加了內容。

因為git裡面是按照行來維護檔案的,我修改了第一行內容,實際上對於git來說,要先刪除掉之前的第一行內容,然後再增加修改後的第一行內容。

現在檢視版本資訊git reflog


可以看到:

  • 有2個版本資訊。
  • 此時的指標是指向第二個版本。

三、版本穿梭

比如現在我想回退到之前某一個歷史版本。

先檢視歷史版本,git reflog,目前我有3個版本。

我現在要回到第二次提交的版本,複製出版本號,使用如下命令:

git reset --hard 94ca3de

此時我再檢視版本,發現指標已經移到了第二次提交的版本上了。

至於,第一行是告訴你做了一個reset的操作,目標版本號是什麼。

git切換版本的原理
底層其實是移動HEAD指標。

可以先開啟本地的.git下的HEAD,可以看到裡面指標指向master,說明當前是在master分支上。

接著,可以開啟.git/refs/heads/下面的master,可以看到裡面的內容就是當前所在版本的版本號。

當繼續切換版本到a70616d的時候,master檔案裡的版本號也會變更為對應的。

用示意圖來描述的話,其實在我們剛提交完第三個版本的時候,應該是這樣的:

當我們切換版本的時候,其實就是指標變了,比如現在切換到第二版本:

接下來,到了分支相關了。

相關文章