Skip to main content

Merge

Git merge 基本流程

在一般的開發流程,建立新分支來開發新功能或修復 bug,在分支完成開發後,最後會將分支的內容合併到主分支 (main/master)。

  • git merge <branch-name> : 合併分支 <branch-name> 至目前分支
  • git merge --abort : 放棄目前的合併

分支 fix_something 合併指令

git checkout main
git merge fix_something

合併後如果系統顯示 Merge conflict,必須依照訊息找出檔案(some.py)裡衝突的內容,進行手動修正。

some.py 衝突內容範例:

  • <<<< HEAD : 目前分支 (main) 的內容
  • >>>> fix_something: 要合併的分支 (fix_something) 內容
<<<<<<< HEAD         
print("Keep me!")
=======
print("No, keep me instead!")
>>>>>>> fix_something

完成後,依序再執行:

git add some.py
git status
# Check if the conflict has been fixed
git commit

檢視合併的紀錄

git log --graph --oneline

如果合併檔案的衝突內容太複雜,且無法有效地修正,可以使用以下指令,放棄這次分支的合併,並且讓專案回到合併前的內容。

git merge --abort
多人協作流程案例

人員A push 更新至遠端庫時發生錯誤: 

 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/redquinoa/health-checks.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

原因是另一個協作人員B 對同一個遠端分支 (branch)的同個檔案,有上傳 (push) 過其他較新的異動 (commit)。

人員A 處理流程如下:

  1. 更新遠端分支至本地,並且與本地分支做合併: git pull
  2. 上述的自動合併,如果發生 Automatic merge failed,繼續下面步驟,手動排除衝突的內容。
  3. 檢視遠端分支最近做過哪些更動: 
    • git log --graph --onleline --all
    • git log -p origin/master 
  4. 手動修改衝突的檔案內容
    • 檢視檔案包含 <<<< HEAD>>>>>> something 之間 標記的內容
  5. 完成後執行檢查與再上傳
    1. git add 
    2. git status 
    3. git commit 
    4. git push