读git书籍笔记(精通git - 第二版)第四节: Git工具

选择修订版本

1.单个修订版本

git log:查看提交日志

$ git log
commit 1a679675596f01d05ec390ed6149cafe06251012 (HEAD -> master, origin/master)
Author: xx
Date:   Mon Dec 10 20:30:06 2018 +0800
    new1
commit d23004ca822c476bc70d393e0da0375784f27810
Merge: ef85a7d a02a7a4
Author: xx
Date:   Mon Dec 10 20:27:56 2018 +0800
    Merge branch 'testing'
commit ef85a7d22a759366e9ce3f776aa4039509a4f041
Author: xx
Date:   Mon Dec 10 20:07:42 2018 +0800
    新的提交
commit a02a7a4c9256f549734e977a39e01fb052d2c207
Author: xx
Date:   Mon Dec 10 20:06:17 2018 +0800

git show: 查看单次提交日志
项目中8-10个字符的版本号就可以避免重复了。

// 三个命令相同
$git show a02a7a4c9256f549734e977a39e01fb052d2c207
$git show a02a7a4c9256f549734e9 
$git show a02a7a4c925

2.reflog简称

git reflog: 最近几个月的HEAD 和分支引用的日志

$git reflog
1a67967 (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from testing to master
0c28926 (origin/testing, testing) HEAD@{1}: commit: new2
a02a7a4 HEAD@{2}: checkout: moving from master to testing
1a67967 (HEAD -> master, origin/master) HEAD@{3}: commit: new1
d23004c HEAD@{4}: merge testing: Merge made by the 'recursive' strategy.
ef85a7d HEAD@{5}: commit: 新的提交
1f40fa9 (tag: v1.3, tag: v1.1) HEAD@{6}: checkout: moving from testing to master
a02a7a4 HEAD@{7}: commit: 新的
1f40fa9 (tag: v1.3, tag: v1.1) HEAD@{8}: checkout: moving from master to testing
1f40fa9 (tag: v1.3, tag: v1.1) HEAD@{9}: commit: 新提交
e9b0c95 HEAD@{10}: commit: 新的
0fcdd63 HEAD@{11}: commit (initial): init project

git show HEAD@{3}查看仓库中HEAD在之前第3次的值,可以使用@{n}带来引用reflog的输出
git show HEAD@{2.month.ago}:仅在项目克隆至少两个月才会生效。
git show master@{yesterday}查看master分支昨天在哪个位置(该命令仅对仍包含在reflog中的数据有效)
git log -g master:git log格式的reflog信息

注意⚠️:reflog数据仅保存在本地

3.祖先的引用

在引用尾部添加^,Git会将其解释为此次提交的父提交。
git show HEAD^:查看当前提交的上一次提交
^后面加数字:代表此次提交的第几个父提交,该命令仅在合并提交时有效,因为只有合并提交才会有多个父提交,首个提交是指你合并时所在的分支,第二个提交时你所合并的分支。
git show HEAD^2:此次提交的第2个父提交
git show HEAD~ === git show HEAD^
git show HEAD~2 === git show HEAD^^:指首个父提交的首个父提交

4.提交范围

双点号

这种语法可以让Git找出那些不在同一个分支上的提交。
git log master..testing:想要知道分支testing中哪些没有合并到master分支上、

$ git log master..testing
commit 0c28926960cca461468f7ffeea7c7f8b4564e032 (origin/testing, testing)
Author: xx
Date:   Mon Dec 10 20:31:01 2018 +0800

    new2

git log testing..master所有在master分支上,但不在testing分支上。
git log origin/master..HEAD:如果想使testing分支处于最新状态,需要看看接下来要合并哪些提交.

多点

针对两个以上分支指明修订版本
git log refA..refB === git log ^refA refB === git log refB --not refA
想要查看包含refA refB但不包含refC中的提交git log refA refB ^refC===git log refA refB --not refC`

三点

查看属于refA或 refB分支的非共有引用
git log refA...refB

交互式暂存

git add -i ===git add --interactive:git会进入交互模式,显示类似信息

         staged     unstaged path
  1:        +4/-0      nothing README.md

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now
暂存和取消暂存文件

在What now后面输入对应1-8编号,会进入缓存,输入需要缓存的文件的编号1,则1文件前面会带有*,表示README.md文件已被选中暂存,Update>>后继续回车键,Git会暂存选中的文件。

What now> 2 
           staged     unstaged path
  1:        +4/-0        +1/-4 README.md
Update>> 1
           staged     unstaged path
* 1:        +4/-0        +1/-4 README.md
Update>> 
updated 1 path

如果想要取消暂存README.md,可以使用3或者r,继续输入README.md文件的编号,继续回车,则会取消对文件的暂存。

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> r
           staged     unstaged path
  1:        +2/-1      nothing README.md
Revert>> 1
           staged     unstaged path
* 1:        +2/-1      nothing README.md
Revert>> 
reverted 1 path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> 

使用6(diff),会显示已暂存文件的列表,执行文件编号->回车 === git diff --cache

What now> 6
           staged     unstaged path
  1:        +2/-1      nothing README.md
Review diff>> 

暂存补丁git add -p

Git也可以只暂存文件的某一部分,例如对README.md文件进行了两处修改,只希望对其中一次进行暂存,可以在交互式提示符中输入5/p(代表patch补丁)。Git会询问您部分暂存哪些文件,然后对于所选择文件的每一个区域,都会逐个显示出文件的差异并询问是否需要暂存。
输入?会显示操作列表

储藏与清理

git stash在处理项目的某一部分时,想转到其他分支,并不想提交这部分。
储藏:能过获取工作目录的中间状态,也就是修改过的被跟踪的文件以及暂存的变更,并在该中间状态保存在一个包含未完成变更的栈中,随后在恢复这些状态。

On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   README.md

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:   README.md5r45

想要切换分支到testing,但是不想提交,则可以执行git stash === git stash save

git stash
Saved working directory and index state WIP on master: 1a67967 new1

查看保存列表git stash list

stash@{0}: WIP on master: 1a67967 new1

通过git stash apply stash{0}来指定应用那次储藏。
git stash apply默认应用最近那次储藏。
git stash pop应用储藏,然后立即从栈中丢弃。
git stash --keep-index不要存储已经用git add命令暂存过的内容
git status -s如果做了若干处修改,但是只想提交其中的一部分,随后再来处理余下的改动,那么这个命令的功能相当有用。

从储藏中创建分支

如果已经储藏过文件之后,又更改了储藏的文件,又想要应用储藏成果,就会产生冲突,可以执行git stash branch,会创建一个新的分支,检出在储藏时的所在的提交,重新应用成果,如果应用成功应用,就会丢掉储藏。

清理工作目录(不要轻易使用)

git clean:注意⚠️该操作会从工作目录中删除所有为跟踪过的文件
git stash --all删除全部内容,同时储藏。
git clean -f -d会将文件全部删除并清空所有子目录,-f表示强制force.

搜索

git grep

该命令可以在 任何提交树工作目录中方便地查找某个字符串或正则表达式。
在默认情况下grep只查找工作目录下的文件,可以使用-n来输出匹配位置的行号。

$ git grep -n [search]

例如

$ git grep -n icon-left
src/components/common/menu/Menu.vue:18:          <div class="menu-item-icon menu-item-icon-left">
src/components/common/menu/Menu.vue:37:            <div class="menu-item-icon menu-item-icon-left"></div>
src/components/common/menu/menu.scss:66:    .menu-item-icon.menu-item-icon-left {

可以使用--count选项让Git输出总信息:匹配到了哪些文件,每个匹配文件中有多少处匹配。

$git grep --count [search]

例如

$ git grep --count icon-left
src/components/common/menu/Menu.vue:2
src/components/common/menu/menu.scss:1

如果想要看看查找到的匹配属于哪个方法和函数,可以使用-p选项。

$ git grep -P icon-left

Git日志搜索

如果想知道常量icon-left是在什么时候出现的,可以使用-S(注意是大写)选项让Git只显示出添加过或删除过字符串的那些提交

$ git log -S icon-left --oneline
ed0c891 菜单样式优化
行日志搜索

git log -L:可以展示代码苦衷某个函数或代码行的历史
例如项看文件。menu.vue中函数getSubMenuPermission的所有改动纪录,可以执行git log -L :getSubMenuPermission:menu.vue

重写历史

修改最近一次的提交

修改最近的提交信息和修改由于文件添加,改动,删除记录下的快照。
git commit --amend只是想修改最近的提交信息

修改多个提交信息

可以通过变基操作来实现
git base -i:可以进入变基命令的交互操作,但是使用命令需要知道变基到哪次提交
如果想要改变最近三次或其中任意一次的提交信息,需要将待修改的最近一次提交的父提交座位参数传给git rebase -i, 也就是HEAD^2或者HEAD~3,

$git rebase -i HEAD~3
pick 57341bf 修改创建时清空信息顺序
pick f130554 变更资源部分接口 + consumer
pick a04736f update
pick 57f8f64 修改v1.3.1新建用户时显示问题

这个展示的顺序,于提交的顺序时相反的,最近一次的提交在最下面。

步骤:esc键是退出,u键是后退,i键是进入编辑

将以上git信息中的pick改为edit保存并退出后,git会倒回带列表中最后一次提交并使你返回到命令行中,同时显示如下信息

$ git rebase -i HEAD~3
xxxxxxx
  git commit --amend // 修改提交信息,并退出编辑器
XXXXXXX
  git rebase --continue // 这条命令会自动应用到其他两次提交中。

重排提交

可以通过交互变基的形式,进行重排提交或删除提交 added cat-file,改变另外两次提交的次序

pick 57341bf 修改创建时清空信息顺序
pick f130554 变更资源部分接口 + consumer
pick a04736f update
pick 57f8f64 修改v1.3.1新建用户时显示问题

可以将两次提交更改顺序为(此实例没有成功)


pick f130554 变更资源部分接口 + consumer
pick 57341bf 修改创建时清空信息顺序

压缩提交

将一系列提交压缩成单个提交
如果将pick改为squash,如果想将三次提交变成单个提交,将

pick 57341bf 修改创建时清空信息顺序
squash f130554 变更资源部分接口 + consumer
squash a04736f update

保存退出之后就会合并3次提交信息

拆分提交

拆分提交会撤销一次提交,然后根据需要提交的次数进行多次部分暂存和提交。。。。。

重置的作用

例子:重新修改文件并提交到master

  • 第一步移动HEADreset:移动HEAD所指向的分支:执行git reset [提交版本号] 会将master分支指向该提交版本。
  • 第二步更新索引(--mixed):现在执行git status 就会看到绿色的索引与新的HEAD之间的差异。reset的作用就是使用HEAD当前所指向的快照的内容来更新索引。
    如果制定了--mixed选项,reset会再次停止,即执行git reset HEAD~命令会在这里停下来。
    git reset [--mixed] HEAD~:会撤销最近的提交,也会撤销暂存所有东西,回滚到了执行git add 和git commit 命令之前的状态。
  • 第三步:更新工作目录(git reset hard HEAD~):会撤销git add 和git commit 命令以及工作目录中所做的全部工作。(注意!这步是比较危险的操作)
    回顾:
    reset命令会以特定的次序重写这三棵树,并在你指定一下操作时停止。
    (1)移动HEAD分支的指向(如果指定了--soft,则再次停止)
    (2)使索引看起来像HEAD(除非制定了--hard,则在此停止)
    (3)使工作目录看起来像索引。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,494评论 0 13
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,627评论 9 163
  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,449评论 1 26
  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,396评论 0 7
  • 元认知 所谓元认知就是对认知的认知,具体地说,是关于个人自己认知过程的知识和调节这些过程的能力:对思维和学习活动的...
    鸭梨山大哎阅读 554评论 0 2