git merge 和 git rebase的差别

假设最开始只有一个origin分支
然后你在本地新建了一个分支来开发自己的工作叫mywork,然后我们做一些修改添加,并提交两个commit

$ git checkout -b mywork origin
$ vi file.java
$ git add file.java
$ git commit 
$ vi otherfile.java
$ git add otherfile.java
$ git commit 

image.png

这时有人在origin中做了一些修改并提交,推送到origin了

image.png

这时你可以"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交",合并时可以用rebase和merge
git merage

image.png
git checkout origin
git pull
git checkout mywork
git merge origin

这时Git 会用两个分支的末端(C4 和 C6)以及它们的共同祖先(C2)进行一次简单的三方合并计算
对三方合并后的结果重新做一个新的快照,并自动创建一个指向它的提交对象(C7),此时mywork快进到c7也指向c7。这就是merge他会保留每一次提交的历史。
git rebase
但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:

git checkout mywork
git rebase origin
// git rebase --onto master server client

上面的命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新到最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上生成c5' 和 c6‘

image.png

这时如果想把mywork合并到origin上,可以运行如下命令

git checkout origin
git merge mywork 

你可能感兴趣的:(git merge 和 git rebase的差别)