內容標題
管裡檔案
我們今天要來認識 git 是怎麼管理檔案的。開始之前我們先在桌面建立資料夾叫 git_pratice 以當作我們練習用的資料夾 (玩壞也沒關係XD)。
當我們要把檔案交給 git 時,我們要告訴 git 說這個資料夾現在交給你啦!於是我們需要輸入指令:
$ git init
此時,git 會在這個目錄底下建立一個 .git 檔案。這檔案是隱藏檔案,平常是不會看到的。但還是記得不要刪掉這個檔案。 如果想要查看隱藏檔 mac 看這邊 windows 看這邊
上面圖案是關於 git 管理檔案的示意圖。首先,工作目錄 (working directory) 是指現我們現在的 test 資料夾。我們先創立test.cpp。可以任意輸入內容沒關係。當我們輸入:
$ git add test.cpp
git 會把 test.cpp 先存在 暫存區 (staging area),此時還未正式把檔案記錄起來。如果要把檔案正式交給 git 則要輸入:
$ git commit -m "[comment]"
此時 git 已經把 test.cpp 紀錄起來了,同時 第一版成立。至於後面的 "[comment]"
是要幹嘛呢?我們先前說過,git 在上傳資料都需留下這次更改或上傳的紀錄,因此後面的 "[comment]
要寫入紀錄,如果沒有,則 git 會跳出編輯器要求我們留下紀錄。例如:
$ git commit -m "First commit"
此時,我們就成功把我們的 test.cpp 交給 git 管理了。
那難道說我們每增加一個檔案,就要 add 並 commit 一次嗎? 當然不用!既然是暫存區,是可以存入很多檔案的,之後在一次 commit 出去。 來看個例子吧!
我們這次創立兩個檔案 test.c 跟 test.py。我們可以把這兩個檔案先加到暫存區:
$ git add test.c test.py
之後再一次 commit:
$ git commit -m "Second commit"
第二版成立,此時我們全部檔案都交給 git 管理了。也就是說我們現在資料夾總共有兩種版本,只有 test.cpp 和有 test.cpp, test.c, test.py 兩種版本。另外,如果資料被修改過,git 會把他視為新的檔案,所以要重新 add 和 commit 喔!
查看狀態
我們剛剛的動作只是把檔案交給 git ,但還沒從 git 那裡獲得資訊。最常見的兩種查看的狀態指令有 git status
和 git log
。
git status
這個指令會告訴使用者目前檔案的狀態,例如說有哪些檔案是新增但還沒加入 和 修改但還沒加入 和 在暫存區的檔案。首先我們新增 test.js 和 修改 test.py 的內容 (隨便改或刪都沒關係,但要留內容) 。
接著我們輸入:$ ls test.c test.cpp test.js test.py
會看到:$ git status
首先,我們可以看到 test.py 前有一個 modified:,代表是更改的檔案。確實git把他當成一個新的 物件 來看!再來,test.js 的前幾行有一個 Untracked files:,代表是還未加入過的檔案。我們現在同樣 add 並 commit。
接著再跑一次$ git add test.py test.js $ git commit -m "Add test.js and modified test.py"
git status
:
代表說檔案的資料都加進儲存庫了。另外,如果只有 add,git status
也會提示你喔~git log
這個指令主要是要來看我們每個 commit 的資訊。輸入:
會看到:$ git log
最底下的是最先 commit 的,同時也能看到作者資訊,時間,紀錄等。有一個比較特別的是 commit 旁邊有一串數字,那個是 SHA-1,我們等等會介紹他的作用。剛剛介紹的只是最基礎指令,如果想看更多 [option] 的話,可以輸入
git help [command]
來查看指令是做什麼的以及其選項。例如$ git help log
可以看到 log 的功用以及其 [option]
後悔 commit
如果我們 commit 之後,又後悔了,這時我們可以輸入:
$ git reset HEAD^
HEAD 可以想像成當前的 commit,而 ^ 代表的是當前 commit 的 前一個 commit,之後會有詳細的介紹!這邊 reset 雖說是重置,但其實可以想像是回到哪裡,也就是說我們現在回到第二次 commit的前一次 commit,也就是還沒經過第二次commit。但如果說想要回到更早的 commit,可以先用 git log
看好想要前往的commit 的 SHA-1 的前五碼,然後輸入:
$ git reset [SHA-1]
就可以取消掉一次以上的 commit了!這裡我要介紹一下參數,reset 在刪除檔案時其實有三種模式 soft、mixed、hard。用個情境幫助大家了解,假設我們創立一個新檔案叫 hello.js,之後 add 並 commit 。接著在新工作區創立一個新的檔案 gogo.js,但這裡我們不 add 也不 commit。此時我們 reset,(指令如下):
# example: git reset --soft HEAD^
$ git reset --[option] HEAD^
用表格呈現不同:
檔案名稱 | soft | mixed | hard |
---|---|---|---|
hello.js | 丟回暫存區 | 丟回目錄 | 直接不見 |
gogo.js | 仍在目錄裡 | 仍在目錄裡 | 直接不見 |
這裡我們就可以知道 hard 是非常危險的,所以要小心使用!如果真的用了 hard 的話,也是可以救的回來的,輸入:
$ git reset --hard ORIG_HEAD
就可以救回來了!但在這裡我們暫且不講 ORIG_HEAD。
commit 的真面目
首先我們先來認識 SHA-1是什麼。每當我們 commit 的時候,git 就會給予這次的 commit 一個編號。所以我們之後要查看這個 commit 狀態的話,我們就需要用到這個編號。
那 SHA-1 有可能會重複嗎? 會的!但機率超級超級低,幾乎是不可能的。另外,SHA-1 的算法是用檔案的內容,以及其他內容在計算。
接著我們要來看看 commit 是什麼!這裡我們就先不講太深,我們先知道一個大概,明天我們再深入探討 四大物件。我們先想像 commit 是一個指標,他會指向我們各版本的檔案。
這邊我用各個紀錄當作 commit,我們可以看到每個 commit 都有指向其對應的檔案,例如我們第一個 commit 指向 test.cpp。我們看到第三個 commit 可以發現他指向 test.py(2) 而不是先前的 test.py,這是因為當內容改變,git 會為檔案重新計算 SHA-1。最後我們可以看到每個 commit 之間都是相連的,這樣 git 才知道各個版本的關係!這邊只是一個很簡單的計算,明天我們會更詳細的來看這部分的內容。
小結語
今天帶大家正式將檔案交給 git 管理,但還未告訴大家如何在不同版本作切換。明天會比較著重在 git 的儲存方式,後天才會銜接回來這個部分。那我們明天見嘍!