文章目录
Git Rebase
取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
Rebase
的优势就是可以创造更线性的提交历史
演示例子
准备两个分支,master与bugFix,目的就是将bugFix的分支直接移到mater分支,看起来像顺序开发,实际上是并行开发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4BtFStaP-1574243943588)(D:\md笔记\1574233727897.png)]
-
新建分支bugFix:
$git branch bugFix
-
切换分支bugFix,提交到版本库中
$git checkout bugFix;git commit
-
切换分支master,提交到版本库中
-
切换回bugFix
$git checkout bugFix
-
把分支移到master
$git rebase master
Git之在提交树上移动
HEAD
HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。
从
bugFix
分支中分离出 HEAD 并让其指向一个提交记录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZEC05gg5-1574243943600)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1574235944677.png)]
$git checkout c4
### 相对引用
通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,所以你就不得不用 git log
来查查看提交记录的哈希值。需要提供能够唯一标识提交记录的前几个字符即可。所以通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。使用相对引用的话,便可以从一个易于记忆的地方(比如 bugFix
分支或 HEAD
)开始计算。
- 操作符
^
。加在引用名称的后面,表示让 Git 寻找指定提交记录的父提交。 比如master^
相当于“master
的父节点”。master^^
是master
的第二个父节点
$git checkout bugFix^
~操作符
操作符 ~
可以在在提交树中向上移动很多步。该操作符后面可以跟一个数字(可选,不跟数字时与 ^
相同,向上移动一次),指定向上移动多少次。
“~”操作符
如果你想在提交树中向上移动很多步的话,敲那么多 ^
貌似也挺烦人的,Git 当然也考虑到了这一点,于是又引入了操作符 ~
。
该操作符后面可以跟一个数字(可选,不跟数字时与 ^
相同,向上移动一次),指定向上移动多少次。咱们还是通过实际操作看一下吧
** 一次后退四步。**
$git checkout HEAD~4
强制修改分支位置
你现在是相对引用的专家了,现在用它来做点实际事情。
我使用相对引用最多的就是移动分支。可以直接使用 -f
选项让分支指向另一个提交。例如:
git branch -f master HEAD~3
上面的命令会将 master 分支强制指向 HEAD 的第 3 级父提交。
撤销变更
撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。
git reset
通过把分支记录回退几个提交记录来实现撤销改动。可以想象成“改写历史”。git reset
向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
Git 把 master 分支移回到 C1
;现在本地代码库根本就不知道有 C2
这个提交了 第三方的
git revert
为了撤销更改并分享给别人,需要使用 git revert
。来看演示:
运用例子
$ git reset HEAD~
$ git checkout pushed
$ git revert HEAD
自由修改提交树
整理提交记录
git cherry-pick
命令形式为:
git cherry-pick <提交号>...
将一些提交复制到当前所在的位置(HEAD
)下面的话,例子:
$git cherry-pick c2 c4
表示将提交的记录C2与c4 复制到当前分支
交互式的 rebase
不清楚想要的提交记录的哈希值,可以利用交互式的 rebase —— 从一系列的提交记录中找到想要的记录。交互式 rebase 指的是使用带参数 --interactive
的 rebase 命令, 简写为 -i
,如果命令后增加了此选项, 将会打开UI界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于理解这个提交进行了哪些更改。
当 rebase UI界面打开, 可以做3件事:
- 调整提交记录的顺序(通过鼠标拖放来完成)
- 删除你不想要的提交(通过切换
pick
的状态来完成,关闭就意味着你不想要这个提交记录) - 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。
$git rebase -i HEAD~4
在当前节点前4个进行进行进行交互式提交修改
Git 技术、技巧与贴士大集合
本地栈式提交
只要让 Git 复制解决问题的那一个提交记录就可以了。
git rebase -i
git cherry-pick
提交的技巧
之前在 newImage
分支上进行了一次提交,然后又基于它创建了 caption
分支,然后又提交了一次。此时想对的某个以前的提交记录进行一些小小的调整。比如设计师想修改一下 newImage
中图片的分辨率,尽管那个提交记录并不是最新的了。
可以采取的方法:
- 先用
git rebase -i
将提交重新排序,然后把我们想要修改的提交记录挪到最前 - 然后用
commit --amend
来进行一些小修改 - 接着再用
git rebase -i
来将他们调回原来的顺序 - 最后我们把 master 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!
的了。
可以采取的方法:
- 先用
git rebase -i
将提交重新排序,然后把我们想要修改的提交记录挪到最前 - 然后用
commit --amend
来进行一些小修改 - 接着再用
git rebase -i
来将他们调回原来的顺序 - 最后我们把 master 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!