图解Git 命令行(一)

0. Git 的相关原理

Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然后再粘贴一样,但比复制粘贴优雅许多!

Git 希望提交记录尽可能地轻量,因此在你每次进行提交时,它并不会盲目地复制整个目录。条件允许的情况下,它会将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。

Git 还保存了提交的历史记录。这也是为什么大多数提交记录的上面都有父节点的原因,我们会在图示中用箭头来表示这种关系。(注意被箭头指向的是父节点)

1. git commit (提交代码到本地)

image

如图所示,目前有 2 次提交记录(这里用C0,C1 表示,实际中应该是一串哈希值),我们在「master」分支下使用命令行。

git commit -m "First log"
image

C2 出现了,也就是说,版本更新到 C2了。
当然我们可以继续在 C2 提交代码。

image

这样 C3 就出现了,这就是「commit」
我们的每一次提交都会生成一个提交记录。

2. git branch (创建本地分支)

那么我们如何再新建一条分支用来修复 bug 呢? 这里我创建了名为 「fixbug」 的分支

首先,我们可以通过下面命令来创建分支

git branch fixbug

然后再通过下面命令来切换到刚刚新建的分支

git checkout fixbug

最后我们在「fixbug」分支上提交一次代码,当前的状态如下图所示

image

当然创建分支和切换分支可以用一条命令来达到,如下

git checkout -b fixbug

有小伙伴注意到 「fixbug 」分支上的「 * 」星号了吗?这表示当前所在的分支是 「fixbug 」

3. git merge (合并分支)

当有两条分支各自开发的内容需要合并的时候就需要合并分支了。

如下图,我在 C1 新建了分支「fixbug」并提交了一次,主分支「master」也提交了一次。
这时候他们两者的内容是不同的,如果业务需要合并代码。

image

我们首先切换到主分支上,如图,「master」旁边有星号,然后通过下边的命令行。

git merge fixbug
image

关于谁合并谁的问题,我们只要知道,发起合并所在的分支是强势方,另一方是被合并方。
这样我们就简单的合并了,当然这里还没讲到关于冲突的问题。

4. git rebase (合并分支)

第二种合并分支的方法就是 rebase。
rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
他的优点是如果项目一直使用 rebase 那么提交历史就会很清晰,只有一条主线,而不像 merge 一样合并来合并去。
下图命令是在 「bugFix」 所在的分支下使用,将他复制一份到「master」分支后。
这样「bugFix」就有了「master」 里面的所有内容了。
这里我们也没有考虑冲突问题。

git rebase master
image

5. HEAD

什么是 「HEAD」?
我们在版本控制的日志中,经常会看到一个「HEAD」标识,其实这个「HEAD」的意思类似于游标,你当前在哪个分支,他就会出现在对应的分支上。
即:「HEAD 」指向的就是当前所在的分支。

image

「HEAD」一般指向分支,而分支指向提交记录,所以正常情况下「HEAD」跟随着分支一起动,但我们也可以使「HEAD」指向具体的提交记录。
在这里我们使用

git checkout C6

如图切换到了 C6 的提交记录上去了,这时候「HEAD」就指向了 C6

image

6. 相对引用

正常情况下我们要切换到某个提交记录都是要通过哈希值来确定。

git checkout C0

当然我们还有另一种方式,使用相对引用

1.使用 ^ 向上移动 1 个提交记录,如下图,我们在 C1 使用了如下代码,「HEAD 」指向了 C0,如果重复使用会一层层往上。

git checkout HEAD^
image

2.使用 ~<num> 向上移动多个提交记录,如 ~3

git checkout HEAD~3
image

7. 强制修改分支位置

可以直接使用 -f 选项让分支指向另一个提交。例如:
当「master」 分支指向 C6 时。
下面的命令会将 「master 」分支强制指向「HEAD 」的第 3 级父提交。

git branch -f master HEAD~3
image

当然这种形式也是支持的。

git branch -f master HEAD^
image

如果什么都不填,「master 」就会和 「HEAD」指向同一个提交。

git branch -f master
image

8.代码撤销

主要通过下面两种方式来进行撤销 git reset,git revert。

git reset 是通过回退到某个提交记录来实现撤销的,但是这种方式对于远程分支来说是无效的。
如图我们的本地分支在 C3 的提交记录上,这时候我们想撤销回到 C1 就可以使用

git reset HEAD~1
image

而 git revert 是在我们要撤销的提交记录后多一个新的提交,新提交记录 C2' 引入了更改 ,这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的,这样也相当于对代码进行了撤销。

git revert HEAD
image

9. 整理提交记录

如果你想将其他分支的一些提交复制到当前所在的位置也就是「HEAD」下面的话, cherry-pick 是最直接的方式。如下图我们把 C2 和 C3 的提交记录复制到 C5 下

git cherry-pick C2 C3
image

10. 交互式的 rebase

当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了。
但是如果你不清楚你想要的提交记录的哈希值呢? 我们可以利用交互式的 rebase

interactive 的 rebase 命令, 简写为 -i

使用该条命令,可以使当前分支下,任意条数的提交记录被直接复制下来,然后再另外的地方粘贴。当然期间还可以修改顺序,通过更改 pick 的状态删除不想要的提交,还能把多个提交记录合并。

我们在「master」上使用下面命令。

git rebase -i HEAD~4
image

参考 https://github.com/pcottle/learnGitBranching

喜欢的可以关注一下咯

image

扫描二维码更多精彩哦~星球圈子是免费的。

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

推荐阅读更多精彩内容

  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,682评论 1 17
  • 以下笔记主要参考gitgot,大致了解git使用和原理。 第一部分我们从个人的视角去研究如何用好Git,并且揭示G...
    carolwhite阅读 2,367评论 0 1
  • 生活有时就像一只生硬硬盖下来的大手,压得你喘不过气来,在现实与梦想之间挤压、旋转、抽离、拉扯,也会被按进深不见底的...
    素年锦时83阅读 170评论 0 0
  • 2017.09.26星期二,看到某文章标题写着,微信终于有了看撤回信息的功能了,这样的题目,让人心思思,而当我一打...
    vte0769阅读 294评论 0 0
  • 望子成龙,娶小家碧玉 盼女成凤,嫁乘龙快婿
    石为水穿阅读 194评论 0 0