Git Checkout / Switch / Restore 比較

前言

git checkout 原本的功能有:

  • 切換分支
  • 檔案管理

雖然兩者只是一個功能的一體兩面(從特定分支拿取特定檔案),但大多時候我們使用的時候會避免在一個指令進行太多邏輯操作,所以大多都只用到切換分支或是檔案管理其中一個。
而且說實在,checkout 一個檔案實在不是一個語意上很直觀的說法。

因此在 2019 年底的 git 2.23 版本,釋出了兩個新指令:git switchgit restore,來切分 git checkout 的龐大工作量。

從名稱就可以大略知道:

  • git switch 是用來切換分支
  • git restore 是用來管理檔案

新舊指令對照

Git Switch

# 切換分支
git checkout <branch>
git switch <branch>

# 強制切換分支(=切換 + reset --hard,丟棄所有變更)
git checkout -f <branch>
git switch -f <branch>

# 切換 commit(d: detach,會讓 HEAD 進入到非分支的狀態)
git checkout <hash>
git switch -d <hash>

# 創建分支,並切換過去
git checkout -b <new_branch>
git switch -c <new_branch>  # c for create

Git Restore

# 復原工作區的檔案
git checkout -- some_file
git restore some_file
git restore --worktree some_file  # (a)

# 取消 add,從暫存區移出
git reset -- some_file
git restore --staged -- some_file  # (b)

# 復原暫存區檔案
git checkout HEAD -- some_file
git restore --staged --worktree main test.txt  # (a) + (b),一次走兩步

# 從別的 commit 拿檔案
git checkout <hash/branch> -- some_file
git restore -s <hash/branch> some_file  # s for source

# 互動式復原:-p
git checkout -p -- some_file
git restore -p some_file

小結

可以發現新的兩個指令和 checkout 比較大的差異分別是:

  • git switch 把對於特定 commit hash 的切換放進了 -d option 內
  • git restore 可以直接接受檔案作為 input,不用加上 --,但代價就是指定分支時需要塞到 -s 選項內

習慣使用 checkout 的,可以繼續使用,但我覺得 switchrestore 蠻推薦給初學者使用的,學習門檻比複雜的 checkout 本身低很多。

(但其實一般初學者可能也只知道 git checkout 的切換分支功能吧 XD)

參考資料

官方文件