上图是我对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. Java连接mySql——简单JDBC连接数据库

    利用JDBC开发数据库 经典应该用框架:      第一步,加载JDBC数据库驱动程序(不同的数据库有不同的数据库驱动,所以在连接数据库之前,需加载驱动)     格式:     String dri ...

  2. Linux Debian安装教程

    Debian 是一个免费的开源操作系统,是最古老的 Linux 发行版之一,于 1993 年由 Ian Murdock 创建.它采用了自由软件协议,并且由志愿者社区维护和支持.Debian 的目标是创 ...

  3. 字符数组转换及数字求和 java8 lambda表达式 demo

    public static void main(String[] args) throws IllegalAccessException { //字符串转换为数字且每个加上100,输出. String ...

  4. Mysql int类型字段插入表达式,值为0或1

    CREATE TABLE `t_user` ( `uId` INT(11) DEFAULT NULL, `uName` VARCHAR(20) DEFAULT NULL, `uPwd` VARCHAR ...

  5. 【题解】CatOJ C0458C 滑动窗口定期重构

    标题 trick 的名字我也不知道是什么,就这样吧. 首先有显然的 dp 式子:\(f(i)=\min \{f(j) \times \max\{a_{j+1},\dots,a_i\}\}\).考虑怎么 ...

  6. 交互式转化批处理工具 expect

    交互式转化批处理工具 expect expect中相关命令 spawn 启动新的进程 expect 从进程接收字符串 send 用于向进程发送字符串 interact 允许用户交互 exp_conti ...

  7. Git配置环境变量

    由于学习需要装了git,使用终端查看版本号时 提示 'git' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 原因 因为没有配置Git环境变量 解决方法:配置环境变量 开始菜单=>设置 ...

  8. C#/.NET这些实用的技巧和知识点你都知道吗?

    前言 今天大姚给大家分享一些C#/.NET中的实用的技巧和知识点,它们可以帮助我们提升代码质量和编程效率,希望可以帮助到有需要的同学. .NET使用CsvHelper快速读取和写入CSV文件 本文主要 ...

  9. JAVA文件的编译

    编译实际就是翻译,是将人类易读(为啥?因为开发语言的目的就是为了让人容易使用)的语言转换为机器或程序易读的语言.Java的编译器是javac,它将.java文件编译为.class文件,也就字节码文件. ...

  10. Oracle 递归拼接字段

    效果 sql SELECT LISTAGG(T.NAME, ' / ') WITHIN GROUP(ORDER BY LEVEL DESC) AS RESULT FROM S_WORK_RESOURS ...