Git 学习笔记——git checkout
上图是我对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的更多相关文章
- git 学习笔记 Git实践
网上有很多教程,这里我自己做下整理,省得有时忘记,有道是好记性不如烂博客! 先大概描述下Git的各种命令: git init #初始化 git clone ...
- Git学习笔记--Git常用命令
参考资料: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 mkdir myfir ...
- Git学习笔记 git revert
我们难免会因为种种原因执行一些错误的commit / push,git提供了revert命令帮助程序员修复这样的错误. 举个例子,下图是git commit 的历史记录 git revert 命令会通 ...
- Git 学习笔记--Git下的冲突解决
冲突的产生 很多命令都可能出现冲突,但从根本上来讲,都是merge 和 patch(应用补丁)时产生冲突. 而rebase就是重新设置基准,然后应用补丁的过程,所以也会冲突. git pull会自动m ...
- Git 学习笔记--git 查看某个文件的修改历史
1. git log -p filename 查看文件的每一个详细的历史修改,如果没有-p选项,只显示提交记录,不显示文件内容修改,git log -p -3 filename 显示最近的3次提交. ...
- Git学习笔记 - Git安装
Git安装(Windows) 从 https://git-for-windows.github.io/ 下载Git,下载完成,双击安装,一路选择默认设置即可. 注意:选择使用git的命令行模式,选择默 ...
- Pro Git 学习笔记
Pro Git 学习笔记 文档地址:Pro Git原文地址:PRO GIT 学习笔记 git常见命令 1.Git起步 初次运行Git前的配置 用户信息 git config --global user ...
- Git学习笔记与IntelliJ IDEA整合
Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...
- 【转帖】Git学习笔记 记录一下
本文内容参考了廖雪峰老师的博文,并做了适当整理,方便大家查阅. 原帖地址 https://wangfanggang.com/Git/git/ 常用命令 仓库初始化 - git init 1 git i ...
- [转]Git学习笔记与IntelliJ IDEA整合
Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...
随机推荐
- RuoYi-Cloud从配置到运行
前期准备工作 若依微服务版(RuoYi-Cloud)代码下载:https://gitee.com/y_project/RuoYi-Cloud 注册中心(nacos)下载:https://www.ali ...
- Nacos + Gateway网关搭建微服务
文章所有代码GtiHub:https://github.com/Tom-shushu/work-study 里面的gateway-server和server1项目 1.Docker 部署 Nacos ...
- UG二次开发 PYTHON 环境配置
NX 二次开发 PYTHON VSCODE 环境配置 我电脑上装的是WIN11 NX1988 在电脑的UG的安装文件夹内找到 python 一般在 xx\NXBIN 在所在的文件夹内,运行python ...
- 如何计算QPS、PV和需要部署机器数量?
基本概念 网站访问量的常用衡量标准:独立访客(UV) 和 综合浏览量(PV),一般以日为单位来计算. 独立访客(UV):指一定时间范围内相同访客多次访问网站,只计算为1个独立访客. 综合浏览量(PV) ...
- 【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
介绍一个简单的工具,用于将Redis数据从一个redis端点复制到另一个redis端点,基于原始存储库转换为.NET 8:https://github.com/LuBu0505/redis-copy- ...
- Peaks:每周至少要进行一次用户访谈?
名字:Peaks 开发者 / 团队:Vogelhaus Apps GmbH 平台:iOS.watchOS 请简要介绍下这款产品 每个人生活的节奏都有一个内置的生理时钟,这就是所谓的昼夜节律.它不仅控制 ...
- 🎉我是如何从零到成为 Apache 顶级项目的 Committer
最近收到了 Apache Pulsar 和 Apache HertzBeat社区的邀请邮件,成为了这两个项目的 Committer. 一路走来我从最开始的打游击战的闲散人员到如今活跃在各个开源项目里的 ...
- [oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数
十六进制(hexadecimal) 回忆上次内容 上次数制可以转化 bin(n)可以把数字转化为 2进制 binary 接收一个整数(int) 得到一个二进制数形式的字符串 编辑 数字在 ...
- Python爬虫(5-10)-编解码、ajax的get请求、ajax的post请求、URLError/HTTPError、微博的cookie登录、Handler处理器
五.编解码(Unicode编码) (1)GET请求 所提方法都在urllib.parse.路径下 get请求的quote()方法(适用于只提交一两个参数值) url='http://www.baidu ...
- Arch Linux install i3-wm
Arch Linux install i3-wm 简介 i3-wm 是一种动态的平铺式窗口管理器,它的设计目标是提供一个快速.简洁.可定制的桌面环境,适合开发者和高级用户使用.它有以下几个特点: 它使 ...