ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

15-checkout 的本质

15-checkout 的本质 在前面的branch的部分介绍过checkout可以用来切换branchgit checkout branch2不过实质上checkout并不止可以切换branch。checkout本质功能其实是签出checkout指定的commit。git checkout branch名的本质其实是让HEAD指向对应的branch然后签出这个branch对应commit的工作目录。同样的checkout的目标也可以不是branch而是直接指向某个commitgit checkout HEAD^^git checkout master~5git checkout 78a4bcgit checkout 78a4bc^这些都是可以的。另外如果你留心的话可能会发现在git status的提示信息中Git 会告诉你可以用checkout -- 文件名的格式通过「签出」的方式来撤销丢弃指定文件的修改切换分支‌切换到已有分支‌git checkout 分支名就能跳到目标分支工作区文件会自动更新成该分支的内容 。‌创建并切换新分支‌git checkout -b 新分支名一键创建新分支并切过去相当于先建分支再切换两步合为一步 。‌切换到远程分支‌git checkout -t origin/分支名能从远程仓库检出分支并在本地创建跟踪分支 。‌进入分离头指针状态‌git checkout commit-SHA会进入detached HEAD状态适合查看历史代码或调试旧版本但在此状态下提交的内容不会关联到任何分支 。‌‌‌恢复文件版本‌丢弃未提交的修改‌git checkout --文件名把文件恢复到最近一次提交或暂存的状态本地未提交的改动会永久丢失 。‌从其他分支恢复文件‌git checkout 分支名 --文件名把指定分支上的某个文件复制到当前分支无需合并整个分支 。‌恢复已删除文件‌如果文件被误删但未提交用git checkout HEAD --文件名能从最后一次提交中恢复 。‌交互式恢复部分代码‌加上-p参数如git checkout -p --文件名可以逐块选择要恢复的代码适合只想撤销部分改动的场景 。‌‌‌需要注意的地方‌未提交修改会阻止切换‌如果工作区有与目标分支冲突的未提交修改Git 会阻止切换建议先用git stash暂存或提交后再切换 。‌强制切换会丢数据‌使用-f参数如git checkout -f 分支名会强制切换并丢弃所有未提交修改操作前务必确认 。‌新命令更清晰‌Git 2.23 版本后引入了git switch专门切换分支、git restore专门恢复文件语义更明确但checkout仍被广泛使用 。‌文件名与分支名冲突‌如果有个文件名叫hello.c同时也有个分支叫hello.cGit 会优先当作分支处理此时需用git checkout -- hello.c明确指定是文件 。‌‌‌checkout 和 reset 的不同checkout和reset都可以切换HEAD的位置它们除了有许多细节的差异外最大的区别在于reset在移动HEAD时会带着它所指向的branch一起移动而checkout不会。当你用checkout指向其他地方的时候HEAD和它所指向的branch就自动脱离了。事实上checkout有一个专门用来只让HEAD和branch脱离而不移动HEAD的用法git checkout --detach执行这行代码Git 就会把HEAD和branch脱离直接指向当前commit小结checkout的本质是签出指定的commit所以你不止可以切换branch也可以直接指定commit的 SHA-1 作为参数来把HEAD移动到指定的commit。
返回列表