什麼是 Git ?

  • 是一個分散式的版本控制系統 (Version Control System)
  • 有點像玩超級馬力歐,闖關一個地圖時會過好幾個旗子(紀錄目前走到的位置),Git 就是扮演這個角色,當你編輯檔案時,今天編輯明天修改內容,Git 可以幫你把編輯修改的內容存起來

為何使用 ?

  • 原始方法可能會用日期寫在檔名上 track 檔案的修改,但你能知道檔案間差在哪嗎,或者是跟同事朋友共同編輯檔案時,檔案不見或覆蓋掉時,要怎麼知道最後是誰用的
  • Git 幫助我們追蹤檔案之間的差異,包括誰在什麼時候加進來、什麼時候被修改或刪除
  • 目前業界最流行的版控

優點

  1. 免費、開源
  2. 速度快、檔案體積小 : Git 特別的設計,在於它並不是記錄版本的差異,而是記錄檔案內容的 快照 (snapshot),它可以讓 Git 在非常快速的切換版本
  3. 分散式系統 : 即使沒有網路可以連上共同的伺服器,可以在自己電腦本機運作,等有網路時再同步就可以

運作方式

git add file1.txt → file1 就會從本機 copy 一份到 staging area

git commit -m "upload file1" → file1 就會從 staging area 上傳到 repository

架構示意圖
git-workflow-img
SHA-1

Secure Hash Algorithm 1 的縮寫

是一種雜湊演算法,計算之後的結果通常會以 40 個十六進位的數字方式呈現

Git 裡所有物件的編號都是由這個產生的

基本指令

初始設定 (後來除非需要,不然不用改)

  • git config —global user.name “<user name>”
  • git config —global user.email <user email>
  • git config —global core.editor <想要用的文字編輯器 e.g. code(vs code)>
git status -s
  • 直接顯示 staging area 跟 local directory 的狀態
  • M : modified、A : added
  • 由左到右為 : staging area → local directory
git-status image
git ls-files
查看 staging area 的資料有哪些
git log —oneline

呈現所有 commit 的 ID 與訊息

git-log image
git restore —staged <file>

把 staging area 的資料返回上一步

git-restore image

後悔 commit 這個檔案 - 用 reset 指令

  • 回到上一次的 commit : git reset HEAD~git reset <上一次的 commit SHA-1 值>
  • 那拆出來的檔案跑去哪了 : 參考 Reset 模式
  • 如果沒有記得 SHA-1、又想要回到很久之前的 commit ,就可以透過 Refloggit log -g 查看 SHA-1 的值 (HEAD 移動,Git 就會在 Reflog 裡記上一筆)
ORIG_HEAD
  • .git 目錄下的檔案,當我們做出危險動作時(merge、reset、)幫我們紀錄 HEAD 資訊,讓你隨時可以跳回危險動作之前的狀態
orig-head image

使用 branch

  • git branch <branch name> : 創一個新的 branch
  • git checkout <branch name> : 切換 branch
  • git merge <branch name> : 現在 head 所在的 branch 與 <branch name> 合併
注意

分支只是一個指向某個 Commit 的指標,刪除這個指標並不會造成那些 Commit 消失

merge 發生衝突
  • 情況 : 當兩個分支對同一個檔案做修改,修改內容不一樣時,最後合併會發生衝突
  • 解決辦法
    1. 使用 GUI 看雙方的檔案哪些不一樣,雙方溝通直接在檔案上面做更改,把最後的檔案再做 git add
    2. 使用 git checkout --ours <file name> ,如果是使用對方的分支則用 —theirs
merge-conflict

U : file is Unmerged

使用 tag (不會移動的分支)

  • 是一個指向某一個 Commit 的指標
  • lightweight tag (輕量標籤 - 沒有任何其他資訊)
    • git tag <tag name> <commit SHA-1>
  • annotated tag (有附註標籤)
    • git tag <tag name> <commit SHA-1> -a -m "message"
    • 可以看到誰在什麼時候打了這張標籤 (利用 git show <tag name> )
  • 刪除 : git tag -d <tag name>

Git v.s. GitHub

一個是工具、一個是網站

GitHub Note

Reference