爲什麼需要合併分支?¶
想象你和同事一起開發一個項目,你負責“用戶登錄功能”,同事負責“購物車功能”。爲了避免互相干擾,你們可以在Git中創建不同的分支來獨立開發,完成後再把各自的工作合併到主項目(通常是master分支)中。合併分支就像是把兩個人的“成果”整合到一起,讓整個項目繼續推進。
Fast-forward合併:最簡單的“快進式”合併¶
什麼是Fast-forward?¶
當你從主分支(比如master)創建一個新分支(如feature/login),並在新分支上完成修改後,主分支在此期間沒有任何新提交。此時合併新分支到主分支時,Git會直接把主分支的指針“快進”到新分支的最新提交,就像時間線直接延伸,不會產生新的合併記錄。
舉個例子:
1. 初始狀態:master分支只有1個提交(假設是基礎代碼)。
2. 創建並切換到feature/login分支,修改代碼並提交(此時master分支未變)。
3. 切換回master分支,執行git merge feature/login,Git發現master和feature/login的歷史是“線性”的(master在feature/login之前沒有分叉),於是直接將master的指針移到feature/login的最新提交。
Fast-forward的特點:¶
- 沒有新提交:合併後主分支歷史中,
feature/login的提交會被直接“接上”,不會出現額外的“合併提交”。 - 操作簡單:無需解決衝突(因爲分支未分叉),直接快進完成合並。
普通合併:帶新提交的“分叉式”合併¶
什麼是普通合併?¶
如果在feature/login開發的同時,有人在master分支上也提交了新代碼(比如修復了一個bug),此時master和feature/login的歷史就會出現“分叉”。合併時,Git會創建一個新的合併提交,把兩個分支的歷史“粘”在一起,這個新提交會同時包含兩個分支的修改內容。
舉個例子:
1. 初始狀態:master分支有提交A(基礎代碼)。
2. 創建feature/login分支,修改代碼並提交(此時master仍爲A)。
3. 切換回master分支,再提交一個新內容(如提交B)。
4. 切換回feature/login分支,修改代碼並提交(此時master有A和B,feature/login有A和C)。
5. 切換回master分支,執行git merge feature/login,Git會創建一個新的合併提交D,包含A、B、C的內容,此時master的歷史就變成了A→B→D。
普通合併的特點:¶
- 有新提交:合併後主分支會多出一個“合併提交”(顯示
Merge branch 'feature/login')。 - 可能需要解決衝突:如果兩個分支修改了同一文件的同一行,Git無法自動合併,會提示“衝突”,需要手動修改。
操作步驟:如何實現兩種合併方式?¶
準備工作:創建倉庫和基礎分支¶
先初始化一個Git倉庫,並創建基礎master分支:
# 初始化倉庫(如果沒有)
mkdir my_project && cd my_project
git init
# 創建初始文件並提交到master
echo "Initial code" > README.md
git add README.md
git commit -m "Initial commit"
場景1:Fast-forward合併(分支未分叉)¶
這是最簡單的合併方式,適合“獨立開發後合併”的場景。
步驟1:創建並開發功能分支¶
# 創建並切換到feature/login分支
git checkout -b feature/login
# 修改代碼(比如添加登錄功能)
echo "Login page" >> README.md
git add README.md
git commit -m "Add login page"
此時,master分支仍爲初始提交,feature/login有1個新提交。
步驟2:合併到master(Fast-forward)¶
# 切換回master分支
git checkout master
# 合併feature/login到master(此時master未分叉,觸發Fast-forward)
git merge feature/login
此時執行git log,會發現master的提交直接包含了feature/login的內容,沒有新的合併提交(Fast-forward生效)。
場景2:普通合併(分支已分叉)¶
這是多人協作中更常見的場景,適合“並行開發後合併”的情況。
步驟1:在master分支新增提交(模擬他人修改)¶
# 回到master分支,修改文件
git checkout master
echo "Fix bug in homepage" >> README.md
git add README.md
git commit -m "Fix homepage bug"
此時,master有2個提交:初始提交→Fix bug提交。
步驟2:在feature分支繼續開發¶
# 切換回feature/login分支,繼續修改
git checkout feature/login
echo "Add user profile" >> README.md
git add README.md
git commit -m "Add user profile"
此時,feature/login有2個提交:Add login→Add profile;master有2個提交:Initial→Fix bug,兩者已分叉。
步驟3:合併到master(普通合併)¶
# 回到master分支,合併feature/login
git checkout master
git merge feature/login
此時Git會自動創建一個新的合併提交(顯示爲Merge branch 'feature/login'),解決分叉問題。如果修改的內容無衝突,合併完成;若有衝突,需要手動解決後再提交。
總結¶
| 合併類型 | 發生條件 | 合併結果 | 命令特點 |
|---|---|---|---|
| Fast-forward | 主分支無新提交,分支線性延伸 | 主分支指針直接快進,無新提交 | git merge 自動執行快進 |
| 普通合併 | 主分支有新提交,分支出現分叉 | 生成新的合併提交,歷史有分叉記錄 | git merge 需解決衝突或手動確認 |
關鍵點:¶
- Fast-forward是“理想狀態”,適合獨立開發後合併,操作簡單。
- 普通合併是“現實狀態”,處理並行開發,需注意衝突解決。
- 兩種方式都用
git merge [分支名]命令,Git會根據分支歷史自動選擇合併類型。
通過這兩種合併方式,你可以靈活整合不同分支的代碼,讓項目有序推進~