前言
git checkout 原本的功能有:
- 切換分支
- 檔案管理
雖然兩者只是一個功能的一體兩面(從特定分支拿取特定檔案),但大多時候我們使用的時候會避免在一個指令進行太多邏輯操作,所以大多都只用到切換分支或是檔案管理其中一個。
而且說實在,checkout
一個檔案實在不是一個語意上很直觀的說法。
因此在 2019 年底的 git 2.23 版本,釋出了兩個新指令:git switch
和 git 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
的,可以繼續使用,但我覺得 switch
和 restore
蠻推薦給初學者使用的,學習門檻比複雜的 checkout
本身低很多。
(但其實一般初學者可能也只知道 git checkout
的切換分支功能吧 XD)
參考資料
官方文件
本文原創部分採用
創用 CC 姓名標示-非商業性-禁止改作 4.0 國際授權條款
授權。