1. 程式人生 > 其它 >git merge和git rebase總結

git merge和git rebase總結

dev分支

* da349ef (dev) e
* 75350bc d
* 63cbbb8 c
* c6509a5 b
* 13405af a

檔案可能會發生衝突,需要解決一下

aaaaaaaaa


bbbbbbbbb


ccccccccc

<<<<<<< HEAD
fffffffff


ggggggggg
=======

ddddddddd

eeeeeeeee
>>>>>>> dev

最後結果

*   85ef130 (HEAD -> master) Merge branch 'dev'
|\
| * da349ef (dev) e
| * 75350bc d
* | b553464 g
* | 6d56d3d f
|/
* 63cbbb8 c
* c6509a5 b
* 13405af a

可以看出,merge 有保留dev分支的痕跡,相當於建立了一個85ef130 commit 並同時指向了da349ef (dev) e

b553464 g


再看rebase是如何處理的

Master 分支

* 2a4e835 (HEAD -> master) d
* 706b742 c
* 4807917 b
* 59a582d a

dev 分支

* 0a6ecdd (HEAD -> dev) f
* 42b6702 e
* 706b742 c
* 4807917 b
* 59a582d a

使用rebase合併分支

在master 上執行

git rebase dev

著重理解這句話

)相當於將master分支的程式碼向dev分支合併,在將master的指標指向dev上新建立的commit

可能會有衝突,解一下

aaaaaa

bbbbbb

cccccc

<<<<<<< HEAD //這裡是dev 的內容
eeeeee

ffffff
=======
dddddd
>>>>>>> d // 這裡是master的內容

衝突時,衝突部分與merge不同,相當於將master的差異程式碼往dev合併,然後產生了一個新的commit,之後將master變基到這個新的commit-id 上

解決衝突後執行 git add <conflicted_files>

,然後執行git rebase --continue

rebase操作是持續執行的,如果還有衝突,繼續執行上述操作(好處是:也方便一個衝突一個衝突的解決

rebase 合併成功後(有的也翻譯為變基),在master上檢視git日誌

* ff1a394 (HEAD -> master) d //這裡是新建立的一個commitid,commit註釋為d master變基到此
* 0a6ecdd (dev) f
* 42b6702 e 
* 706b742 c
* 4807917 b
* 59a582d a

可以看出,在master分支執行git rebase dev 是將當前分支的程式碼往dev合入,並最後將master的指標指向到在dev鏈上新建立的commit,完成合入(變基)