W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
讓我們來(lái)看一個(gè)簡(jiǎn)單的分支新建與分支合并的例子,實(shí)際工作中你可能會(huì)用到類似的工作流。你將經(jīng)歷如下步驟:
開(kāi)發(fā)某個(gè)網(wǎng)站。
為實(shí)現(xiàn)某個(gè)新的需求,創(chuàng)建一個(gè)分支。
正在此時(shí),你突然接到一個(gè)電話說(shuō)有個(gè)很嚴(yán)重的問(wèn)題需要緊急修補(bǔ)。你將按照如下方式來(lái)處理:
切換到你的線上分支(production branch)。
為這個(gè)緊急任務(wù)新建一個(gè)分支,并在其中修復(fù)它。
在測(cè)試通過(guò)之后,切換回線上分支,然后合并這個(gè)修補(bǔ)分支,最后將改動(dòng)推送到線上分支。
首先,我們假設(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è)合并的讀者一些幫助,告訴他們你是如何解決合并沖突的,以及理由是什么。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: