爲什麼需要合併分支?

想象你和同事一起開發一個項目,你負責“用戶登錄功能”,同事負責“購物車功能”。爲了避免互相干擾,你們可以在Git中創建不同的分支來獨立開發,完成後再把各自的工作合併到主項目(通常是master分支)中。合併分支就像是把兩個人的“成果”整合到一起,讓整個項目繼續推進。

Fast-forward合併:最簡單的“快進式”合併

什麼是Fast-forward?

當你從主分支(比如master)創建一個新分支(如feature/login),並在新分支上完成修改後,主分支在此期間沒有任何新提交。此時合併新分支到主分支時,Git會直接把主分支的指針“快進”到新分支的最新提交,就像時間線直接延伸,不會產生新的合併記錄。

舉個例子:
1. 初始狀態:master分支只有1個提交(假設是基礎代碼)。
2. 創建並切換到feature/login分支,修改代碼並提交(此時master分支未變)。
3. 切換回master分支,執行git merge feature/login,Git發現masterfeature/login的歷史是“線性”的(masterfeature/login之前沒有分叉),於是直接將master的指針移到feature/login的最新提交。

Fast-forward的特點:

  • 沒有新提交:合併後主分支歷史中,feature/login的提交會被直接“接上”,不會出現額外的“合併提交”。
  • 操作簡單:無需解決衝突(因爲分支未分叉),直接快進完成合並。

普通合併:帶新提交的“分叉式”合併

什麼是普通合併?

如果在feature/login開發的同時,有人在master分支上也提交了新代碼(比如修復了一個bug),此時masterfeature/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會根據分支歷史自動選擇合併類型。

通過這兩種合併方式,你可以靈活整合不同分支的代碼,讓項目有序推進~

小夜