上图是我对git常用用法的一个总结,今天这里主要解释上面操作中没有的 " git checkout "操作。

====================================================

git checkout 最常用的方法就是创建新分支和切换分支:

git checkout -b 新分支名           ,创建新分支并切换到所创建分支上;

git checkout 分支名                    ,切换分支;

git checkout -f 分支名                 ,强制切换分支;

git checkout -B 已存在的分支名,强制覆盖已有的分支;

git checkout -b <new-branch> <existing-branch>     

在已存在的分支<existing-branch>基础上创建名为<new-branch>的新分支。

-----------------------------------------------------

如果两个分支是同一个分支分出来的,并且两个分支中至少有一个分支已经有了新的commit:

使用“ git checkout 分支名” 进行分支切换需要尽量保证当前分支下工作区内容、暂存区内容、版本库中最新提交内容保持一致,因为分支切换时原分支中如果工作区内容、暂存区内容、版本库中最新提交内容保持一致的话切换后对工作区和暂存区会进行清空,并将切换后版本库的最新文件同步到工作区和暂存区;

如果切换前原分支的工作区文件内容与暂存区中不同,或暂存区中文件与版本库中最新提交文件不同,而这些不同的文件名如果满足下列情况则被认为不能安全切换分支而需要使用“ git checkout -f 分支名 ”命令来强制切换:

1. 这些内容不一致的文件在原分支的版本库(最新)中已存在;

2.这些内容不一致的文件在要被切换到的分支的版本库(最新)中已存在;

之所以会认为这两种情况为不安全切换是因为在分支切换时要进行的两个操作:

1. 原分支切换时会将工作区、暂存区中与版本库中同名文件(路径+名称)进行删除;

2.被切换分支在切换时会将版本库中文件同步到工作区、暂存区中;

因此满足上面的两个不安全切换条件时不能安全的进行分支切换,如果使用“ git checkout -f 分支名 ”进行强制切换那么原分支下的工作区和暂存区中不满足安全切换的那些文件将丢失(被删除或被覆盖)。

根据上面介绍的分支切换的详细过程我们可以知道即使分支可以安全切换也会存在一种情况,即:

切换前原分支的工作区文件内容与暂存区中不同且这些文件在版本库中没有同名文件并且在要切换到的分支版本库中有没有同名文件,或者暂存区中有文件而在版本库中没有对应的同名文件并且在要切换到的分支版本库中有没有同名文件,这些文件在分支切换时会被继续保留在工作区和暂存区中。

如果两个分支不是同一个分支分出来的(没有相同的历史commit),或者两个分支所有commit仍一致(git checkout -b 之后没有新的commit),那么在分支切换时不存在不安全分支切换问题。

-----------------------------------------------------

“ git checkout -f 分支名 ”,不考虑当前分支下工作区内容与暂存区内容不一致的文件以及暂存区与版本库最新文件内容不一致的文件是否会与切换后分支版本库最新文件内容是否发生冲突,如果发生冲突则强制覆盖。

“ git checkout -b 新分支名 ”,新建并切换分支,原理是将当前分支下版本库中所有内容(历史commit)复制到新分支下,因此工作区和暂存区内容都是不清空不覆盖的,因此不需要保证工作区内容、暂存区内容、版本库HEAD所指内容保持一致。

如果当前Git库中已存在某分支,“ git checkout -B 已存在的分支名 ”可以在当前分支基础上创建新分支并强制覆盖已有的同名分支;

例子:

某代码库中有master和new两个分支。

master分支中有文件1.txt, 2.txt, 3.txt,并且工作区、暂存区、版本库中代码均一致;

new分支中有文件3.txt,4.txt,并且工作区、暂存区、版本库中代码均一致;

master和new分支可以安全的相互切换。

在master分支中修改5.txt文件内容,然后试图切换到new分支,提示不能安全切换:

在master分支中创建文件3.txt,然后试图切换到new分支,提示不能安全切换:

在master分支中创建abc.txt,加入暂存库后修改,切换分支new后工作区和暂存区中依然有abc.txt文件:

===========================================

git checkout              文件检出

---------------------------------

git checkout  filename           :将暂存区中文件强制检出到工作区中(同名文件计算内容不一致也强行覆盖),但是如果filename与分支同名则该操作表示为切换分支;

git checkout  -- “ 文件名 ”      :将暂存区中文件强制检出到工作区中;

git checkout .                         :  将暂存区中所有文件全部强制检出到工作区中;

使用 git checkout filename 实现暂存区文件检出到工作区中,其功能与git restore相一致。

---------------------------------

git  checkout  commit_id  filename    :从当前分支下的提交号为commit_id的版本库代码中检出filename文件到工作区和暂存区,如果工作区和暂存区中有同名文件也强制覆盖。

----------------------------------------------

查看所有分支的详细信息:

git branch -av

====================================================

游离状态的HEADS

git checkout commit_id            切换到分支的历史上某次提交的代码状态

我们不仅可以使用 " git checkout 分支名 ” 检出某个分支进行分支切换,更可以使用 “ git checkout commit_id ”切换到分支的历史上某次提交的代码。HEAD是用来执行当前分支版本库的,默认HEAD都是执行版本库最新commit的代码,但是使用 “ git checkout commit_id ” 切换到分支的历史上某次提交的代码可以将HEAD指向分支中的某次提交,而这时候的HEAD指向被叫做游离态的HEAD。之所以叫游离态的HEAD,原因是当HEAD指向版本库最新提交commit时可以进行下一次的commit,将代码修改作为新的commit归入到版本库中,而当HEAD指向的是历史中的某次commit时是无法进行下一次commit的,因为在历史commit基础上进行commit就会造成其他分支,而新形成的分支和原分支是不在一个时间线上的,也正因如此我们可以在HEAD指向历史commit时使用“ git checkout -b 新分支” 或  “ git switch -c 新分支 ” 来将修改以新的分支形式来进行commit。

“git checkout commit_id”主要用来对历史代码的查看,而将历史提交代码同步到当前的工作区和暂存区中可以使用命令“ git  checkout  commit_id  filename ” 。

====================================================

git checkout --orphan <新branch>

保留当前的工作区和暂存区内容,新建一个没有commit的分支,准确的说现在还没有成功建成一个分支,因为使用"git checkout --orphan "创建无历史commit分支时至少需要有一次commit才算成功创建一个分支,否则的话当我们切换回其他分支时会发现这个刚建立的无历史commit的分支消失了。

可以看到当前分支中没有任何commit历史。

====================================================

Git 学习笔记——git checkout的更多相关文章

  1. git 学习笔记 Git实践

    网上有很多教程,这里我自己做下整理,省得有时忘记,有道是好记性不如烂博客! 先大概描述下Git的各种命令: git init                     #初始化 git clone   ...

  2. Git学习笔记--Git常用命令

    参考资料: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 mkdir myfir ...

  3. Git学习笔记 git revert

    我们难免会因为种种原因执行一些错误的commit / push,git提供了revert命令帮助程序员修复这样的错误. 举个例子,下图是git commit 的历史记录 git revert 命令会通 ...

  4. Git 学习笔记--Git下的冲突解决

    冲突的产生 很多命令都可能出现冲突,但从根本上来讲,都是merge 和 patch(应用补丁)时产生冲突. 而rebase就是重新设置基准,然后应用补丁的过程,所以也会冲突. git pull会自动m ...

  5. Git 学习笔记--git 查看某个文件的修改历史

    1. git log -p filename 查看文件的每一个详细的历史修改,如果没有-p选项,只显示提交记录,不显示文件内容修改,git log -p -3 filename 显示最近的3次提交. ...

  6. Git学习笔记 - Git安装

    Git安装(Windows) 从 https://git-for-windows.github.io/ 下载Git,下载完成,双击安装,一路选择默认设置即可. 注意:选择使用git的命令行模式,选择默 ...

  7. Pro Git 学习笔记

    Pro Git 学习笔记 文档地址:Pro Git原文地址:PRO GIT 学习笔记 git常见命令 1.Git起步 初次运行Git前的配置 用户信息 git config --global user ...

  8. Git学习笔记与IntelliJ IDEA整合

    Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...

  9. 【转帖】Git学习笔记 记录一下

    本文内容参考了廖雪峰老师的博文,并做了适当整理,方便大家查阅. 原帖地址 https://wangfanggang.com/Git/git/ 常用命令 仓库初始化 - git init 1 git i ...

  10. [转]Git学习笔记与IntelliJ IDEA整合

    Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...

随机推荐

  1. CM 停用 Parcel 异常

    在将Doris集成到CM时,第一次打的包存在问题,想更新下,停用.删除Parcel时出现了问题卡住了,一直显示75%.无奈换了名称和版本,分配.激活,然后又卡在了75%,点开后,发现是同一台机器.其a ...

  2. javascript高级编程笔记第五章

    chapter 5 5.5 Function类型 未完待续 函数实际上是对象,每个函数都是Function类型的实例,因此与其他引用类型一样具有属性和方法 因此函数名实际上就是函数对象的指针,不会与某 ...

  3. 字符数组数据映射转换到实体对象model注解方式 demo

    1.model对象 public class UserModel { @ColumnAnnotation(index=0) private String username; @ColumnAnnota ...

  4. 实现 Emlog 最新评论列表不显示博主的评论回复

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 实现 Emlog 最新评论列表不显示博主的评论回复 日期: ...

  5. 【长文】带你搞明白Redis

    本文使用第一人称来介绍Redis 一.概述 Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化 ...

  6. 服务器上安装centos7系统遇到的坑

    centos7的安装报错"no controller found" 出现no controller found解决方案1.等待命令行出现 2.输入ls /dev/sd*   找到自 ...

  7. 【动手学深度学习】第三章笔记:线性回归、SoftMax 回归、交叉熵损失

    这章感觉没什么需要特别记住的东西,感觉忘了回来翻一翻代码就好. 3.1 线性回归 3.1.1 线性回归的基本元素 1. 线性模型 \(\boldsymbol{x}^{(i)}\) 是一个列向量,表示第 ...

  8. 2023/3/21 组会:ChatGPT 对数据增强的影响及 ChatGPT 的鲁棒性,Dense 和 Document 检索方法

    前两个也许跟上了,后两个完全没跟上,以后再详细读读吧qwq 反正组会跟不上才是正常现象. AugGPT: Leveraging ChatGPT for Text Data Augmentation 摘 ...

  9. Mysql 使用(二)

    1 启动: 2 net start mysql 3 4 进入: 5 mysql -uroot -pmysql 6 7 显示数据库: 8 show databases; 9 10 使用数据库: 11 u ...

  10. 使用AWS Glue进行 ETL 工作

    数据湖 数据湖的产生是为了存储各种各样原始数据的大型仓库.这些数据根据需求,进行存取.处理.分析等.对于存储部分来说,开源版本常见的就是 hdfs.而各大云厂商也提供了各自的存储服务,如 Amazon ...