
Git 指令寫程式天天會用到,要查很容易,但只知道指令「做什麼」,看不到按下去之後檔案和提交到底怎麼動。網路上常見的說明也有幾處是錯的,照著理解會踩坑。
所以我把常用指令分成三篇。這篇是每天都會用到的基本功:建立倉庫、設定、add、commit、看差異和復原。第二篇是歷史、標籤、分支和合併,第三篇是遠端、stash 和救援指令。
每一節都有一個 Git 沙盒。點上面的指令按鈕,終端機會打出那行指令和輸出,下面的圖跟著變:檔案從工作目錄滑進暫存區,提交接到線上,分支標籤往前移。按「重播」可以再看一次。
沙盒是模擬的,沒有真的在跑 Git。終端機輸出照 Git 2.43 實際執行的格式整理。範例的分支名用 master,現在 GitHub 新建的倉庫預設叫 main,換個名字,指令都一樣。
先認識四個區域
Git 的指令大多是在這四個區域之間搬東西:
- 工作目錄:你在編輯器裡看到、正在改的檔案。
- 暫存區(index):下一次提交要放什麼,先排在這裡。
git add就是把檔案放進來。 - 本地倉庫:所有提交的歷史,存在
.git資料夾裡。git commit把暫存區存成一筆提交。 - 遠端:GitHub 這類伺服器上的倉庫,靠 push、fetch、pull 同步。第三篇才會用到。
沙盒的圖也是這樣分格。提交方塊上的 7 碼是 hash 的開頭;金色膠囊是分支,藍色虛線膠囊是遠端追蹤分支,綠色是標籤,實心的 HEAD 是你現在所在的位置。
建立倉庫與設定
新電腦裝好 Git,第一件事是設定名字和 email,每個提交都會記下這兩個值。加了 --global 就寫進家目錄的 ~/.gitconfig,所有專案共用。
顏色設定(color.*)那幾項,用新版 Git 的話可以直接跳過。color.ui 從 Git 1.8.4 開始預設就是 auto,輸出到終端機時自動上色。沙盒裡還是每一項都做了,想知道各自管哪個指令可以點進去看。
git clone 後面接遠端倉庫的網址,GitHub 的話就是 git clone git@github.com:帳號/專案.git。clone 下來的倉庫不用再 git init,遠端 origin 也已經設好了。
加入、提交、刪除、改名
這是每天打最多次的一組,流程很固定:改檔案,git status 看一眼,git add 挑要提交的,git commit 存起來。
幾個容易搞混的地方:
git add .只管目前資料夾以下。在子資料夾裡打,外面的修改不會被加進去。git commit -am會略過新檔案,新檔案第一次一定要自己git add。--amend是做一個新提交換掉上一個,hash 會變。還沒 push 才能放心用。git rm -r *會把整個專案從版本裡刪掉。*是 shell 展開的,Git 收到的是一整串檔名。
比對差異
git diff 最常被問的是:「我明明改了,為什麼它什麼都沒印?」通常是因為那個檔案已經 add 過了。git diff 預設比對工作目錄和暫存區,已經放進暫存區的改動要加 --cached 才看得到。
git diff origin/master..master 跟遠端有關,留到第三篇再說明。
復原
三個指令,危險程度差很多:
git checkout -- README.md丟掉單一檔案還沒 add 的修改。新版的寫法是git restore README.md。git reset --hard HEAD把暫存區和受追蹤的檔案都還原成最新提交,還沒提交的修改全部丟掉。未追蹤的新檔案不受影響,要清掉得用git clean。git revert不改寫歷史,而是新增一個反向的提交,抵銷指定提交的改動。原本的提交還在,但它加進來的程式碼或檔案會被移除。
前兩個丟掉的是還沒提交的修改,基本上救不回來,打之前先 git status 看清楚。已經 push 出去的提交要撤銷,用 revert。用 reset 改寫歷史再強制推上去,同事下次 pull 就會出問題。
這篇的指令速查
git init:在目前資料夾建立倉庫git config --global user.name、user.email:設定提交者git config --global color.*:輸出顏色,新版預設已開git config --global --unset http.proxy:刪除代理設定git clone <網址>:複製遠端倉庫git status:看目前狀態git add <檔案>、git add .:放進暫存區git commit -m、-am、--amend:提交、跳過 add 直接提交、重做上一個提交git rm、git rm -r、git mv:刪除、遞迴刪除、改名git diff、--cached、HEAD^、HEAD -- <路徑>:看差異git checkout -- <檔案>、git reset --hard HEAD、git revert <hash>:復原

留言