網(wǎng)站首頁 編程語言 正文
在基于 Git 的開發(fā)過程中,我們很容易遇到合并代碼的情況,例如我們從 master 分支拉取了一個(gè) feature 分支,當(dāng)我們開發(fā)到一段時(shí)間之后,可能需要將 master 的代碼合并到我們當(dāng)前的 feature 分支之中。
這時(shí),我們有兩個(gè)選擇,一個(gè)是使用git merge
命令,一個(gè)是使用git rebase
命令,這兩個(gè)命令都是用來合并代碼的,但卻有一些差異。在本文中,我們主要講述git rebase
命令的使用方法,也會(huì)簡(jiǎn)單介紹這兩個(gè)命令的差異。
如上圖所示,我們從 master 分支拉取了一個(gè)名為 feature 的分支,并且在拉取新分支之后,有過三次提交記錄;同時(shí),master 分支在我們拉取 feature 分支之后,也有過兩次提交記錄?,F(xiàn)在我們已經(jīng)構(gòu)造了背景,接下來我們合并代碼。
首次,我們使用merge
命令,其命令形式一般為git merge --no-ff master
,即表示將 master 的代碼合并到 feature 分支,其中--no-ff
參數(shù)是為了保留 master 分支的提交記錄。如上圖所示,在使用merge
命令進(jìn)行代碼合并之后,Git 會(huì)自動(dòng)創(chuàng)建一個(gè)新的 commit 用來表示當(dāng)前的合并操作,此 commit 記錄了 master 代碼合并到 feature 分支時(shí)產(chǎn)生的所有改動(dòng)。
接下來,我們使用rebase
命令,其命令一般形式為git rebase feature
,即表示在 master 分支上執(zhí)行rebase
命令,將 feature 分支的代碼合并到 master 分支。如上圖所示,在使用rebase
命令之后,Git 會(huì)合并兩個(gè)分支的 commit 記錄,其規(guī)則為「在基準(zhǔn)分支上合并目標(biāo)分支的代碼,會(huì)將目標(biāo)分支的提交記錄全部前置到基準(zhǔn)分支的最新提交記錄之前」,就如上面這樣,我們?cè)?master 分支上使用了rebase
命令之后,Git 將 feature 分支上面的所有 commit 記錄都前置到了 master 分支的最新 commit 記錄之前。
在這里,需要注意的是:rebase
是以 commit 為維度的,按 commit 提交的順序依次進(jìn)行合并操作;如果在合并的過程中,某個(gè) commit 遇到了沖突,則需要我們先解決該沖突,然后才能繼續(xù)進(jìn)行合并操作。特別地,在我們解決沖突之后,需要使用git add + 沖突文件
命令將當(dāng)前沖突標(biāo)記為已解決,然后使用git rebase --continue
命令繼續(xù)合并操作。
通過上面的描述,我們能發(fā)現(xiàn)merge
和rebase
有一個(gè)很明顯的差異,那就是當(dāng)遇到?jīng)_突的時(shí)候,使用merge
命令,我們只需要解決一次沖突即可;使用rebase
命令,我們則需要依次解決每一個(gè)沖突。
對(duì)于 Git 的rebase
命令,其除了能進(jìn)行代碼合并之外,還有一個(gè)常用的功能,那就是將多個(gè) commit 合并為一個(gè),仍然以上面的 feature 分支為例,我們將其從 master 分支拉取之后,進(jìn)行了三次提交,現(xiàn)在我們將這三個(gè)提交結(jié)論合并為一個(gè),其命令一般形式為:
git rebase -i HEAD~N
其中,N
為我們需要合并的 commit 記錄的數(shù)量,因?yàn)槭纠惺侨翁峤挥涗洠栽诖藞?chǎng)景下,將N
替換為3
即可。
在執(zhí)行完上面的命令之后,我們會(huì)進(jìn)入vi
或者vim
文件編輯器:
如上圖所示,pick
標(biāo)識(shí)了我們的三次提交記錄,按i
建進(jìn)入編輯模式,保留第一個(gè)pick
,然后將后面兩個(gè)pick
修改為s
或者f
,然后鍵入:wq
保留修改。最后,為了將變更同步到遠(yuǎn)程分支,我們需要使用git push -f
命令,其中參數(shù)-f
表示強(qiáng)制提交。
原文鏈接:https://blog.csdn.net/qq_35246620/article/details/124718643
相關(guān)推薦
- 2023-07-02 oracle實(shí)現(xiàn)根據(jù)字段分組排序,取其第一條數(shù)據(jù)_oracle
- 2022-07-14 React父子組件傳值(組件通信)的實(shí)現(xiàn)方法_React
- 2022-09-27 阿里云官方Redis開發(fā)規(guī)范總結(jié)_Redis
- 2023-01-29 switch多選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)示例詳解_Swift
- 2022-03-17 SQL?Server?DATEDIFF()?函數(shù)用法_MsSql
- 2022-07-15 SQL?Server中執(zhí)行動(dòng)態(tài)SQL_MsSql
- 2023-10-14 List排序問題
- 2022-08-14 Android?中TextureView和SurfaceView的屬性方法及示例說明_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支