Git Note
Posted on Feb 19, 2022 by Allen
Self-learning
Version control
什麼是 Git ?
- 是一個分散式的版本控制系統 (Version Control System)
- 有點像玩超級馬力歐,闖關一個地圖時會過好幾個旗子(紀錄目前走到的位置),Git 就是扮演這個角色,當你編輯檔案時,今天編輯明天修改內容,Git 可以幫你把編輯修改的內容存起來
為何使用 ?
- 原始方法可能會用日期寫在檔名上 track 檔案的修改,但你能知道檔案間差在哪嗎,或者是跟同事朋友共同編輯檔案時,檔案不見或覆蓋掉時,要怎麼知道最後是誰用的
- Git 幫助我們追蹤檔案之間的差異,包括誰在什麼時候加進來、什麼時候被修改或刪除
- 目前業界最流行的版控
優點
- 免費、開源
- 速度快、檔案體積小 : Git 特別的設計,在於它並不是記錄版本的差異,而是記錄檔案內容的 快照 (snapshot),它可以讓 Git 在非常快速的切換版本
- 分散式系統 : 即使沒有網路可以連上共同的伺服器,可以在自己電腦本機運作,等有網路時再同步就可以
運作方式
git add file1.txt → file1 就會從本機 copy 一份到 staging area
git commit -m "upload file1" → file1 就會從 staging area 上傳到 repository
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 的資料有哪些
後悔 commit 這個檔案 - 用 reset 指令
- 回到上一次的 commit : git reset HEAD~ 、 git reset <上一次的 commit SHA-1 值>
- 那拆出來的檔案跑去哪了 : 參考 Reset 模式
- 如果沒有記得 SHA-1、又想要回到很久之前的 commit ,就可以透過 Reflog 或 git log -g 查看 SHA-1 的值 (HEAD 移動,Git 就會在 Reflog 裡記上一筆)
- 為 .git 目錄下的檔案,當我們做出危險動作時(merge、reset、)幫我們紀錄 HEAD 資訊,讓你隨時可以跳回危險動作之前的狀態
使用 branch
- git branch <branch name> : 創一個新的 branch
- git checkout <branch name> : 切換 branch
- git merge <branch name> : 現在 head 所在的 branch 與 <branch name> 合併
注意
分支只是一個指向某個 Commit 的指標,刪除這個指標並不會造成那些 Commit 消失
- 情況 : 當兩個分支對同一個檔案做修改,修改內容不一樣時,最後合併會發生衝突
- 解決辦法
- 使用 GUI 看雙方的檔案哪些不一樣,雙方溝通直接在檔案上面做更改,把最後的檔案再做 git add
- 使用 git checkout --ours <file name> ,如果是使用對方的分支則用 —theirs
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