• Babel 插件通关秘籍
  • Git 原理详解及实用指南
  • Nest 通关秘籍
  • React 通关秘籍
  • TypeScript 全面进阶指南
  • TypeScript 类型体操通关秘籍
  • 现代CSS
  • Babel 插件通关秘籍
  • Git 原理详解及实用指南
  • Nest 通关秘籍
  • React 通关秘籍
  • TypeScript 全面进阶指南
  • TypeScript 类型体操通关秘籍
  • 现代CSS
  • Git 原理详解及实用指南

    • 1.什么是版本控制系统(VCS)
    • 2.什么是分布式版本控制系统(DVCS)
    • 3.上手 1:新公司用 Git 管理代码,怎么快速上手?
    • 4.上手 2:团队工作的基本工作模型
    • 5.进阶 1:HEAD、master 与 branch
    • 6.进阶 2:push 的本质
    • 7.进阶 3:merge:合并 commits
    • 8.进阶 4:Feature Branching:最流行的工作流
    • 9.进阶 5:关于 add
    • 10.进阶 6:看看我都改了什么
    • 11.高级 1:不喜欢 merge 的分叉?用 rebase 吧
    • 12.高级 2:刚刚提交的代码,发现写错了怎么办?
    • 13.高级 3:写错的不是最新的提交,而是倒数第二个?
    • 14.高级 4:比错还错,想直接丢弃刚写的提交?
    • 15.高级 5:想丢弃的也不是最新的提交?
    • 16.高级 6:代码已经 push 上去了才发现写错?
    • 17.高级 7:reset 的本质——不止可以撤销提交
    • 18.高级 8:checkout 的本质
    • 19.高级 9:紧急情况:「立即给我打个包,现在马上!」
    • 20.高级 10:branch 删过了才想起来有用?
    • 21.额外说点:.gitignore——排除不想被管理的文件和目录
    • 22.总结

高级 8:checkout 的本质

在前面的 branch 的部分,我说到 checkout 可以用来切换 branch:

git checkout branch2

checkout

不过实质上,checkout 并不止可以切换 branch。checkout 本质上的功能其实是:签出( checkout )指定的 commit。

git checkout branch名 的本质,其实是把 HEAD 指向指定的 branch,然后签出这个 branch 所对应的 commit 的工作目录。所以同样的,checkout 的目标也可以不是 branch,而直接指定某个 commit:

git checkout HEAD^^
git checkout master~5
git checkout 78a4bc
git checkout 78a4bc^

这些都是可以的。

另外,如果你留心的话可能会发现,在 git status 的提示语中,Git 会告诉你可以用 checkout -- 文件名 的格式,通过「签出」的方式来撤销指定文件的修改:

小结

这节的内容是对 checkout 的本质进行简述:

checkout 的本质是签出指定的 commit,所以你不止可以切换 branch,也可以直接指定 commit 作为参数,来把 HEAD 移动到指定的 commit。

checkout 和 reset 的不同

checkout 和 reset 都可以切换 HEAD 的位置,它们除了有许多细节的差异外,最大的区别在于:reset 在移动 HEAD 时会带着它所指向的 branch 一起移动,而 checkout 不会。当你用 checkout 指向其他地方的时候,HEAD 和 它所指向的 branch 就自动脱离了。

事实上,checkout 有一个专门用来只让 HEAD 和 branch 脱离而不移动 HEAD 的用法:

git checkout --detach

执行这行代码,Git 就会把 HEAD 和 branch 脱离,直接指向当前 commit:

git checkout --detach

上次更新: 6/21/25, 9:42 AM
贡献者: YNight
Prev
17.高级 7:reset 的本质——不止可以撤销提交
Next
19.高级 9:紧急情况:「立即给我打个包,现在马上!」