Featured image of post 从 git checkout 迁移到 git switch 和恢复Featured image of post 从 git checkout 迁移到 git switch 和恢复

从 git checkout 迁移到 git switch 和恢复

了解更清晰的命令定义: git switch 交换活动分支, git Restore 放弃未暂存的修改。

开发人员在开始使用 Git 时首先学习的命令之一是 git checkout。然而,git checkout 是一个众所周知的重载命令。它处理太多的责任,这使得它成为初学者和经验丰富的开发人员造成混乱和意外文件丢失的常见原因。

为了解决这个问题,Git 2.23 版本(2019 年发布)引入了两个专用的、以任务为中心的替代方案:git switchgit 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. 为什么你应该采取行动

  • 提高安全性: 将文件修改操作与分支指针移动分开有助于防止本地工作的意外丢失。
  • 更好的开发人员人体工程学: 名称 switchrestore 明确描述了它们的作用。这减少了认知开销,并使团队成员的 Git 培训变得更加容易。

尽管 Git 继续支持 git checkout 以实现向后兼容性,但主要文档项目和 GUI 工具已过渡到新语法。


结论

为了获得更安全、更直观的 Git 工作流程,请逐步淘汰 git checkout,转而使用专门的替代方案:

  1. 使用 git switch 进行分支指针更新。
  2. 使用 git restore 进行工作区文件还原。

采用这些命令可以使您与 Git 的交互更加可预测。