(一)通过几种方法来指明特定的或一定范围内的提交
指明单次提交:以下四类介绍
1.简短HASH值指明单个提交:git show 77f237d
git log --abbrev-commit --pretty=oneline 注:用七个字符来输出简短唯一的七字符hash值,然后选择具体SHA-1值来git show 详细信息。
2.显示一个分支的最后一次提交的对象:git show branchname
如果你想显示某个分支的最后一次提交对象,则可以使用:git show 分支名
3.引用日志里的简称指明单个提交:git show HEAD@{n}
在你工作的同时,Git 在后台的工作之一就是保存一份引用日志——一份记录最近几个月你的 HEAD 和分支引用的日志。每次你的分支顶端因为某些原因被修改时,Git 就会为你将信息保存在这个临时历史记录里面。你也可以使用这份数据来指明更早的分支。
git reflog查看引用日志:
git log -g master 查看gitlog格式的引用日志信息:
如果你想查看仓库中 HEAD 在5次前的值,你可以使用引用日志的输出中的 @{5}
引用:git show HEAD{n}
也可以查看一定时间前分支指向哪里,例如你的master分支某一天指向哪里:
git show master@{日期}
4.祖先引用----指明某次提交的父提交:git show HEAD^ 与git show HEAD~
git show HEAD^ 表示合并是所在分支提交的父提交 ;在合并提交时,因为会有多个父提交,则git show HEAD^2表示第二父提交(第一父提交是你合并时所在分支,而第二父提交是你所合并的分支)。
git show HEAD~ 表示第一父提交,与git show HEAD^等价;但是git show HEAD~2表示第一父提交的第一父提交,即在同一分支上。
注:也可以用git show HEAD~3^2 指明先前引用的第二父提交。
指明范围提交:以下三类介绍
比如:我这个分支上还有哪些分支没合并到主干上?
1.双点:找出可从一个分支获得而不能从另一个分支获得的提交,如图你想知道开发分支上哪些还没合并到主干
git log master..experiment (这句话的意思是“所有可从experiment分支中获得而不能从master分支中获得的提交”。)
$git log master..experiment
形象描述,输出:D C
git log experiment..master(反过来所有在 master
而不在 experiment
中的分支)
$git log master..experiment
形象描述,输出:E F
注:可以查看你将什么推送到远程:git log origin/master..HEAD
2.多点:在多个分支筛选提交,在哪些分支不在哪个分支:
两个分支的话,如下三种效果一样:
git log refA..refB <=>git log ^refA..refB <=> git log refB - -not refA
多分支:
git log refA refB ^refC <=> git log refA refB - -not refC
3.三点:在两个分支中被单个分支包含但又不被同时包含
git log master...experiment
上例: $git log master...experiment
形象描述,输出:E F D C
(二)储藏(stashing)
描述常见情况:当你正在处理项目中某部分工作,此时的工作区处于比较杂乱的状态,而你需要转到其他分支处理一个比较急的情况。那么问题来了,你不想提交进行到一半的工作,但是切到其他分支,你以后又很难回到目前的工作点(包括你修改过的被追踪文件和暂存的变更),那么可以用git stash命令;此命令可获取你工作目录的中间某状态,将你那些修改的被追踪文件和暂存的变更保存到一个专门存储未完结变更的堆栈中,随时可以重新应用。
1.往堆栈推送一个目前的本地工作区储藏:git stash
2.你切到另一分支处理需求后,回到先前分支去应用储藏的状态:git stash list ;git stash apply stash{0}
注:如果你想应用更早的储藏,你可以通过名字指定它,像这样:git stash apply stash@{2}
。如果你不指明,Git 默认使用最近的储藏并尝试应用它。
有个问题需要注意:对文件的变更被重新应用,但是被暂存的文件没有重新被暂存。你需要加上–index选项即可。对比如下图:
git stash apply --index
3.移除储藏记录:可以注意到每次删除一个后,堆栈里记录还是从1++的,即stash{2}删除后,stash{3}就成了stash{2}。
延伸:你可以在其中一个分支上保留一份储藏,随后切换到另外一个分支,再重新应用这些变更,这是可以的。在工作目录里包含已修改和未提交的文件时,你也可以应用储藏,如果有任何变更无法干净地被应用,此时Git 会给出归并冲突直到冲突解决。
如下分析一种情况并给出快捷解决途径:
问题如图:你储藏一个状态,然后接着还在这个分支工作,修改提交了更新。然后你去应用储藏出现了冲突,你必须解决冲突。
解决:你可以运行 git stash branch BranchName
,这会创建一个新的分支,检出你储藏工作时所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。
(三)交互式暂存
描述常见情况:假如你修改了大量文件,想要按逻辑分为各有侧重的变更集提交,而不是一个有大又乱的提交,这个工具会很有用。
git add -i (i是interactive交互式,git会启动一个交互式的shell模式,显示如下信息)
1.暂存文件选择:
可以看到如下file123三个文件未暂存状态,在what now后输入2或者u,选择1、2、3中决定提交的某个或某批文件,回车,退出后去commit,这样就提交了一笔选中文件的提交。
2.撤回已经暂存的某些文件:选中r或者3,回车,退出去commit
有兴趣还可以研究下patch功能:
交互式工具中的patch选项功能是暂存某个文件的某些部分而忽略其他的:Git会询问哪些文件你希望部分暂存;然后对于被选中文件的每一节,他会逐个显示文件的差异区块并询问你是否希望暂存他们。