git rebase
对于初学者,应该并不常用,虽然自己已经使用了git两年时间了,还是第一次了解到有这个东西,但这并不能说明其不重要,相反,git rebase是相当重要的一个知识点,在上周看的一篇博客中更是把这个列为必会的一个知识点(也是我学习这个东西的原因)。
它是干嘛的?
Rebase,中文世界里常被称为「变基」,即改变基础。
它主要用在两个地方:
合并多次提交纪录
分支合并
合并多次提交记录
因为各种各样的原因,我们会有一些没有什么意义的commit信息,比如合并分支,修复单元测试等等
这些信息,审核代码的人并不关心,而且影响美观,当然,这些东西提交上去也没什么大坏处,但可以更好,为什么不做呢?
这时我们就可以通过rebase命令来删除多余的提交记录:
git rebase -i HEAD~4 #HEAD~4代表修改最近的四次提交
这几个命令需要注意一下:
- p, pick = use commit (即使用这个commit)
- r, reword = use commit, but edit the commit message(改变commit 的信息)
- s, squash = use commit, but meld into previous commit(融入先前的commit)
- f, fixup = like “squash”, but discard this commit’s log message(放弃此提交的日志消息)
- d, drop = remove commit(移除commit)
把2,3行的消息进行更改,pick
换成s
,之后使用git log
查看提交信息,可以看到2,3,4合并成了一个
用一个图片表示一下上述过程
error: cannot 'squash' without a previous commit
保存的时候你可能会遇到这个错误。
注意不要合并先前提交的东西,也就是已经提交远程分支的纪录。
分支合并
通过git rebase master
,分支1
变成了基于commit2的分支。
当然,上述过程你完全可以通过git merge
来实现,但这不就回到上面那个需要解决的问题——污染了提交。
git干了嘛
git在这个过程干了什么呢?
首先,git 会把分支1
里面的每个 commit 取消掉;
其次,把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;
然后,把分支1
分支更新到最新的master
分支;
最后,把上面保存的 patch 文件应用到分支1
分支上;
遇到冲突怎么办
在这种情况,git 会停止 rebase 并会让你去解决冲突。在解决完冲突后,用 git add 命令去更新这些内容。
注意,你无需执行 git-commit,只要执行 continue
git rebase --continue
在任何时候,我们都可以用 --abort 参数来终止 rebase 的行动,并且分支会回到 rebase 开始前的状态。(git rebase —abort
)
若是对上面所说的感觉不明白,可以跟着这篇文章的视频,自己操作一下,相信在这之后你就能明白了。
同时,你还可以去这个网站通过游戏的形式来学习git。
需要注意的是
git rebase
有时并不安全。
一条 rebase 黄金法则:绝不要在公共的分支上使用它。 git rebase
会重写历史,一定只能在你自己的分支上使用它。
假如,你和同事都在分支1
上开发
你进行了git rebase
并提交了远程分支。
而同事的仍然没变,那么当他 pull 远程 master 的时候,就会丢失提交纪录。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。