checkout

基本功能

checkout 主要作用有两个:切换分支和重置文件

切换分支

切换分支时,会使用新分支指向的结点更新暂存区与工作目录。

正常切换

可以使用 git checkout <branch> 切换分支。其中 branch 表示要切换到的分支名。

我们也可以使用 git reset <branch>。但它与 checkout 时的含义完全不同:reset 不会更改分支,只是修改当前分支指向的结点;而 checkout 会更新分支,但旧分支指向的结点不会变化。下图展示了 git reset master 与 git checkout master 的区别:

reset master 与 checkout master

从上图可以发现:reset 之后,develop 分支指向的结点发生了变化,但 HEAD (HEAD 表示当前的分支)没有变;而 checkout 后,develop 指向的结点没变,但 HEAD 指向发生了变化。

匿名分支

checkout 后不但可以跟分支名,还可以跟某个提交结点的 SHA-1 值,此时相当于在指定的提交结点处建立一个匿名分支,然后将 HEAD 指向该分支。

之所以叫匿名分支,是因为在 refs/heads 目录中并没有新建一个分支文件,只是通过 .git/HEAD 文件保存了该结点的 SHA-1 值。

要注意:当从匿名分支中切出时,匿名分支中的所有提交结点将丢失,因为没有指针指向这些结点,也无法通过别的指针回溯到这些结点

$ git checkout c9186325368de33dcfed7b4997eaab6a42f6e43b
Note: checking out 'c9186325368de33dcfed7b4997eaab6a42f6e43b'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at c918632... fda
$ git branch
* (HEAD detached at c918632)
  dev
  master
$ cat .git/HEAD 
c9186325368de33dcfed7b4997eaab6a42f6e43b
$ ls .git/refs/heads/
dev master

在 checkout 的第一段提示中说:you can discard any commits you make in this
state without impacting any branches by performing another checkout(当你从当前分支中切走时,本分支所有的提交都将丢失)。


重置文件

checkout 执行重置文件工作时,并不会切换分支 ,即不会修改 HEAD 指向。

重置文件时,checkout 可以指定文件路径,此时类似于 git reset --hard -- paths,但 git 不允许后者的写法。

根据是否指定有提交结点, checkout 重置文件会有两种不同的效果:

  1. 指定有提交结点,会使用该结点对应的快照重置暂存区与工作目录

    $ cat a.txt 
    这是用于指定提交结点的 checkout 重置恢复
    checkout -- a.txt
    test checkout
    this is update after addfd000000addfdasfas
    
    $ vim a.txt 
    $ cat a.txt 
    这是后来修改的
    这是用于指定提交结点的 checkout 重置恢复
    checkout -- a.txt
    test checkout
    this is update after addfd000000addfdasfas
    
    $ git checkout HEAD -- a.txt 
    $ cat a.txt 
    这是用于指定提交结点的 checkout 重置恢复
    checkout -- a.txt
    test checkout
    this is update after addfd000000addfdasfas
    
    $ git status
    On branch dev
    nothing to commit, working directory clean
    

    上述命令分为四步:

    • 显示上次提交后 a.txt 的内容。

    • 修改 a.txt,只是在文件的第一行中添加了 "这是后来修改的"。

    • 使用 checkout HEAD 重置 a.txt。可以发现重置后 a.txt 恢复到修改之前的样子。

    • 最后使用 git status 查看状态,可以发现 dev 分支是干净的,即没有需要暂存的,也没有需要提交的 —— 这表示本地仓库、暂存区、工作目录三者是一致的。

    可以将重置时的 HEAD 替换成任意提交结点的 SHA-1 值。

  2. 未指定提交结点,会使用暂存区中的内容重置工作目录

    $ vim a.txt 
    $ git status
    On branch dev
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   a.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    $ git checkout -- a.txt 
    $ git status
    On branch dev
    nothing to commit, working directory clean
    

    可以看出,使用 git checkout -- a.txt 后,a.txt 并没有出现在待暂存列表中。这是因为 checkout 使用暂存区中的文件重置了工作目录中的 a.txt ,暂存区与工作目录中的 a.txt 完全一样,不需要再次暂存。


冲突文件

--conflict

通过指定 --conflict 选项的值,用于指定检出冲突文件的内容

下表列出了 conflict 选项常用的值

属性值 含义
merge 列出本分支,被合并分支的冲突内容。默认值
diff3 在 merge 基础上再列出最近公共祖先结点的内容

--diff3 时的效果:

$ git checkout --conflict=diff3 a.txt
hufeng@hufengdeMacBook-Pro:~/Desktop/demo$     cat a.txt
<<<<<<< ours
from maste2
||||||| base
from maste
=======
from dev
>>>>>>> theirs

可以看出,与普通冲突文件的内容相比,多了 ||||||| base 行,而该行就是公共祖先结点在冲突处的内容。

--ours 与 --theirs

与 --conflict 类似,ours 与 theirs 也是作用于冲突时冲突文件的内容的选项。

  1. --ours 是保留本分支的内容,抛弃被合并分支;

  2. --theirs 保留被合并分支内容,抛弃本分支内容。

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

推荐阅读更多精彩内容