Git Note

Posted on Feb 19, 2022 by Allen
Self-learning Version control

什麼是 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)>

  • 直接顯示 staging area 跟 local directory 的狀態
  • M : modified、A : added
  • 由左到右為 : staging area → local directory
  • git-status image

    查看 staging area 的資料有哪些

    呈現所有 commit 的 ID 與訊息

    git-log image

    把 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 裡記上一筆)
    • .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 消失

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

        U : file is Unmerged

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


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

    Git v.s. GitHub


    一個是工具、一個是網站

    GitHub Note

    Reference


    Note

    真的是一個必學的版本控制,利用 Git 讓我的程式碼變得很好管理