选择修订版本
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
- 第一步移动HEAD
reset:移动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)使工作目录看起来像索引。