大胡子也说过 pull 一定要 rebase...
如果 merge 没有 no-ff 而且 merge 时没冲突的话,就没有 merge commit 了,github network 上就会把两个分支的标签叠在一起,没有反映平行开发的真实情况 ...
小心处理的一个好处是清晰的路线图:同样的 commit 不重复出现,merge 可以看到箭头,有箭头的地方一定是 merge.
另一个好处是 github 的 pull request. pull request 界面中,点 merge 按钮和 merge --no-ff 是等价的,如果本地 merge --no-ff, 也会自动关闭 github 上的 pull request.
不小心处理的话,可能会发生一些奇怪的事情,例如:
- 在路线图中同样的 commit 出现在两个地方,但是 hash 不一样
- merge 的时候同一个冲突很奇怪的要解决很多遍
- git blame 发现弄坏代码的人是自己,但那段其实是另一个人写的,比窦娥还冤...
这里面有些和 rebase 的机制有关 (我不敢说全部...). rebase 会将本分支中所有冲突的 commit 都挨个修改一遍,从冲突点开始,本地 commit 的 sha1 hash 都变了。所以只适合在 pull 同一分支时用:这些 commit 只在本地有一份,就不会产生 1 和 3 的情况了。
git 太多内容了,有时出 rp 问题了还觉得自己完全不懂 git, git 也一直在出新功能,可以一直学下去...
附带分享一下我的 ~/.gitconfig , git gl 可以在命令行看到路线图
[alias]
s = status
c = commit
b = branch
co = checkout
d = diff
lg = log -p
gl = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr,%an)%Creset' --abbrev-commit --date=relative
l = shortlog -s --
merge = merge --no-ff
@Rei 是我没写清楚,这里假设本地修改都 commit 了而且处于 rebase 中途...