Git(標籤、分支和合並)2
合併分支
git merge
命令用來在 git 中合併分支:
$ git merge <other-branch>
發生合併時,git 將:
- 檢視將合併的分支
- 檢視分支的歷史記錄並尋找兩個分支的 commit 歷史記錄中都有的單個 commit
- 將單個分支上更改的程式碼行合併到一起
- 提交一個 commit 來記錄合併操作
合併有以下兩種型別:
快進合併
–要合併的分支必須位於檢出分支前面
。檢出分支的指標將向前移動,指向另一分支所指向的同一 commit
。普通型別的合併
– 兩個完全不同的分支被合併,建立一個合併 commit
。
主題分支
(例如 sidebar)的作用是讓你做出不影響 master 分支的更改
。當你在主題分支上做出更改後,如果覺得不想要該分支上的更改,則可以刪掉該分支,或者你決定要保留更改,則可以將該分支上的更改與其他分支上的更改合併。
git 可以自動將不同分支上的更改合併到一起。這種分支和合並功能正是 git 的強大之處!你可以在分支上做出小的或大的更改,然後使用 git 合併這些更改。
理論原理
如上圖所示,假設我們要將 master
和 sidebar
分支合併(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
注意一個檔案可能在多個部分存在合併衝突,因此檢查整個檔案中的合併衝突指示符,搜尋 <<<
能夠幫助你找到所有這些指示符。
相關文章
- Git的分支管理與打標籤Git
- Git tag標籤與branch分支 區別Git
- Git tag標籤與branch分支的區別Git
- Git 標籤Git
- Git——分支管理(2)Git
- Git tag 標籤Git
- Git (10)-- 打標籤(git tag)Git
- Git 與標籤管理Git
- Git-tag標籤Git
- git學習——打標籤Git
- Git刪除tag標籤Git
- Git(12)-- Git 分支 - 分支簡介Git
- git本地分支對映遠端分支並推送相應程式碼Git
- Git 系列教程(9)- 打標籤Git
- Git檢視所有tag標籤Git
- Git tag標籤用法詳解Git
- 【第九篇】- Git 標籤Git
- Git study Day02 標籤Git
- HTML標籤(2)HTML
- git分支Git
- Git 分支Git
- Git 分支 - 分支的衍合Git
- Git 分支操作Git
- Git 分支管理Git
- Git 使用分支Git
- Git管理分支Git
- Git分支(本地)Git
- git分支操作Git
- git切換遠端分支並拉取最新程式碼Git
- 【記錄】Git 是如何打標籤的Git
- [記錄] Git 是如何打標籤的Git
- Git檢視tag標籤建立時間Git
- Git打標籤與版本控制規範Git
- Git 推送和刪除遠端標籤Git
- 【git學習四】git基礎之git為專案打標籤Git
- git更新原生代碼分支並將其合併到master分支的完整流程GitAST
- struts2 標籤庫
- Git——如何從master檢出分支dev並推送到遠端?GitASTdev