3.2 分支的新建與合并

2018-02-24 15:22 更新

分支的新建與合并

讓我們來(lái)看一個(gè)簡(jiǎn)單的分支新建與分支合并的例子,實(shí)際工作中你可能會(huì)用到類似的工作流。你將經(jīng)歷如下步驟:

  1. 開(kāi)發(fā)某個(gè)網(wǎng)站。

  2. 為實(shí)現(xiàn)某個(gè)新的需求,創(chuàng)建一個(gè)分支。

  3. 在這個(gè)分支上開(kāi)展工作。

正在此時(shí),你突然接到一個(gè)電話說(shuō)有個(gè)很嚴(yán)重的問(wèn)題需要緊急修補(bǔ)。你將按照如下方式來(lái)處理:

  1. 切換到你的線上分支(production branch)。

  2. 為這個(gè)緊急任務(wù)新建一個(gè)分支,并在其中修復(fù)它。

  3. 在測(cè)試通過(guò)之后,切換回線上分支,然后合并這個(gè)修補(bǔ)分支,最后將改動(dòng)推送到線上分支。

  4. 切換回你最初工作的分支上,繼續(xù)工作。

新建分支

首先,我們假設(shè)你正在你的項(xiàng)目上工作,并且已經(jīng)有一些提交。

master 分支所指向的提交是你當(dāng)前提交(有關(guān) hotfix 的提交)的直接上游,所以 Git 只是簡(jiǎn)單的將指針向前移動(dòng)。換句話說(shuō),當(dāng)你試圖合并兩個(gè)分支時(shí),如果順著一個(gè)分支走下去能夠到達(dá)另一個(gè)分支,那么 Git 在合并兩者的時(shí)候,只會(huì)簡(jiǎn)單的將指針向前推進(jìn)(指針右移),因?yàn)檫@種情況下的合并操作沒(méi)有需要解決的分歧——這就叫做 “快進(jìn)(fast-forward)”。

現(xiàn)在,最新的修改已經(jīng)在 master 分支所指向的提交快照中,你可以著手發(fā)布該修復(fù)了。

任何因包含合并沖突而有待解決的文件,都會(huì)以未合并狀態(tài)標(biāo)識(shí)出來(lái)。Git 會(huì)在有沖突的文件中加入標(biāo)準(zhǔn)的沖突解決標(biāo)記,這樣你可以打開(kāi)這些包含沖突的文件然后手動(dòng)解決沖突。出現(xiàn)沖突的文件會(huì)包含一些特殊區(qū)段,看起來(lái)像下面這個(gè)樣子:

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

這表示 HEAD 所指示的版本(也就是你的 master 分支所在的位置,因?yàn)槟阍谶\(yùn)行 merge 命令的時(shí)候已經(jīng)檢出到了這個(gè)分支)在這個(gè)區(qū)段的上半部分(======= 的上半部分),而 iss53 分支所指示的版本在 ======= 的下半部分。為了解決沖突,你必須選擇使用由 ======= 分割的兩部分中的一個(gè),或者你也可以自行合并這些內(nèi)容。例如,你可以通過(guò)把這段內(nèi)容換成下面的樣子來(lái)解決沖突:

<div id="footer">
please contact us at email.support@github.com
</div>

上述的沖突解決方案僅保留了其中一個(gè)分支的修改,并且 <<<<<<< , ======= , 和 >>>>>>> 這些行被完全刪除了。在你解決了所有文件里的沖突之后,對(duì)每個(gè)文件使用 git add 命令來(lái)將其標(biāo)記為沖突已解決。一旦暫存這些原本有沖突的文件,Git 就會(huì)將它們標(biāo)記為沖突已解決。

如果你想使用圖形化工具來(lái)解決沖突,你可以運(yùn)行 git mergetool,該命令會(huì)為你啟動(dòng)一個(gè)合適的可視化合并工具,并帶領(lǐng)你一步一步解決這些沖突:

$ git mergetool

This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html

Normal merge conflict for 'index.html':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (opendiff):

如果你想使用除默認(rèn)工具(在這里 Git 使用 opendiff 做為默認(rèn)的合并工具,因?yàn)樽髡咴?Mac 上運(yùn)行該程序)外的其他合并工具,你可以在 “下列工具中(one of the following tools)” 這句后面看到所有支持的合并工具。然后輸入你喜歡的工具名字就可以了。

如果你需要更加高級(jí)的工具來(lái)解決復(fù)雜的合并沖突,我們會(huì)在 “高級(jí)合并” 介紹更多關(guān)于分支合并的內(nèi)容。

等你退出合并工具之后,Git 會(huì)詢問(wèn)剛才的合并是否成功。如果你回答是,Git 會(huì)暫存那些文件以表明沖突已解決:你可以再次運(yùn)行 git status 來(lái)確認(rèn)所有的合并沖突都已被解決:

$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   index.html

如果你對(duì)結(jié)果感到滿意,并且確定之前有沖突的的文件都已經(jīng)暫存了,這時(shí)你可以輸入 git commit 來(lái)完成合并提交。默認(rèn)情況下提交信息看起來(lái)像下面這個(gè)樣子:

Merge branch 'iss53'

Conflicts:
    index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
#   .git/MERGE_HEAD
# and try again.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
#   modified:   index.html
#

如果你覺(jué)得上述的信息不夠充分,不能完全體現(xiàn)分支合并的過(guò)程,你可以修改上述信息,添加一些細(xì)節(jié)給未來(lái)檢視這個(gè)合并的讀者一些幫助,告訴他們你是如何解決合并沖突的,以及理由是什么。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)