上图是我对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. NumPy 舍入小数、对数、求和和乘积运算详解

    舍入小数 在 NumPy 中,主要有五种方法来舍入小数: 截断 去除小数部分,并返回最接近零的浮点数.使用 trunc() 和 fix() 函数. 示例: import numpy as np arr ...

  2. Linux使用docker搭建maven私有仓库

    引言 在实际开发工作中,通常需要搭建maven私有仓库,今天就教大家如何搭建一套maven的私有仓库 Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓 ...

  3. 关于Elasticsearch查找相关的问题汇总(match、match_phrase、query_string和term)

    关于Elasticsearch查找相关的问题汇总(match.match_phrase.query_string和term) 查询全部: { "query": { "ma ...

  4. mysql的varchar和oracle的varchar2比较

    首先说结论: 1.mysql存储的是字符数(不分语言) 2.oracle存储的需要看定义,如果定义为varchar2(n),则默认是n个字节,如果是varchar2(n char)则是n个字节. 3. ...

  5. Java 把多个音频拼接成一个

    在Java中,将多个音频文件拼接成一个通常需要使用一些专门的音频处理库,因为Java标准库并不直接支持音频文件的合并.一个常用的库是JAVE2(Java Audio Video Encoder)或JL ...

  6. 《DNK210使用指南 -CanMV版 V1.0》第四章 基于CanMV的C开发环境搭建

    第四章 基于CanMV的C开发环境搭建 1)实验平台:正点原子DNK210开发板 2) 章节摘自[正点原子]DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail ...

  7. 阿里云日志Nginx日志分析

    每分钟接口访问次数的前200条统计 not request_uri : "/heartbeat.html" | SELECT time_series(time, '1m', '%H ...

  8. Ubuntu 22.04单机部署K3s

    安装docker 从docker官网获取最新的一键安装脚本,安装docker运行环境 curl -fsSL https://get.docker.com -o get-docker.sh sudo s ...

  9. 基于RK3588的8K视频解码显示案例分享!引领超高清工业视频时代

    8K.4K.2K显示对比 2K分辨率:也称为全高清(FULL HD),它具有1920 x 1080像素的分辨率.这是目前大多数消费者电视和电脑显示器的标准分辨率,可以提供良好的图像质量. 4K分辨率: ...

  10. HTTP事务理解

    借图: 首先三次握手理解: TCP三次握手好比两个对话, 第一次握手:甲给乙一直发送信息,乙没有回应,甲不知道乙有没有收到信息 第二次握手:乙收到信息,然后再给甲回信息,此时甲知道乙收到信息,但乙不知 ...