網站首頁 編程語言 正文
總述
代碼合入流程用于減輕代碼合入復雜度、簡化主分支歷史(具有線性的歷史)、保證合入代碼對主分支的HEAD有效。
代碼合入分為兩步
- 解決沖突:將需要合入的分支變基到目標分支之上。保證合入代碼對目標分支的HEAD有效。此時會解決所有代碼沖突。
- 執行合入:向目標分支提交merge請求,執行合入CI后完成合入。
其中第一步“解決沖突”的方法分為兩種種情況:
- Squash。如 feature分支 向 dev分支 合入;存在沖突的合入。此時會出現 合入過程沖突多、合入結果復雜(commit多)、合入message不清晰(未能完整描述改動內容)的問題。此時不需要保存歷史commit,僅需要干凈的將feature合入master。
- Rebase。如 hotfix分支 向 dev分支 合入;feature分支 向 feature分支 合入。此時沖突少、合入結果簡單、需要保存歷史commit。
其中第二步“執行合入”應采用 merge no-fast-forward 的方式。確保合入信息可追溯和易回退。
Rebase解決沖突
適用情況
- hotfix → develop
- feature → feature
- develop → master
其中commit數量少(1~2個),開發周期短(1day)。
操作方式
其中dev分支向master分支合入。通過執行 git log --all --graph --decorate 可看到如下圖。兩個分支已經分開,如果通過在master分支git merge合入且存在沖突,那么會觸發三方合并在master生成merge commit污染主分支提交歷史,這是我們不想看到的。
此時我們執行以下流程解決問題
git checkout dev && git pull dev
git rebase master // 保證master與remote倉庫一致
// 若發生沖突執行 git mergetool 解決沖突
git rebase --continue
此時可以看到master分支和dev分支干凈得合在一起。經過單元測試并確認我們的改動沒有bug后,我們可以push并開啟mr。
Squash解決沖突
適用情況
- feature → develop
- gitlab → gerrit (此處為泊車自動同步代碼中用到)
其中commit數量多(> 2個),開發周期長(> 1day),沖突量大(每個commit可能都有沖突)。
操作方式
此處仍然是將dev合入master。其中dev分支提交歷史混亂(有tmp提交),commit號多且每個commit都與master有沖突。此時在master分支執行 git merge dev 會觸發三方合并,且保留不必要的commit歷史。不必要的提交信息如圖
操作的初始狀態如圖
此處我們執行如下操作,在master分支解決沖突并壓縮提交。隨后checkout一個提交分支并開啟mr。這有利于簡化主分支提交。但需要小心,dev分支不能再使用,需要重新從master分支拉取新的dev。
git checkout master // 保證master與remote一致
git merge --squash dev
// 解決沖突 git mergetools 、 git commit -m <總結此次提交的所有內容>
git checkout -b <mr-branch>
git push xxxx
mater結果如圖
Merge執行合入
這里強調使用merge no fast forward的目的是保留合入信息。
git checkout master
git merge --no-ff dev
原文鏈接:https://juejin.cn/post/7164657197875232805
相關推薦
- 2022-08-18 Android新建水平節點進度條示例_Android
- 2023-02-09 Python關鍵字?asynico基本用法_python
- 2022-02-15 小程序搜索框歷史記錄,去除重復搜索內容,限制顯示條數
- 2023-02-18 Flow轉LiveData數據丟失原理詳解_Android
- 2023-07-25 使用Redis做Mybatis的二級緩存
- 2022-02-12 使用background-attachment實現視差滾動、水波
- 2023-07-28 select 框添加樹結構(todu)
- 2022-03-23 Unity3d實現跑馬燈廣播效果_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支