返回

从对比 Git 中的 Reset 与 Checkout,看 Git 的妙用

开发工具

导语

最近看了 Pro Git 中关于 Reset 和 Checkout 这两个指令的介绍,觉得可以从中学到一些 Git 的运行机制,在此做个记录。在具体讲这两个指令之前,先说一些 Git 的背景知识。

Git 有 3 个文件存储区,分别对应的是 HEAD,Index,还有就是 Wo…

Git 的基本概念

在继续之前,先简单介绍一些 Git 的基本概念。

  • 工作区(Working Tree) :这是你实际编辑和修改文件的地方。
  • 暂存区(Staging Area) :这是一个临时存储区,用于暂存准备提交到仓库的文件。
  • 仓库(Repository) :这是 Git 存储所有版本历史记录的地方。
  • 分支(Branch) :分支是仓库中不同版本历史记录的指针。
  • 合并(Merge) :将两个或多个分支合并为一个分支。
  • Cherry-pick :从另一个分支中选择性地挑选提交并应用到当前分支。
  • Git stash :将当前工作区的文件临时保存起来,以便以后再恢复。
  • 回滚(Revert) :撤消某个提交,但不会删除提交的历史记录。

Reset 和 Checkout 的区别

Reset 用于将当前分支的 HEAD 指针重置到某个特定的提交,而 Checkout 用于切换到另一个分支或提交。

Reset

Reset 会将当前分支的 HEAD 指针重置到某个特定的提交,这意味着当前分支的最新提交将被回退到那个提交。这可能会导致工作区的更改丢失,因此在使用 Reset 命令之前,务必备份你的工作。

Reset 有两种常用的形式:

  • 硬重置(Hard Reset) :硬重置会将 HEAD 指针直接重置到指定的提交,而不会保留任何本地更改。这可能会导致工作区的更改丢失。
  • 软重置(Soft Reset) :软重置会将 HEAD 指针重置到指定的提交,但会保留本地更改。这不会导致工作区的更改丢失。

Checkout

Checkout 用于切换到另一个分支或提交。这不会影响当前分支的 HEAD 指针,但会将工作区的文件替换为所选分支或提交的文件。

Checkout 有两种常用的形式:

  • 普通签出(Normal Checkout) :普通签出会将工作区的文件替换为所选分支或提交的文件。
  • 分离式签出(Detached Head Checkout) :分离式签出会将 HEAD 指针移动到所选分支或提交,但不会将工作区的文件替换为所选分支或提交的文件。这允许你检查其他分支或提交的文件,而不会影响当前分支。

Reset 和 Checkout 的对比

下表对比了 Reset 和 Checkout 的主要区别:

特征 Reset Checkout
目的 将当前分支的 HEAD 指针重置到某个特定的提交 切换到另一个分支或提交
影响 可能导致工作区的更改丢失 不影响工作区的更改
类型 硬重置和软重置 普通签出和分离式签出
用法 git reset [commit-ish] git checkout [branch-ish]

结语

Reset 和 Checkout 都是 Git 中重要的命令,它们可以帮助你管理分支和提交。了解这两个命令的区别非常重要,这样你才能正确地使用它们来管理你的 Git 仓库。