设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

git寻根——^和~的区别

2013-5-16 11:23| 发布者: 红黑魂| 查看: 3204| 评论: 0|来自: 博客园

摘要: 一. 引子   在git操作中,我们可以使用checkout命令检出某个状态下文件,也可以使用reset命令重置到某个状态,这里所说的“某个状态”其实对应的就是一个提交(commit).我们可以把一个git仓库想象成一棵树,每个com ...

一. 引子


  在git操作中,我们可以使用checkout命令检出某个状态下文件,也可以使用reset命令重置到某个状态,这里所说的“某个状态”其实对应的就是一个提交(commit).


  我们可以把一个git仓库想象成一棵树,每个commit就是树上的一个节点。家家都有一本自己的祖谱。祖谱记录了一个家族的生命史, 它不仅记录着该家族的来源、迁徙的轨迹,还包罗了该家族生息、繁衍、婚姻、文化、族规、家约等历史文化的全过程。类似的,每个git仓库都有一本自己的祖 谱,仓库中commit ID的繁衍,HEAD指针的迁徙,分支的增加、更新,同样的记录着一个仓库从无到有的点点滴滴。


  使用git log –graph 命令,可以查看自己仓库的当前分支提交ID的树状图,如下图所示。



  使用git log –pretty=raw命令,可以查看commit之间的父子关系,如下图所示,需要注意的是最开始的commit是没有父提交的。



二. 困惑


  在使用git的过程中,你也许会有很多的困惑。


  在使用reset或checkout命令的时候,需要一个参数,但是每次都输入commit hash值是一件比较麻烦的事情。首先你得去查询下日志,然后再用键盘将前面几位hash值输入。有时候你一次还搞不定,突然开个小差,暗恋下女神,想一 想基友,都容易把hash值遗忘或弄错。肿么办???


  又话说突然间,一堆带有hash值的符号出现在生活中,HEAD^1~4,~3^2,我擦!这是TMD玩 意儿?不懂啊,使用过程中,HEAD和引用各种乱窜,根本不听从我的指挥,哎呀,妈呀!我成了git的奴隶,从此生活不再美好。肿么办???


  不,生活还要继续,要和git做朋友。做朋友当然先要摸清楚朋友的性情和脾气咯,有了好友,生活才会充满希望。


三. 解惑


  古有“射人先射马,擒贼先擒王”,今有“git仓库顺藤摸瓜”。既然commit形成的树状图,表明了各个commit之间的关系,那 么我们也可以顺着这棵树去查询commit的值。一般情况下,一个commit都会有一个父提交,那么通过^这个表达式,就 可以访问到其父提交的ID值;使用~也可以达到同样的功效哦。


  我们知道每提交一次,HEAD就会自动移到版本库中最近的一次提交。那么HEAD^就代表了最近一次提交的父提交,HEAD~也是同样的道理;但是如果你想当然的认为^和~的用法相同,那就错了,其实它们的区别还是蛮大的。


四. 详解


  我们来通过一个具体的例子,来讲解一下^和~的用法区别,同时在checkout或reset的过程中,看看HEAD和引用的变化。


查看HEAD和引用的值


  我们可以通过命令来查看HEAD和引用的值,也可以通过当前仓库下的.git目录去访问。当前分支为master时,我们查看HEAD的值,命令如下:


$ cat .git/HEAD
ref: refs/heads/master

然后,我们可以查看master引用的值

$ cat .git/refs/heads/master
3b0370b.......  # hash code

master分支上初始化,并提交一次 

在master分支上新建一个提交”c1”,生成commit ID 973c,这时候master引用指向973c,HEAD指向master引用。

$ git init
Initialized empty Git repository
$ echo c1 >> a
$ git add a
$ git commit
[master (root-commit) 973c5dd] c1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 a
$ git log --oneline
973c5dd c1


对应的图如下所示:



基于master新建br1分支,并提交两次


  接下来在master分支基础上新建分支”br1”,并在”br1”上提交”c2”,commit ID为1c73,这时候HEAD指向br1,br1引用指向”c2”对应提交1c73.

$ git checkout -b br1
Switched to a new branch 'br1'
$ echo c2 >> b
$ git add b
$ git commit
[br1 1c7383c] c2
 1 file changed, 1 insertion(+)
 create mode 100644 b
$ git log --oneline
1c7383c c2
973c5dd c1

对应的图如下所示:



  在分支”br1”上,提交”c3”,commit ID为4927,此时HEAD指向br1,br1引用指向”c3”对应提交4927.


$ echo c3 >> b
$ git commit -a -m "c3"
[br1 4927c6c] c3
 1 file changed, 1 insertion(+)
$ git log --oneline
4927c6c c3
1c7383c c2
973c5dd c1

对应的图如下所示:


 



酷毙
2

雷人

鲜花

鸡蛋

漂亮

刚表态过的朋友 (2 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部