Git 入門 (四):取得遠端新檔案並合併 (fetch + merge = pull)、衝突 (conflict)

這一篇提到,多人協作時,在自己開始更新本地端分支前,最好先取得遠端分支的更新版本,即可能避免更新到同一行檔案之衝突的發生。若是自己更新完了本地端該分支的現有版本,正要推上遠端分支時,發現檔案衝突,該如何解決?

取得遠端新檔案並合併 (fetch + merge = pull) (fetch)

一開始本地端長這樣:

輸入 git fetch 後,git 比對遠端和本地,發現遠端有新檔案後,將遠端新檔案取回本地,如下圖:

為了讓 master 分支跟上新檔案,在 HEAD 指向 master 時,輸入 git merge or/master,又因為 masteror/master 同源,所以會使用快轉模式合併。

取回遠端檔案指令

  • 取得遠端新檔案 (不合併):git fetch
  • 取得遠端新檔案並合併:git pull = git fetch + git merge origin/master

Pull 下載更新

GitHub 的 Pull Request

是與其它開發者的互動方式,發一個請原作將「我修改過的 commit」拉回去 (Pull) 的請求 (Request),稱之 Pull Request,簡稱 PR。

當我們對 GitHub 上的開源專案很有興趣,想幫忙、貢獻一己之力的時候,可以依照如下步驟:

  1. Fork 一份原本的專案到自己的 GitHub 帳號底下。
  2. 修改完後,在自己的專案頁面發個通知給原作者,也就是 Pull Request,讓原作者檢查一下。
  3. 原作者檢查完覺得 ok,然後就把我們做的這些修改 merge 到他的專案裡。

與其它開發者的互動 - 使用 Pull Request(PR)

檔案衝突

兩個 commit 在合併時,檔案裡的同一行有重複修改到,就會發生衝突。可能發生在本地與本地之間、本地與遠端之間。

本地與本地之間的 conflict

當我在 master 下了 git merge dev 時:

  • 如果沒有衝突,會自動合併且產生一個 commit 紀錄。
  • 如果有衝突,會在工作區自動產生一個讓開發者解決衝突的檔案,並出現如下文字:

Auto-merging index10.html
CONFLICT (content): Merge conflict in index10.html
Automatic merge failed; fix conflicts and then commit the result.

git status 顯示有 Unmerged paths,如下圖。如果將衝突解決完,再將檔案加入索引區並且 commit

解決衝突的檔案:

步驟

  1. 在 master 下 git merge dev
  2. 手動解決衝突
  3. git add . or git add <filename>
  4. git commit -m "msg" or git commit

本地與遠端之間的 conflict

當我在 master 下了 git push 時:

  • 如果遠端沒有新的 (本地端沒有的) commit 紀錄,則 push 成功。
  • 如果遠端有新的 commit 紀錄,則輸入 git pull
    • 雖然有新的檔案,但是沒有衝突,就會自動合併且產生一個 commit 紀錄在本地端,再 push 到遠端。

      合併和 push 成功的文字:

    • 有衝突,會在工作區自動產生一個讓開發者解決衝突的檔案,如下圖:

步驟

  1. 下了git push,卻發現遠端有新的 commit 紀錄
  2. 在 master 下 git pull = git fetch + git merge origin/master
  3. 手動解決衝突
  4. git add . or git add <filename>
  5. git commit -m "msg" or git commit
  6. git push

參考資料:
六角學院 -「Git 分支中階教學」線上講義

Git 入門 系列文

Git 入門 (一):介紹和基本指令
Git 入門 (二):遠端操作 (使用 GitHub 的伺服器)、檔案狀態與還原
Git 入門 (三):分支 (branch)、下載遠端儲存庫 (clone)
Git 入門 (四):取得遠端新檔案並合併 (fetch + merge = pull)、衝突 (conflict) ← 你在這~