內容標題

  1. 管理檔案
  2. 查看狀態
  3. commit 的真面目
  4. 後悔 commit
  5. 小結語
  6. 參考資料

管裡檔案

我們今天要來認識 git 是怎麼管理檔案的。開始之前我們先在桌面建立資料夾叫 git_pratice 以當作我們練習用的資料夾 (玩壞也沒關係XD)。
當我們要把檔案交給 git 時,我們要告訴 git 說這個資料夾現在交給你啦!於是我們需要輸入指令:

$ git init

此時,git 會在這個目錄底下建立一個 .git 檔案。這檔案是隱藏檔案,平常是不會看到的。但還是記得不要刪掉這個檔案。 如果想要查看隱藏檔 mac 看這邊 windows 看這邊

drawing

上面圖案是關於 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 管理了。

那難道說我們每增加一個檔案,就要 addcommit 一次嗎? 當然不用!既然是暫存區,是可以存入很多檔案的,之後在一次 commit 出去。 來看個例子吧!

我們這次創立兩個檔案 test.ctest.py。我們可以把這兩個檔案先加到暫存區

$ git add test.c test.py

之後再一次 commit

$ git commit -m "Second commit"

第二版成立,此時我們全部檔案都交給 git 管理了。也就是說我們現在資料夾總共有兩種版本,只有 test.cpp 和有 test.cpp, test.c, test.py 兩種版本。另外,如果資料被修改過,git 會把他視為新的檔案,所以要重新 addcommit 喔!

查看狀態

我們剛剛的動作只是把檔案交給 git ,但還沒從 git 那裡獲得資訊。最常見的兩種查看的狀態指令有 git statusgit log

  1. git status
    這個指令會告訴使用者目前檔案的狀態,例如說有哪些檔案是新增但還沒加入修改但還沒加入在暫存區的檔案。首先我們新增 test.js 和 修改 test.py 的內容 (隨便改或刪都沒關係,但要留內容) 。
    $ ls
    test.c      test.cpp    test.js     test.py
    
    接著我們輸入:
    $ git status
    
    會看到:

    drawing
    首先,我們可以看到 test.py 前有一個 modified:,代表是更改的檔案。確實git把他當成一個新的 物件 來看!再來,test.js 的前幾行有一個 Untracked files:,代表是還未加入過的檔案。我們現在同樣 addcommit
    $ git add test.py test.js
    $ git commit -m "Add test.js and modified test.py"
    
    接著再跑一次 git status

    drawing
    代表說檔案的資料都加進儲存庫了。另外,如果只有 addgit status 也會提示你喔~
  2. git log
    這個指令主要是要來看我們每個 commit 的資訊。輸入:
    $  git log
    
    會看到:

    drawing
    最底下的是最先 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 看好想要前往commitSHA-1 的前五碼,然後輸入:

$ git reset [SHA-1]

就可以取消掉一次以上的 commit了!這裡我要介紹一下參數,reset 在刪除檔案時其實有三種模式 soft、mixed、hard。用個情境幫助大家了解,假設我們創立一個新檔案叫 hello.js,之後 addcommit 。接著在新工作區創立一個新的檔案 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 是一個指標,他會指向我們各版本的檔案。

drawing
這邊我用各個紀錄當作 commit,我們可以看到每個 commit 都有指向其對應的檔案,例如我們第一個 commit 指向 test.cpp。我們看到第三個 commit 可以發現他指向 test.py(2) 而不是先前的 test.py,這是因為當內容改變,git 會為檔案重新計算 SHA-1。最後我們可以看到每個 commit 之間都是相連的,這樣 git 才知道各個版本的關係!這邊只是一個很簡單的計算,明天我們會更詳細的來看這部分的內容。

小結語

今天帶大家正式將檔案交給 git 管理,但還未告訴大家如何在不同版本作切換。明天會比較著重在 git 的儲存方式,後天才會銜接回來這個部分。那我們明天見嘍!

參考資料

  1. 為你自己學 Git [高見龍 著]
  2. missing semester from MIT
  3. is-it-possible-to-get-identical-sha1-hash (stack overflow)
#Git







你可能感興趣的文章

[SQL] 兩組日期區間進行比較

[SQL] 兩組日期區間進行比較

程式導師實驗計畫 Week6 作業與解答

程式導師實驗計畫 Week6 作業與解答

[Linux] Windows安裝Wsl2 + Ubuntu22.04 + Docker +Oracle

[Linux] Windows安裝Wsl2 + Ubuntu22.04 + Docker +Oracle






留言討論