Git Command (Chapter 1) - git checkout

在软件开发过程中,Git是一种服务于项目版本管理的重要工具,世界上各个开源项目仓库诸如Github均使用git进行代码仓库的操作。
一般地,有两种途径来使用Git工具,一种是第三方开发的交互式界面软件,另一种则是直接使用命令行指令。使用Git交互式界面软件来操作代码仓库,好处是操作简单直观,学习成本低。而本文的主旨在于从代码层面上了解Git工具的操作原理,做到知其然知且其所以然,遇到相关问题能够找到正确的方法进行解决,故仅对命令行进行使用说明详述。

使用前须知

“The three trees” - “三棵树”

在使用Git指令之前,各位小伙伴须将一概念熟记于心,这个概念被称作“The three trees”。下面我们用一张图来进行理解:

图1 The three trees
  • Working Directory - 工作目录
    即项目所在文件夹,也就是你的项目根目录。

  • Staged Snapshot - 临时快照
    即当你对Working Directory中的文件进行了任何CRUD操作,并且对这些操作执行了git add命令,此时这些文件便进入到了Staged状态。进入到Staged状态的文件,即可以进行commit操作进入到Commit History,也可以进行reset操作回退到Unstaged状态。下面用两张图来进行理解:

图2 Working Directory

上图中,对Working Directory中的www文件进行了修改,执行git status可以看到,www进入了git的检测列表,状态为Unstaged。此时,我们再执行git add .,得到下图结果,此时,www进入到了Staged Snapshot中:

图3 Staged Snapshot
  • Commit History
    即已提交历史,对项目的任何修改已被提交到本地仓库中,该记录已进入到提交历史中,可通过git log进行查询。下图为提交后结果:
图4 Commit History

注意:完成commit操作不等同于push到远程分支,并不会对远程分支造成任何影响,同时pullpush以及分支概念不在本文的研究范围中,故不做赘述。

Scope - 作用范围

作用范围也是Git使用中必须要掌握的一个概念,所谓作用范围,是指Git指令所起作用的两种对象(层级),分别是File-level和Commit-level。就之前的图2为例,当www文件被修改之后,此时可对该修改文件进行2种操作,一种是git add使其进入到Staged Snapshot中,另一种则是git checkout令其还原到修改前的状态。

  • File-level
    文件层级为Git指令对单个或者多个文件(指令中反映为文件路径)进行的操作,git checkoutgit reset均可作用于该层级。

注意:git revert没有File Scope操作。

  • Commit-level
    提交层级为Git指令对Commit History中的单条或多条commit进行的操作,git checkoutgit resetgit revert均可作用于该层级。下面附上三种指令对应Scope的表格:
Git指令 作用范围 常用场景
git checkout Commit-level 1. 分支间切换 2. 切换到同一分支下的指定commit进行代码浏览(分离状态,下文会进一步阐述说明)
git checkout File-level 还原对某个或多个文件的修改(该操作不可逆,慎用)
git reset Commit-level 还原某一分支上已提交的某条或多条commits(适用于个人分支,该操作不可逆,慎用)
git reset File-level 将Staged状态下的某个或多个文件,还原到Unstaged状态
git revert Commit-level 撤销某分支上的已提交内容(适用于公共分支)
git revert File-level 无文件层级操作

git checkout

分支切换

git checkout指令用于更新当前项目所处状态,若指令所指定的值为分支名,则切换到该指定分支。例如,我们打算将当前所处master分支,切换到hotfix分支上,执行如下代码:

git checkout hotfix

此时,若当前分支上的修改可能对目标分支上的文件造成覆写,则Git会强制中断此次操作,并提示哪些文件可能导致覆写,提出操作建议。当你完成修改后,即能够进行成功切换,git checkout指令的执行机制如下图所示,其中,HEAD可以理解为头指针,用于指向当前项目代码所处的分支,以及commit history位置:

图5 git checkout <branch>

切换前,HEAD指向Master分支的最近一次代码提交位置;切换后,HEAD指向Hotfix分支的最近一次代码提交位置。

指定commit history位置切换

git checkout也可以用于切换到某一分支上的指定commit位置,当指令值为commit id时,则能够将HEAD指向该次commit,例如,我们想要将代码回溯到上上一次commit位置进行快速浏览时,则可以运行以下指令:

git checkout HEAD~2

为了方便理解,下图表示了此次指令的执行机制:

图6 git checkout <commit>

可以看到,执行完毕后,HEAD已经指向了上上一次commit的位置。git checkout的这项特性使得用户能够快速地切换到目标commit对代码进行查阅,并且不会对当前分支造成任何影响,此时HEAD指向的代码位置不属于任何一个分支的任何一次commit,这样的状态叫做'detached HEAD' state,执行结果见下图所示:

图7 git checkout <commit>执行结果

需要注意的是,处于detached HEAD状态的代码,在你切换到任何分支后,都会丢失得不到保存,所以,如果你想要在该commit上进行修改并提交,请务必在修改前执行git checkout -b <new-branch-name>,这样,你可以得到一个同该commit代码一模一样的新分支,并进行任何能够得到记录的操作。

还原Unstaged状态的文件

git checkout还能够作用于Unstaged状态下的文件,执行后,该文件的任何修改都会还原到此次修改前的状态,这种场景常见于当你进行了某些实验性质的修改或者因某些原因需要放弃此次修改时。执行指令如下:

git checkout -- <single file path> // 还原单个文件
git checkout -- . // 还原所有此次修改文件

本章完。
下一章节将主要介绍git reset指令。
文中部分图片源于www.atlassian.com

参考文献

https://git-scm.com/docs/git-checkout
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,872评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,911评论 0 11
  • 今天是年二十九,妈妈生日。好几天前,妈妈就说:一直都没去市里逛过花市,今天我们去逛花市,好么?我当然说,好。尽管每...
    鱼海棠阅读 109评论 0 0
  • 大地一片空旷 野火在远处悄然流放 黑暗笼罩着整个村庄 千万只魔兽在暗夜隐藏 轻蔑的笑声在疾风中游荡 骑士默默端平了...
    二静不二阅读 274评论 3 4
  • 随着社会的需求以及多样化进步,培养孩子学习才艺已经成为一种普遍现象。 有些孩子通过一段时间地学习,能够让才艺大放光...
    播予阅读 1,335评论 0 3