Git 入門 (四):取得遠端新檔案並合併 (fetch + merge = pull)、衝突 (conflict)
這一篇提到,多人協作時,在自己開始更新本地端分支前,最好先取得遠端分支的更新版本,即可能避免更新到同一行檔案之衝突的發生。若是自己更新完了本地端該分支的現有版本,正要推上遠端分支時,發現檔案衝突,該如何解決?
取得遠端新檔案並合併 (fetch + merge = pull) (fetch)
一開始本地端長這樣:
輸入 git fetch
後,git 比對遠端和本地,發現遠端有新檔案後,將遠端新檔案取回本地,如下圖:
為了讓 master
分支跟上新檔案,在 HEAD 指向 master
時,輸入 git merge or/master
,又因為 master
和 or/master
同源,所以會使用快轉模式合併。
取回遠端檔案指令
- 取得遠端新檔案 (不合併):
git fetch
- 取得遠端新檔案並合併:
git pull = git fetch + git merge origin/master
Pull 下載更新
GitHub 的 Pull Request
是與其它開發者的互動方式,發一個請原作將「我修改過的 commit」拉回去 (Pull) 的請求 (Request),稱之 Pull Request,簡稱 PR。
當我們對 GitHub 上的開源專案很有興趣,想幫忙、貢獻一己之力的時候,可以依照如下步驟:
Fork
一份原本的專案到自己的 GitHub 帳號底下。- 修改完後,在自己的專案頁面發個通知給原作者,也就是
Pull Request
,讓原作者檢查一下。 - 原作者檢查完覺得 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。
解決衝突的檔案:
步驟
- 在 master 下
git merge dev
- 手動解決衝突
git add .
orgit add <filename>
git commit -m "msg"
orgit commit
本地與遠端之間的 conflict
當我在 master 下了 git push
時:
- 如果遠端沒有新的 (本地端沒有的) commit 紀錄,則
push
成功。 - 如果遠端有新的 commit 紀錄,則輸入
git pull
:-
雖然有新的檔案,但是沒有衝突,就會自動合併且產生一個 commit 紀錄在本地端,再
push
到遠端。
合併和
push
成功的文字:
-
有衝突,會在工作區自動產生一個讓開發者解決衝突的檔案,如下圖:
-
步驟
- 下了
git push
,卻發現遠端有新的 commit 紀錄 - 在 master 下
git pull = git fetch + git merge origin/master
- 手動解決衝突
git add .
orgit add <filename>
git commit -m "msg"
orgit commit
git push
參考資料:
六角學院 -「Git 分支中階教學」線上講義
Git 入門 系列文
Git 入門 (一):介紹和基本指令
Git 入門 (二):遠端操作 (使用 GitHub 的伺服器)、檔案狀態與還原
Git 入門 (三):分支 (branch)、下載遠端儲存庫 (clone)
Git 入門 (四):取得遠端新檔案並合併 (fetch + merge = pull)、衝突 (conflict) ← 你在這~