開發人員在開始使用 Git 時首先學習的命令之一是 git checkout。然而,git checkout 是一個眾所周知的重載指令。它處理太多的責任,這使得它成為初學者和經驗豐富的開發人員造成混亂和意外文件遺失的常見原因。
為了解決這個問題,Git 2.23 版本(2019 年發布)引入了兩個專用的、以任務為中心的替代方案:git switch 和 git restore。
在本文中,我們將討論圍繞 git checkout 的設計問題,解釋新命令的作用,並向您展示如何過渡到今天使用它們。
1. 問題:git checkout 的重載性質
git checkout 的主要問題是它將兩個完全不同的操作組合到一個命令中:管理分支和恢復檔案。
切換分支:
# Switches your workspace to feature-branch
git checkout feature-branch
放棄未提交的文件更改:
# Wipes local changes to main.js, reverting it to the last commit
git checkout -- main.js
這種雙重性質帶來了風險。例如,如果您輸入 git checkout feature 希望恢復名為 feature 的本機文件,但您也碰巧有一個名為 feature 的分支,Git 將切換您的活動分支而不是重置該文件。
2. 解決方案:特定功能的命令
為了解決歧義,Git 將功能拆分為兩個獨立的實用程式。
3. 與 git switch 進行分支交換
git switch 專門關注分支導航。除非有要求,否則它不會觸及您未提交的文件內容。
常用命令:
# Switch to an existing branch
git switch feature-branch
# Create a new branch and switch to it (replaces checkout -b)
git switch -c new-feature-branch
# Switch back to the previous branch (replaces checkout -)
git switch -
4. 使用 git restore 恢復檔案更改
git restore 旨在將工作目錄或暫存區域中的檔案重設為先前提交的狀態。
常用命令:
# Discard local unstaged changes to a file (replaces checkout --)
git restore src/main.js
# Unstage a file you added via git add (replaces git reset HEAD)
git restore --staged src/main.js
# Unstage and discard changes to a file at the same time
git restore --source=HEAD --staged --worktree src/main.js
5. 為什麼你應該採取行動
- 提高安全性: 將檔案修改操作與分支指標移動分開有助於防止本地工作的意外遺失。
- 更好的開發人員人體工學:
名稱
switch和restore明確描述了它們的作用。這減少了認知開銷,並使團隊成員的 Git 訓練變得更加容易。
儘管 Git 繼續支援 git checkout 以實現向後相容性,但主要文件項目和 GUI 工具已過渡到新語法。
結論
為了獲得更安全、更直覺的 Git 工作流程,請逐步淘汰 git checkout,轉而使用專門的替代方案:
- **使用
git switch進行分支指標更新。 ** - **使用
git restore進行工作區檔案還原。 **
採用這些命令可以使您與 Git 的交互更加可預測。

