Git(標籤、分支和合並)2

moduzhang發表於2018-08-28

合併分支

git merge 命令用來在 git 中合併分支:

$ git merge <other-branch>

發生合併時,git 將:

  • 檢視將合併的分支
  • 檢視分支的歷史記錄並尋找兩個分支的 commit 歷史記錄中都有的單個 commit
  • 將單個分支上更改的程式碼行合併到一起
  • 提交一個 commit 來記錄合併操作

合併有以下兩種型別:

  • 快進合併要合併的分支必須位於檢出分支前面。檢出分支的指標將向前移動,指向另一分支所指向的同一 commit
  • 普通型別的合併 – 兩個完全不同的分支被合併,建立一個合併 commit

主題分支(例如 sidebar)的作用是讓你做出不影響 master 分支的更改。當你在主題分支上做出更改後,如果覺得不想要該分支上的更改,則可以刪掉該分支,或者你決定要保留更改,則可以將該分支上的更改與其他分支上的更改合併。

git 可以自動將不同分支上的更改合併到一起。這種分支和合並功能正是 git 的強大之處!你可以在分支上做出小的或大的更改,然後使用 git 合併這些更改。

理論原理

這裡寫圖片描述

如上圖所示,假設我們要將 mastersidebar 分支合併(merge)起來。當合併發生時,它會進行提交。由於 HEAD 指向 master 分支,合併提交將被放置在 master 分支上,它將向前移動。

這裡寫圖片描述

我們將 sidebar 合併到 master,這不會影響 sidebar 分支。我們可以重新切換到 sidebar 分支,仍然對其進行提交。

這裡寫圖片描述

假設我們有一個 social-links 分支,比 master 分支靠前一點。master 分支中尚不包含 social-links 提交,如果要將這些提交納入到 master 分支,就需要將 social-links 分支併入 master 分支。

這裡寫圖片描述

由於 HEAD 指向 master 分支,進行合併後 master 分支將會移動,而且由 social-links 分支比 master 靠前,GIT 會做一個所謂的 “快速合併”

這裡寫圖片描述

注意,當你要合併分支時,務必知道當前位於哪個分支上。合併分支會提交 commit

快進合併

這裡寫圖片描述

因為 footer 直接在 master 前面,因此這種合併最簡單。將 footer 合併到 master 中將導致快進合併(Fast-forward merge)。快進合併將使當前檢出的分支向前移動,直到它指向與另一個分支(這裡是 footer)指向的 commit 一樣為止。

進行普通合併

這裡寫圖片描述

因為合併的是兩個完全不一樣的分支,因此將提交 commit。在進行 commit 時,需要提供 commit 訊息。因為這是合併 commit,因此已經提供了預設訊息。你也可以更改訊息,但通常都會直接使用預設的合併 commit 訊息。因此當你的程式碼編輯器開啟幷包含該訊息時,直接關閉編輯器以確認使用該 commit 訊息。

分支合併

合併衝突

這裡寫圖片描述

大部分情況下,git 將能夠成功地合併分支。但是,有時候 git 無法完全自動地進行合併。合併失敗時,就稱為合併衝突。如果出現合併衝突,git 將嘗試儘可能合併多的內容,然後將留下特殊選項(例如 >>><<<),告訴你需要從何處手動修復。

這裡寫圖片描述

合併衝突指示符解釋

編輯器具有以下合併衝突指示符:

  • <<<<<<< HEAD 此行下方的所有內容(直到下個指示符)顯示了當前分支上的行
  • ||||||| merged common ancestors 此行下方的所有內容(直到下個指示符)顯示了原始行的內容
  • ======= 表示原始行內容的結束位置,之後的所有行(直到下個指示符)是被合併的當前分支上的行的內容
  • >>>>>>> heading-update 是要被合併的分支(此例中是 heading-update 分支)上的行結束指示符

解決合併衝突

git 使用合併衝突指示符來告訴你兩個不同分支上的哪些行導致了合併衝突,以及原始行是什麼。要解決合併衝突,你需要:

  • 選擇保留哪些行
  • 刪掉所有帶指示符的行

刪掉所有包含合併衝突指示符的行並選擇保留哪個標題後,直接儲存檔案,並將其新增到暫存區,然後 commit!就像普通合併一樣,程式碼編輯器會彈出,並讓你提供 commit 訊息。和之前一樣,我們經常會使用自動生成的合併 commit 訊息,因此在編輯器開啟後,直接關閉編輯器並使用自動生成的 commit 訊息。

當相同的行在要合併的不同分支上做出了更改時,就會出現合併衝突。git 將在合併途中暫停,並告訴你存在衝突,以及哪些檔案存在衝突。要解決檔案中的衝突:

  • 找到並刪掉存在合併衝突指示符的所有行
  • 決定保留哪些行
  • 儲存檔案
  • 暫存檔案
  • 提交 commit

這裡寫圖片描述

注意一個檔案可能在多個部分存在合併衝突,因此檢查整個檔案中的合併衝突指示符,搜尋 <<< 能夠幫助你找到所有這些指示符。

衝突如何被顯示