從概念上辜膝,git merge和git rebase都是用來解決同樣的問題,即合并兩個(gè)branch的修改漾肮。
Both of these commands are designed to integrate changes from one branch into another branch—they just do it in very different ways.
merge
git merge dev:
Git 會(huì)自動(dòng)根據(jù)兩個(gè)分支的共同祖先commit 和兩個(gè)分支的最新提交即進(jìn)行一個(gè)三方合并厂抖,然后將合并中修改的內(nèi)容生成一個(gè)新的 commit.
rebase
如果是在 master 分支上git rebase deve:Git 會(huì)從兩個(gè)分支的共同祖先開始提取 master 分支(當(dāng)前所在分支)上的修改,再將 master 分支指向 deve 的最新提交(目標(biāo)分支)處初橘,然后將剛剛提取的修改依次應(yīng)用到這個(gè)最新提交后面验游。操作會(huì)舍棄 master 分支上提取的 commit充岛,同時(shí)不會(huì)像 merge 一樣生成一個(gè)合并修改內(nèi)容的 commit,相當(dāng)于把 master 分支(當(dāng)前所在分支)上的修改在 deve 分支(目標(biāo)分支)上原樣復(fù)制了一遍.且新commit的hash code不同耕蝉。
(串行)
總結(jié):選擇 merge 還是 rebase崔梗?
merge 是一個(gè)合并操作,會(huì)將兩個(gè)分支的修改合并在一起垒在,默認(rèn)操作的情況下會(huì)提交合并中修改的內(nèi)容
merge 的提交歷史忠實(shí)地記錄了實(shí)際發(fā)生過什么蒜魄,關(guān)注點(diǎn)在真實(shí)的提交歷史上面
rebase 并沒有進(jìn)行合并操作,只是提取了當(dāng)前分支的修改场躯,將其復(fù)制在了目標(biāo)分支的最新提交后面
rebase 的提交歷史反映了項(xiàng)目過程中發(fā)生了什么谈为,關(guān)注點(diǎn)在開發(fā)過程上面
merge 與 rebase 都是非常強(qiáng)大的分支整合命令,沒有優(yōu)劣之分踢关,使用哪一個(gè)應(yīng)由項(xiàng)目和團(tuán)隊(duì)的開發(fā)需求決定
merge 和 rebase 還有很多強(qiáng)大的選項(xiàng)伞鲫,可以使用git help 查看
最后:一些注意點(diǎn)
使用 merge 時(shí)應(yīng)考慮是采用--no-ff默認(rèn)操作,生成一個(gè)對(duì)回顧提交歷史并不友好的合并記錄签舞,還是采用--ff-only方式
rebase 操作會(huì)丟棄當(dāng)前分支已提交的 commit秕脓,故不要在已經(jīng) push 到遠(yuǎn)程,和其他人正在協(xié)作開發(fā)的分支上執(zhí)行 rebase 操作
與遠(yuǎn)程倉(cāng)庫(kù)同步時(shí)儒搭,使用 pull 命令默認(rèn)進(jìn)行了git fetch + git merge --no-ff兩個(gè)操作吠架,可以通過加上--rebase命令將 fetch 后的 merge 操作改為 rebase 操作,或者僅僅 'git fetch remoteName',然后才思考采取哪種整合策略git merge(or rebase) origin/master
開發(fā)與 commit 時(shí)注意自己此時(shí)在哪個(gè)分支上搂鲫。
Summary
If you would prefer a clean, linear history free of unnecessary merge commits, you should reach for git rebase instead of git merge when integrating changes from another branch.
On the other hand, if you want to preserve the complete history of your project and avoid the risk of re-writing public commits, you can stick with git merge.?
參考:
http://www.reibang.com/p/c17472d704a0
https://www.atlassian.com/git/tutorials/merging-vs-rebasing