對(duì)學(xué)院網(wǎng)站建設(shè)的建議搜索風(fēng)云榜
目錄
1.概述
2.merge
3.rebase
4.merge和rabase的區(qū)別
5.解決沖突
1.概述
在實(shí)際開發(fā)中,一個(gè)項(xiàng)目往往是多個(gè)人一起協(xié)作的,頭天下班前大家把代碼交到遠(yuǎn)端倉(cāng)庫(kù),第二天工作的第一件事情都是從服務(wù)器上拉最新的代碼,保證代碼版本的一致性。在這種團(tuán)隊(duì)協(xié)作中大家修改到同一份文件是難以避免的。在git的機(jī)制中,只要遠(yuǎn)端和本地倉(cāng)庫(kù)中對(duì)同一份文件進(jìn)行了修改,就認(rèn)定為沖突,需要開發(fā)者來(lái)手動(dòng)合并二者的沖突。在git中合并代碼的常用方式有兩種:
- merge
- rebase
merge用來(lái)合并分支,rebase用來(lái)變基。
2.merge
Git的merge命令用于將兩個(gè)或多個(gè)分支的代碼合并到一個(gè)新的或現(xiàn)有的分支中。合并操作將兩個(gè)分支的歷史記錄集成到一個(gè)新的提交中,這使得不同開發(fā)者在不同分支上的工作能夠被合并到一起。
常見的用法:
將指定的分支(<branch-name>)合并到當(dāng)前所在的分支中:
git merge <branch-name>
合并遠(yuǎn)程分支 origin/feature-branch 到當(dāng)前分支:
git merge origin/feature-branch
支持的一些參數(shù):
-m <message> | 用于指定合并提交的提交信息 |
-no-ff | 禁用快進(jìn)合并(fast-forward merge),即使可以快進(jìn)合并,也創(chuàng)建一個(gè)新的合并提交。這樣可以保留每個(gè)分支的歷史記錄。 |
-squash | 將多個(gè)提交壓縮成一個(gè)提交,然后再合并。 |
3.rebase
git rebase,變基,其能實(shí)現(xiàn)和merge相同的效果,將一個(gè)分支上的版本變化合并到另一個(gè)分支上去。
一下是一些常見用法:
git rebase <base-branch>
這個(gè)命令的意思是,將當(dāng)前分支的修改(即當(dāng)前分支相對(duì)于 <base-branch> 的變化)在 <base-branch> 上重新應(yīng)用一遍。
4.merge和rabase的區(qū)別
merge 和 rebase 是 Git 中用于將分支合并的兩種不同方法,它們各自有不同的用途和影響。以下是它們之間的主要區(qū)別:
1. Merge(合并):
創(chuàng)建新的合并提交: merge 將源分支的所有提交合并成一個(gè)新的合并提交,它保留了原有的提交歷史。在合并時(shí),Git 會(huì)創(chuàng)建一個(gè)新的合并提交,將所有合并的提交信息保存下來(lái)。
不修改提交歷史: 合并操作不修改源分支和目標(biāo)分支的提交歷史,每個(gè)分支的提交歷史都會(huì)保持不變。這意味著,你可以清晰地看到哪些提交是在哪個(gè)分支上完成的。
保留分支的獨(dú)立性: 合并保留了每個(gè)分支的獨(dú)立性,即使兩個(gè)分支合并了,它們的提交歷史仍然可以追溯到各自的起點(diǎn)。
2. Rebase(變基):
將一系列提交應(yīng)用到另一個(gè)基礎(chǔ)上: rebase 會(huì)將當(dāng)前分支的提交“挪動(dòng)”到目標(biāo)分支上,使得當(dāng)前分支的提交歷史變得更加線性。它會(huì)將一系列提交應(yīng)用到另一個(gè)基礎(chǔ)上,使得提交歷史變得更加干凈、易讀。
修改提交歷史: Rebase 會(huì)修改提交歷史,因?yàn)樗鼘?dāng)前分支的提交重新應(yīng)用到了新的基礎(chǔ)上。這樣,你可以在提交歷史中看到一個(gè)更連貫的提交序列。
可能會(huì)丟失分支獨(dú)立性: 由于 rebase 將提交歷史變得線性,所以在 rebase 后,你無(wú)法直觀地看出哪些提交是在原分支上完成的,可能會(huì)丟失分支的獨(dú)立性。
5.解決沖突
不管是merge也好還是rebase也好,涉及到代碼的合并就一定會(huì)或多或少涉及沖突問(wèn)題,接下來(lái)聊一下怎么解決沖突。
首先博主在遠(yuǎn)端倉(cāng)庫(kù)和本地同時(shí)修改一個(gè)類來(lái)模擬遠(yuǎn)端他人的提交和本地自己的提交的沖突。
遠(yuǎn)端修改:
在遠(yuǎn)端倉(cāng)庫(kù)上點(diǎn)擊編輯文件的按鈕可以編輯該文件。
這里我們把main方法刪掉,修改完文件后點(diǎn)擊commit changes可以保存:
本地修改:
將本地修改推送到遠(yuǎn)端時(shí),會(huì)直接被拒絕:
push of current branch main was rejected.remote changes need to be merged before pushing.
很明顯在提示遠(yuǎn)端有修改需要先合并一下才能推送。
點(diǎn)擊merge或者重新pull,進(jìn)入合并沖突的界面,手動(dòng)來(lái)解決沖突問(wèn)題:
中間的是最終的合并結(jié)果,可以手動(dòng)來(lái)調(diào)整,點(diǎn)擊左右各自的箭頭可以將箭頭后面擴(kuò)進(jìn)去的這一塊兒改動(dòng),合到結(jié)果中去。當(dāng)然也可以直接不合并,直接選擇遠(yuǎn)端或者本地的版本來(lái)作為最后的結(jié)果。在上一個(gè)界面中有accept yours(以本地為準(zhǔn)),accept theris(以遠(yuǎn)端為準(zhǔn));在手動(dòng)合并的界面左下角有accept left和accept right,都可以用來(lái)整體選擇一個(gè)版本作為最終的合并結(jié)果。
合并完成后需要重新推送: