当前位置: 首页 > news >正文

15-checkout 的本质

在前面的branch的部分介绍过checkout可以用来切换branch

git checkout branch2

不过实质上,checkout并不止可以切换branchcheckout本质功能其实是:签出(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 -- 文件名的格式,通过「签出」的方式来撤销(丢弃)指定文件的修改:

切换分支

  1. 切换到已有分支‌:git checkout <分支名>就能跳到目标分支,工作区文件会自动更新成该分支的内容 。
  2. 创建并切换新分支‌:git checkout -b <新分支名>一键创建新分支并切过去,相当于先建分支再切换两步合为一步 。
  3. 切换到远程分支‌:git checkout -t origin/<分支名>能从远程仓库检出分支并在本地创建跟踪分支 。
  4. 进入分离头指针状态‌:git checkout <commit-SHA>会进入detached HEAD状态,适合查看历史代码或调试旧版本,但在此状态下提交的内容不会关联到任何分支 。‌‌‌

恢复文件版本

  1. 丢弃未提交的修改‌:git checkout --<文件名>把文件恢复到最近一次提交或暂存的状态,本地未提交的改动会永久丢失 。
  2. 从其他分支恢复文件‌:git checkout <分支名> --<文件名>把指定分支上的某个文件复制到当前分支,无需合并整个分支 。
  3. 恢复已删除文件‌:如果文件被误删但未提交,用git checkout HEAD --<文件名>能从最后一次提交中恢复 。
  4. 交互式恢复部分代码‌:加上-p参数如git checkout -p --<文件名>可以逐块选择要恢复的代码,适合只想撤销部分改动的场景 。‌‌‌

需要注意的地方

  1. 未提交修改会阻止切换‌:如果工作区有与目标分支冲突的未提交修改,Git 会阻止切换,建议先用git stash暂存或提交后再切换 。
  2. 强制切换会丢数据‌:使用-f参数如git checkout -f <分支名>会强制切换并丢弃所有未提交修改,操作前务必确认 。
  3. 新命令更清晰‌:Git 2.23 版本后引入了git switch专门切换分支、git restore专门恢复文件,语义更明确,但checkout仍被广泛使用 。
  4. 文件名与分支名冲突‌:如果有个文件名叫hello.c同时也有个分支叫hello.c,Git 会优先当作分支处理,此时需用git checkout -- hello.c明确指定是文件 。‌‌‌

checkout 和 reset 的不同

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

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

git checkout --detach

执行这行代码,Git 就会把HEADbranch脱离,直接指向当前commit

小结

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

http://www.jsqmd.com/news/1380378/

相关文章:

  • 2026大庆外墙漏水避坑指南 - 管道一点通
  • 终极鼠标模拟指南:用Move Mouse免费工具防止电脑自动锁屏
  • ▲基于QLearning强化学习的认知雷达自适应波形选择算法matlab仿真
  • 如何利用Dalamud框架轻松开发FF14专属插件:从零到精通的完整指南
  • 高效刷题笔记:提升算法能力的系统方法
  • PKC 第 072 个开关:不领私聊利是的位置、验证方法与风险边界
  • 手机Gemini导出表格,还在手动修格式?“AI 导出鸭”一键搞定批量转档
  • 小白程序员必看:如何通过AI大模型应用开发实现高薪就业?
  • 动漫追番工具技术解析:从资源聚合到高清播放的工程实践
  • 如何解决企业级OCR集成难题:基于RapidOCR-Java的高性能跨平台文字识别实践
  • 如何轻松解密网易云音乐NCM格式:3分钟搞定Windows版ncmdumpGUI使用指南
  • 从脚本到工程化:为Workflow注入CI/CD基因的实战指南
  • Nginx的基本概念(由浅入深)
  • 向量检索 Benchmark:先固定标注,再调召回和延迟
  • Microsoft Agent Framework(.NET) - 尝试一下从MCP Server上获取Agent Skills
  • NumPy金融函数实战指南:从现金流估值到贷款计算
  • Go-CGO编程实战从Go调用C到性能敏感场景的混合编程
  • 大模型供应商API端点兼容协议
  • OpenRGB终极指南:一个软件统一控制所有RGB设备,告别多软件烦恼
  • 【研发类-测试开发Skills】bats-testing-patterns 技能
  • 基于ProseMirror与Remark构建类Typora的Web Markdown编辑器
  • PKC 第 102 个开关:跨端命令的位置、验证方法与风险边界
  • 无锡德耳斯应对重度甲醛超标:多层污染源分步治理方法解析 - 德耳斯
  • LangChain 1.x 快速上手:从核心概念到智能体实战开发指南
  • 小白程序员必看:轻松学会大模型幻觉消除法,即插即用提升效果!
  • ASP.NET实现高效文件夹上传的技术方案与实践
  • 杰理之关闭打印后,编译失败【篇】
  • 3分钟掌握:Blender 3MF插件终极指南
  • Python阶乘实现全解析:从基础循环到高阶函数与性能优化
  • Godot卡牌游戏框架:一小时搭建可交互对战原型