上图是我对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. Thread的join方法demo

    Thread的join方法demo /** * 关于join官方的解释是 Waits for this thread to die. 也就是等待一个线程结束. */ public class Thre ...

  2. MySQL入门到实战详细教程

    MySQL介绍 MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品,它广泛应用于各种Web应用程序和网站,MySQL使用结构化查 ...

  3. CentOS7系统搭建web环境 php&nginx&pgsql

    环境:VMware.CentOS-7-x86_64-DVD-2009.iso.nginx-1.26.1.php-7.2.0.postgresql-12 php最好安装对应php项目所需版本,否则会出现 ...

  4. 2024年软件架构趋势之AI与机器学习的关系

    在当下这个信息爆炸的时代,我们经常会听到"AI"和"机器学习"这两个词.它们似乎总是携手出现,让人觉得它们就是一对不可分割的"好基友".但你 ...

  5. SpringCloud开发之OpenFeign timeout和压缩等问题

    在某些时候,我们希望某个同步调用执行更长的时间(异步暂时不考虑),这个时候,首先就是要设置OpenFeign的timeout设定. 下面我们举例来说明,可以如何设定TimeOut参数. 一.环境 脱离 ...

  6. 2019 南昌区域赛 CEGLM 题解 & lagrange 插值

    B. A Funny Bipartite Graph 状压 dp ,利用了原题中选完左边点集,那么右边在 左边编号最大的那个数 之前的所有点都要选的性质,可以优化到 \(O(n \cdot 2^n)\ ...

  7. C# pythonnet(2)_傅里叶变换(FFT)

    Python代码如下 import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取数据 data = pd.r ...

  8. Godot中鼠标点击3D对象

    Godot中鼠标点击3D对象 方法一:调用RigidBody3D中的input_event事件 RigidBody3D中有信号input_event可以接受鼠标的输入,用这个信号可以处理点击事件. 具 ...

  9. 计算订单签收率的sql查询思路与过程(涉及百分比和四舍五入)

    领导提出一个签收率需求,想要通过数据库达到excel中表现的形式,提高计算速度和工作效率, 如下形式: 数据库中表数据结构: 部分数据如下: sql语句思路如下: -- 1.已签收:以物流反馈管道,状 ...

  10. java 提取证书指纹

    正文 用到的依赖 <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov ...