Git -- Rebase
git rebase: 这个命令可以把一个分支上commit的变化放到另一个分支上重新上演一遍.
简单的Rebase例子.
首先准备好一个git项目.
做一个feature分支, 然后做几个commits.
回到master分支, 再做几个commits. 然后 rebase.
最后使之达到这个效果:
现在我想让master分支rebase到my-feature分支上:
回到my-feature分支, rebase一下master上发生的变化:
在我想要rebase进去的分支上执行命令: git rebase 源分支名.
git rebase master
注意发生的变化, log里面没有分叉了.
再做一个变化,
然后commit.
现在在my-feature分支上的动作结束了, 该回到master分支了.
查看之前在master分支修改的内容, 发现没有了. 回到了最初没修改时的状态.
然后执行fast-forward merge即可:
最后删除my-feature分支即可.
冲突.
做一些修改, 然后commit.
再创建一个分支 trouble, 然后切换到该分支.
做一些修改, 再commit.
然后再回到master分支, 然后再做一些冲突的修改.
切换到trouble分支.
然后用可视化工具进行diff:
有两处冲突.
然后尝试rebase:
不出所料, 有冲突发生, 当前处于rebase暂停阶段.
这时可以放弃rebase (abort):
git rebase --abort.
查看log:
可以看到没发生变化.
解决冲突:
再次尝试rebase:
由于有冲突, 所以停留在了rebase的冲突阶段.
然后使用可视化merge工具:
解决好所有的冲突之后, 保存.
查看状态:
然后执行git rebase --continue.
查看log:
然后再做一个修改, 还是修改同一个文件. 然后commit.
当前领先master两个commits.
然后整合变化到master.
又是一个fast forward merge.
查看log:
没有分叉了.
Rebasing 远程分支(Github).
先执行git pull origin master, 然后 git push origin master.
然后修改某个文件.
然后我再github上面修改该文件(需要造成冲突), commit.
然后查看状态:
这里显示的是: 我当前的分支领先于origin/master 两个commit.
这时就需要更新引用(把可以代表历史的东西都带下来), 需要使用 git fetch 这个命令.
git fetch origin master
现在所有的引用都已经更新了.
这时查看状态:
可以看到远程和本地分支有分歧.
这次我想做的是, 想让我本地的commits合并后放在远程分支的前边.
这时可以使用git pull, 但是需要加一个参数, 使得rebase可以发生:
git pull --rebase origin master.
git pull --rebase origin master
由于有冲突, 所以要进行merge,
merge结束后, 继续rebase:
然后跳过这次commit:
git rebase --skip.
OK