git checkout 对工作目录的影响

问题的提出

本文要讨论的是:当我们用git checkout <branch_name>命令切换分支时,如果有未提交的修改,会发生什么?

如果当前工作区的状态是“clean”,那么切换到其他分支是很容易的。但是,如果有未提交的修改,也许就不能顺利地切换过去,Git 会给出错误信息。例如:

 $ git branchbug/pr-1bug/pr-2dev* master$ git checkout deverror: Your local changes to the following files would be overwritten by checkout:NewStuffPlease, commit your changes or stash them before you can switch branches.Aborting

Git 提示我们:要么提交所有的修改,要么用 stash 命名把这些修改储藏起来。

让人费解的是,Git 也不是每一次都这样阻止我们切换分支。比如当我们基于活跃分支的最近一次提交创建一个新分支的时候,不管本地有没有未提交的修改,我们都可以切换到新分支,这又是为何呢?

原理初探

假设你当前在分支 branch1, 你想切换到分支 branch2,于是你输入命令

git checkout branch2

对于你的工作区来说,这条命令意味着什么呢?

  1. 对于每一个在分支1但是不在分支2的文件,Git 会删除它们;
  2. 对于每一个在分支2但是不在分支1中的文件,Git 会创建它们(用合适的内容);
  3. 对于每一个既在分支1又在分支2的文件,如果版本不同,那么 Git 会更新工作区的文件,使之和分支2的版本匹配。

上面的每一步都有可能破坏你当前的工作区(工作区和暂存区对于每个分支是共用的)。

对于1,删除一个文件,如果这个文件在工作区的版本和它在分支1的版本是一致的,那么删除它就是安全的;如果你修改了它,还没有提交,那么删除就是不安全的;

对于2,创建一个文件,如果工作区还不存在这个文件,那就是安全的;如果工作区已经有这个文件,但是内容是“错”的,那么就不安全;

对于3,如果这个文件已经提交,那么就是安全的;如果被修改了,且没有提交,那么就不安全;

注意:用命令git checkout -b <newbranch>创建并切换到一个新分支总是“安全”的:没有文件被创建,也没有文件被删除,也没有文件被更新,索引也没有任何改变。

但是用git checkout -b <newbranch> <start_point>就不一样了。Git 会应用上述的安全检查规则。


参考资料

https://stackoverflow.com/questions/22053757/checkout-another-branch-when-there-are-uncommitted-changes-on-the-current-branch

git checkout 对工作目录的影响 —— Git 学习笔记 21相关推荐

  1. git 工程工作目录下的git相关文件解释

    git 工程工作目录: 首先看下 gitreview [gerrit] host=10.37.77.181 port=29418 project=volcano.git 里面是git本地服务的ip和端 ...

  2. 【目录】Django-2.0 学习笔记

    django 学习笔记目录 web应用-http协议-web框架 django 简介 django-2 的路由层 django 的视图层 django 模板层template django 模型层or ...

  3. MapReduce工作原理详解(学习笔记)

    本文参考以下文章,作出归纳总结,以供日后参阅. [1] https://blog.csdn.net/zhengwei223/article/details/78304764 [2] https://w ...

  4. SAP在物流工作中的应用之学习笔记

    1.SAP SAP是一个德国的ERP软件,在很多外资企业,不管是制造工厂.贸易公司还是物流公司,都广泛的被使用.它在很大程度上影响甚至决定了这些企业的业务流程.组织架构和岗位设置. 2.END USE ...

  5. 《浏览器工作原理与实践》学习笔记

    浏览器原理 前言 本文是学习李兵老师的<浏览器工作原理与实践>过程中记录笔记,详细链接见文末 进程vs线程 进程:一个应用程序的运行实例就是一个进程,详细来说就是:启动一个应用程序的时候, ...

  6. Python学习笔记(21)-目录遍历

    点此查看 零基础Python全栈文章目录及源码下载 本文目录 1. 简介 2. 实例 1. 简介 遍历一个目录下所有的文件夹和文件是非常有用的事情,在python中os模块提供了非常简单易行的遍历方法 ...

  7. 目录穿越/遍历漏洞 -- 学习笔记

    目录 什么是目录遍历? 漏洞原理 实验 0x00  基础目录遍历 0x01  绝对路径 0x02  双写../绕过 0x03  URL编码绕过 0x04  绝对路径配合../ 0x05  截断文件后缀 ...

  8. Git超详细学习笔记 手把手带你一步一步操作 -- 详细分析git 对象-域-分支以及github使用

    Git 使用笔记 详细的说明文档: 请参考安装目录下的doc文档 D:\Program Files\Git\mingw64\share\doc\git-doc\git-stash.html git 版 ...

  9. Git之深入解析如何贮藏工作分支与清理工作目录

    一.前言 了解了管理或者维护 Git 仓库.实现代码控制所需的大多数日常命令和工作流程,尝试跟了踪和提交文件的基本操作,并且掌握了暂存区和轻量级地分支及合并的威力.如果想进一步对 Git 深入学习,可 ...

最新文章

  1. 关于编程的浅学习与深学习
  2. python输入函数后无法运行_python - 如何在函数运行期间忽略所有用户输入?_python_酷徒编程知识库...
  3. Redis运维优化的陷阱及避坑指南
  4. 通俗易懂理解GBDT算法原理-转
  5. 大脑是怎样和身体交流的?
  6. python条件语句-Python if else条件语句详解
  7. 《数据库原理与应用(第3版)》——1.4 数据库系统的组成
  8. java操作mongodb_Java操作MongoDB
  9. 微软官方工具_时隔20年再出发!微软官方推出最强Windows工具集
  10. java EXCEL或WORD转PDF转图片(base64)
  11. 干部人事数字档案管理系统,实现从“纸件”到“指尖”的安全蜕变
  12. 姓氏头像制作生成头像组合微信小程序源码
  13. matlab设计计算器,MATLAB-计算器的设计.doc
  14. Web2.0与Web3.0的区别是什么
  15. android banner设置图片比例,Banner基本使用 2.1.0
  16. 在Windows本地安装ElasticSearch和Kibana
  17. 西南大学网络作业答案计算机,2019西南大学继续教育学院《计算机基础》作业答案...
  18. java timeunit_java – 了解TimeUnit
  19. String常用方法!
  20. 使用ICSharpCode.SharpZipLib对文件进行压缩或解压

热门文章

  1. C++ 之 贪吃蛇
  2. 各常用分类算法的优缺点总结:DT/ANN/KNN/SVM/GA/Bayes/Adaboosting/Rocchio
  3. C# 程序执行时间差
  4. linux 系统调用分析
  5. python取出字典中的所有值的两种方法
  6. ACM学习历程—Hihocoder [Offer收割]编程练习赛1
  7. tomcat下list所有文件的目录
  8. 『转载』|收藏|一张看懂AI知识体系
  9. Linux之特殊权限(SUID/SGID/SBIT)
  10. 莱斯分布概率分布曲线