Git 指令圖解(一):init、add、commit、diff 和復原,每個指令都能按下去看

整理了 Git 指令,第一篇是 init、config、clone、add、commit、diff 和復原,每個指令都配一個互動沙盒,點下去就看得到檔案和提交怎麼移動。

Git 指令圖解(一):init、add、commit、diff 和復原,每個指令都能按下去看
Git 指令圖解第一篇封面:工作目錄、暫存區和一條提交線
Git 指令圖解第一篇封面:工作目錄、暫存區和一條提交線

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 init、git config 和 git clone

git clone 後面接遠端倉庫的網址,GitHub 的話就是 git clone git@github.com:帳號/專案.git。clone 下來的倉庫不用再 git init,遠端 origin 也已經設好了。

加入、提交、刪除、改名

這是每天打最多次的一組,流程很固定:改檔案,git status 看一眼,git add 挑要提交的,git commit 存起來。

互動示範:status、add、commit、rm、mv

幾個容易搞混的地方:

  • git add . 只管目前資料夾以下。在子資料夾裡打,外面的修改不會被加進去。
  • git commit -am 會略過新檔案,新檔案第一次一定要自己 git add。
  • --amend 是做一個新提交換掉上一個,hash 會變。還沒 push 才能放心用。
  • git rm -r * 會把整個專案從版本裡刪掉。* 是 shell 展開的,Git 收到的是一整串檔名。

比對差異

git diff 最常被問的是:「我明明改了,為什麼它什麼都沒印?」通常是因為那個檔案已經 add 過了。git diff 預設比對工作目錄和暫存區,已經放進暫存區的改動要加 --cached 才看得到。

互動示範:git diff、--cached、HEAD^ 和指定路徑

git diff origin/master..master 跟遠端有關,留到第三篇再說明。

復原

三個指令,危險程度差很多:

  • git checkout -- README.md 丟掉單一檔案還沒 add 的修改。新版的寫法是 git restore README.md。
  • git reset --hard HEAD 把暫存區和受追蹤的檔案都還原成最新提交,還沒提交的修改全部丟掉。未追蹤的新檔案不受影響,要清掉得用 git clean。
  • git revert 不改寫歷史,而是新增一個反向的提交,抵銷指定提交的改動。原本的提交還在,但它加進來的程式碼或檔案會被移除。
互動示範:checkout --、reset --hard、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>:復原

下一篇:Git 指令圖解(二):log、tag、分支和合併

作者

碼力獅 MaliLion

用 AI 與程式公開打造遊戲、工具和 3D 世界,一次一個 Side Project。

#Git#教學#版本控制#互動圖解
回到所有文章

留言