久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

Git分支之分支的新建與合并解析

Git 分支 – 分支的新建與合并

分支的新建與合并

現(xiàn)在讓我們來(lái)看一個(gè)簡(jiǎn)單的分支與合并的例子,實(shí)際工作中大體也會(huì)用到這樣的工作流程:

開發(fā)某個(gè)網(wǎng)站。 為實(shí)現(xiàn)某個(gè)新的需求,創(chuàng)建一個(gè)分支。 在這個(gè)分支上開展工作。

假設(shè)此時(shí),你突然接到一個(gè)電話說(shuō)有個(gè)很嚴(yán)重的問(wèn)題需要緊急修補(bǔ),那么可以按照下面的方式處理:

返回到原先已經(jīng)發(fā)布到生產(chǎn)服務(wù)器上的分支。 為這次緊急修補(bǔ)建立一個(gè)新分支,并在其中修復(fù)問(wèn)題。 通過(guò)測(cè)試后,回到生產(chǎn)服務(wù)器所在的分支,將修補(bǔ)分支合并進(jìn)來(lái),然后再推送到生產(chǎn)服務(wù)器上。 切換到之前實(shí)現(xiàn)新需求的分支,繼續(xù)工作。

分支的新建與切換

首先,我們假設(shè)你正在項(xiàng)目中愉快地工作,并且已經(jīng)提交了幾次更新(見圖 3-10)。

Git分支之分支的新建與合并解析

圖 3-10. 一個(gè)簡(jiǎn)短的提交歷史

現(xiàn)在,你決定要修補(bǔ)問(wèn)題追蹤系統(tǒng)上的 #53 問(wèn)題。順帶說(shuō)明下,Git 并不同任何特定的問(wèn)題追蹤系統(tǒng)打交道。這里為了說(shuō)明要解決的問(wèn)題,才把新建的分支取名為 iss53。要新建并切換到該分支,運(yùn)行 git checkout 并加上 -b 參數(shù):

  $ git checkout -b iss53  Switched to a new branch 'iss53'  

這相當(dāng)于執(zhí)行下面這兩條命令:

  $ git branch iss53  $ git checkout iss53  

圖 3-11 示意該命令的執(zhí)行結(jié)果。

Git分支之分支的新建與合并解析

圖 3-11. 創(chuàng)建了一個(gè)新分支的指針

接著你開始嘗試修復(fù)問(wèn)題,在提交了若干次更新后,iss53 分支的指針也會(huì)隨著向前推進(jìn),因?yàn)樗褪钱?dāng)前分支(換句話說(shuō),當(dāng)前的 HEAD 指針正指向 iss53,見圖 3-12):

  $ vim index.html  $ git commit -a -m 'added a new footer [issue 53]'  

Git分支之分支的新建與合并解析

圖 3-12. iss53 分支隨工作進(jìn)展向前推進(jìn)

現(xiàn)在你就接到了那個(gè)網(wǎng)站問(wèn)題的緊急電話,需要馬上修補(bǔ)。有了 Git ,我們就不需要同時(shí)發(fā)布這個(gè)補(bǔ)丁和 iss53 里作出的修改,也不需要在創(chuàng)建和發(fā)布該補(bǔ)丁到服務(wù)器之前花費(fèi)大力氣來(lái)復(fù)原這些修改。唯一需要的僅僅是切換回 master 分支。

不過(guò)在此之前,留心你的暫存區(qū)或者工作目錄里,那些還沒(méi)有提交的修改,它會(huì)和你即將檢出的分支產(chǎn)生沖突從而阻止 Git 為你切換分支。切換分支的時(shí)候最好保持一個(gè)清潔的工作區(qū)域。稍后會(huì)介紹幾個(gè)繞過(guò)這種問(wèn)題的辦法(分別叫做 stashing 和 commit amending)。目前已經(jīng)提交了所有的修改,所以接下來(lái)可以正常轉(zhuǎn)換到 master 分支:

  $ git checkout master  Switched to branch 'master'  

此時(shí)工作目錄中的內(nèi)容和你在解決問(wèn)題 #53 之前一模一樣,你可以集中精力進(jìn)行緊急修補(bǔ)。這一點(diǎn)值得牢記:Git 會(huì)把工作目錄的內(nèi)容恢復(fù)為檢出某分支時(shí)它所指向的那個(gè)提交對(duì)象的快照。它會(huì)自動(dòng)添加、刪除和修改文件以確保目錄的內(nèi)容和你當(dāng)時(shí)提交時(shí)完全一樣。

接下來(lái),你得進(jìn)行緊急修補(bǔ)。我們創(chuàng)建一個(gè)緊急修補(bǔ)分支 hotfix 來(lái)開展工作,直到搞定(見圖 3-13):

  $ git checkout -b hotfix  Switched to a new branch 'hotfix'  $ vim index.html  $ git commit -a -m 'fixed the broken email address'  [hotfix 3a0874c] fixed the broken email address   1 files changed, 1 deletion(-)  

Git分支之分支的新建與合并解析

圖 3-13. hotfix 分支是從 master 分支所在點(diǎn)分化出來(lái)的

有必要作些測(cè)試,確保修補(bǔ)是成功的,然后回到 master 分支并把它合并進(jìn)來(lái),然后發(fā)布到生產(chǎn)服務(wù)器。用 git merge 命令來(lái)進(jìn)行合并:

  $ git checkout master  $ git merge hotfix  Updating f42c576..3a0874c  Fast-forward   README | 1 -   1 file changed, 1 deletion(-)  

請(qǐng)注意,合并時(shí)出現(xiàn)了“Fast forward”的提示。由于當(dāng)前 master 分支所在的提交對(duì)象是要并入的 hotfix 分支的直接上游,Git 只需把 master 分支指針直接右移。換句話說(shuō),如果順著一個(gè)分支走下去可以到達(dá)另一個(gè)分支的話,那么 Git 在合并兩者時(shí),只會(huì)簡(jiǎn)單地把指針右移,因?yàn)檫@種單線的歷史分支不存在任何需要解決的分歧,所以這種合并過(guò)程可以稱為快進(jìn)(Fast forward)。

現(xiàn)在最新的修改已經(jīng)在當(dāng)前 master 分支所指向的提交對(duì)象中了,可以部署到生產(chǎn)服務(wù)器上去了(見圖 3-14)。

Git分支之分支的新建與合并解析

圖 3-14. 合并之后,master 分支和 hotfix 分支指向同一位置。

在那個(gè)超級(jí)重要的修補(bǔ)發(fā)布以后,你想要回到被打擾之前的工作。由于當(dāng)前 hotfix 分支和 master 都指向相同的提交對(duì)象,所以 hotfix 已經(jīng)完成了歷史使命,可以刪掉了。使用 git branch 的 -d 選項(xiàng)執(zhí)行刪除操作:

  $ git branch -d hotfix  Deleted branch hotfix (was 3a0874c).  

現(xiàn)在回到之前未完成的 #53 問(wèn)題修復(fù)分支上繼續(xù)工作(圖 3-15):

  $ git checkout iss53  Switched to branch 'iss53'  $ vim index.html  $ git commit -a -m 'finished the new footer [issue 53]'  [iss53 ad82d7a] finished the new footer [issue 53]   1 file changed, 1 insertion(+)  

Git分支之分支的新建與合并解析

圖 3-15. iss53 分支可以不受影響繼續(xù)推進(jìn)。

值得注意的是之前 hotfix 分支的修改內(nèi)容尚未包含到 iss53 中來(lái)。如果需要納入此次修補(bǔ),可以用 git merge master 把 master 分支合并到 iss53;或者等 iss53 完成之后,再將 iss53 分支中的更新并入 master。

分支的合并

在問(wèn)題 #53 相關(guān)的工作完成之后,可以合并回 master 分支。實(shí)際操作同前面合并 hotfix 分支差不多,只需回到 master 分支,運(yùn)行 git merge 命令指定要合并進(jìn)來(lái)的分支:

  $ git checkout master  $ git merge iss53  Auto-merging README  Merge made by the 'recursive' strategy.   README | 1 +   1 file changed, 1 insertion(+)  

請(qǐng)注意,這次合并操作的底層實(shí)現(xiàn),并不同于之前 hotfix 的并入方式。因?yàn)檫@次你的開發(fā)歷史是從更早的地方開始分叉的。由于當(dāng)前 master 分支所指向的提交對(duì)象(C4)并不是 iss53 分支的直接祖先,Git 不得不進(jìn)行一些額外處理。就此例而言,Git 會(huì)用兩個(gè)分支的末端(C4 和 C5)以及它們的共同祖先(C2)進(jìn)行一次簡(jiǎn)單的三方合并計(jì)算。圖 3-16 用紅框標(biāo)出了 Git 用于合并的三個(gè)提交對(duì)象:

Git分支之分支的新建與合并解析

圖 3-16. Git 為分支合并自動(dòng)識(shí)別出最佳的同源合并點(diǎn)。

這次,Git 沒(méi)有簡(jiǎn)單地把分支指針右移,而是對(duì)三方合并后的結(jié)果重新做一個(gè)新的快照,并自動(dòng)創(chuàng)建一個(gè)指向它的提交對(duì)象(C6)(見圖 3-17)。這個(gè)提交對(duì)象比較特殊,它有兩個(gè)祖先(C4 和 C5)。

值得一提的是 Git 可以自己裁決哪個(gè)共同祖先才是最佳合并基礎(chǔ);這和 CVS 或 Subversion(1.5 以后的版本)不同,它們需要開發(fā)者手工指定合并基礎(chǔ)。所以此特性讓 Git 的合并操作比其他系統(tǒng)都要簡(jiǎn)單不少。

Git分支之分支的新建與合并解析

圖 3-17. Git 自動(dòng)創(chuàng)建了一個(gè)包含了合并結(jié)果的提交對(duì)象。

既然之前的工作成果已經(jīng)合并到 master 了,那么 iss53 也就沒(méi)用了。你可以就此刪除它,并在問(wèn)題追蹤系統(tǒng)里關(guān)閉該問(wèn)題。

  $ git branch -d iss53  

遇到?jīng)_突時(shí)的分支合并

有時(shí)候合并操作并不會(huì)如此順利。如果在不同的分支中都修改了同一個(gè)文件的同一部分,Git 就無(wú)法干凈地把兩者合到一起(譯注:邏輯上說(shuō),這種問(wèn)題只能由人來(lái)裁決。)。如果你在解決問(wèn)題 #53 的過(guò)程中修改了 hotfix 中修改的部分,將得到類似下面的結(jié)果:

  $ git merge iss53  Auto-merging index.html  CONFLICT (content): Merge conflict in index.html  Automatic merge failed; fix conflicts and then commit the result.  

Git 作了合并,但沒(méi)有提交,它會(huì)停下來(lái)等你解決沖突。要看看哪些文件在合并時(shí)發(fā)生沖突,可以用 git status 查閱:

  $ git status  On branch master  You have unmerged paths.    (fix conflicts and run "git commit")    Unmerged paths:    (use "git add ..." to mark resolution)            both modified:      index.html    no changes added to commit (use "git add" and/or "git commit -a")  

任何包含未解決沖突的文件都會(huì)以未合并(unmerged)的狀態(tài)列出。Git 會(huì)在有沖突的文件里加入標(biāo)準(zhǔn)的沖突解決標(biāo)記,可以通過(guò)它們來(lái)手工定位并解決這些沖突。可以看到此文件包含類似下面這樣的部分:

  <<<<<<< HEAD  

contact : email.support@github.com

=======

please contact us at support@github.com

>>>>>>> iss53

可以看到 ======= 隔開的上半部分,是 HEAD(即 master 分支,在運(yùn)行 merge 命令時(shí)所切換到的分支)中的內(nèi)容,下半部分是在 iss53 分支中的內(nèi)容。解決沖突的辦法無(wú)非是二者選其一或者由你親自整合到一起。比如你可以通過(guò)把這段內(nèi)容替換為下面這樣來(lái)解決:

  

please contact us at email.support@github.com

這個(gè)解決方案各采納了兩個(gè)分支中的一部分內(nèi)容,而且我還刪除了 <<<<<<<,======= 和 >>>>>>> 這些行。在解決了所有文件里的所有沖突后,運(yùn)行 git add 將把它們標(biāo)記為已解決狀態(tài)(譯注:實(shí)際上就是來(lái)一次快照保存到暫存區(qū)域。)。因?yàn)橐坏捍妫捅硎緵_突已經(jīng)解決。如果你想用一個(gè)有圖形界面的工具來(lái)解決這些問(wèn)題,不妨運(yùn)行 git mergetool,它會(huì)調(diào)用一個(gè)可視化的合并工具并引導(dǎo)你解決所有沖突:

  $ 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 為我默認(rèn)選擇了 opendiff,因?yàn)槲以?Mac 上運(yùn)行了該命令),你可以在上方"merge tool candidates"里找到可用的合并工具列表,輸入你想用的工具名。我們將在第七章討論怎樣改變環(huán)境中的默認(rèn)值。

退出合并工具以后,Git 會(huì)詢問(wèn)你合并是否成功。如果回答是,它會(huì)為你把相關(guān)文件暫存起來(lái),以表明狀態(tài)為已解決。

再運(yùn)行一次 git status 來(lái)確認(rèn)所有沖突都已解決:

  $ git status  On branch master  Changes to be committed:    (use "git reset HEAD ..." to unstage)            modified:   index.html  

如果覺(jué)得滿意了,并且確認(rèn)所有沖突都已解決,也就是進(jìn)入了暫存區(qū),就可以用 git commit 來(lái)完成這次合并提交。提交的記錄差不多是這樣:

  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.  #  

如果想給將來(lái)看這次合并的人一些方便,可以修改該信息,提供更多合并細(xì)節(jié)。比如你都作了哪些改動(dòng),以及這么做的原因。有時(shí)候裁決沖突的理由并不直接或明顯,有必要略加注解。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
午夜在线一区二区| 91久久在线| 日韩欧美中文在线观看| 久热re这里精品视频在线6| 亚洲免费播放| 性一交一乱一区二区洋洋av| 国产视频亚洲| 亚洲精选91| 免费人成精品欧美精品| 亚洲乱码一区| 欧美亚洲三区| 精品国产精品国产偷麻豆 | 国产毛片精品| 美女视频网站久久| 97在线精品| 国产日本久久| 在线综合亚洲| 精品丝袜久久| 日韩福利一区| 日韩不卡免费高清视频| 99久久亚洲精品| 六月婷婷一区| 国产精品调教| 麻豆精品蜜桃| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩不卡一区二区三区| 久久精品天堂| 91九色精品国产一区二区| 亚洲人成亚洲精品| 欧美交a欧美精品喷水| 99精品在线观看| 亚洲美女91| аⅴ资源天堂资源库在线| 激情久久中文字幕| 视频一区国产视频| 国产精品国码视频| 国产亚洲一区二区手机在线观看 | 亚洲日本在线观看视频| 国产精品久久久久久久久免费高清| 国产一区二区三区日韩精品| 亚洲小说春色综合另类电影| 国产精品伦一区二区| 亚洲www免费| 亚洲人成网77777色在线播放| 国产欧美69| 亚洲性视频h| 国产精品密蕾丝视频下载| 亚洲成人精品| 日本aⅴ免费视频一区二区三区| 四虎国产精品免费观看| 欧美中文日韩| 精品久久免费| 欧美特黄一区| 国产精品一区二区免费福利视频| 天堂中文av在线资源库| 最新国产精品视频| 国产成人精品一区二区三区在线| 黄色成人91| 美女视频黄久久| 欧美日韩国产免费观看 | 免费看的黄色欧美网站| 久久精品天堂| 蜜臀av在线播放一区二区三区| 精品美女在线视频| 亚洲综合中文| 欧美性感美女一区二区| 国产精品久久| 成人啊v在线| 久久久久亚洲精品中文字幕| 中文字幕高清在线播放| 免费视频亚洲| 国产亚洲福利| 免费视频一区二区三区在线观看| 国产精品亚洲人成在99www| 久久xxx视频| 亚洲福利久久| 免费精品一区| 欧美午夜精彩| 国产精品久久久免费| 亚洲免费影视| 亲子伦视频一区二区三区| 国产精品天堂蜜av在线播放| 国产精品美女久久久| 高清一区二区| 欧美日本不卡| 亚洲一区av| 欧洲激情综合| 日韩国产一区二区| 欧美一区91| 天堂va蜜桃一区二区三区| 国产 日韩 欧美一区| 麻豆精品蜜桃视频网站| 69精品国产久热在线观看| 欧美日韩国产探花| 国产探花一区在线观看| 国产一区二区三区探花| 亚洲综合小说| 亚洲欧美一级| 欧美日韩xxxx| 四虎4545www国产精品| 日韩三区四区| 成人国产精品久久| 久久成人精品| 欧美91在线|欧美| 亚洲激情精品| 韩国一区二区三区视频| 精品三区视频| 蜜桃精品在线| 国产精品18| 国产亚洲电影| 欧美精品三级在线| 日本亚洲最大的色成网站www | 在线一区视频观看| yellow在线观看网址| 久久久久免费| 麻豆mv在线观看| 久久的色偷偷| 国产精品mm| 欧美日韩亚洲一区| 国产偷自视频区视频一区二区| 成午夜精品一区二区三区软件| 免费看一区二区三区| 国产激情综合| 国产一区二区三区四区五区传媒| 国产福利资源一区| 久久久精品区| 风间由美中文字幕在线看视频国产欧美| 国产亚洲第一伦理第一区| 欧美一区网站| 欧美精品99| 丁香婷婷久久| 欧美91在线|欧美| 精品三区视频| 91亚洲国产| 99久久亚洲精品蜜臀| 欧美日中文字幕| 欧美日韩国产在线一区| 在线一区视频| 日本在线成人| 国产精品久久久久77777丨| 欧美精品成人| 97精品国产| 国产精品99一区二区| 一本一本久久| 日韩中出av| 国产精品theporn| 精品理论电影在线| 日韩精品dvd| 亚洲激情黄色| 日韩不卡一区二区| 精品三区视频| 免费视频亚洲| 日本一不卡视频| 麻豆一区二区99久久久久| 日韩中文欧美| 亚洲精品欧美| 色偷偷色偷偷色偷偷在线视频| 久久伊人久久| 波多野结衣一区| 欧美伊人久久| 日韩精品欧美| 亚洲免费网址| 免费视频一区二区三区在线观看| 精品女同一区二区三区在线观看| 中文字幕日韩高清在线| 日韩精品永久网址| 岛国av在线网站| 国产不卡av一区二区| 久久在线免费| 国产剧情一区二区在线观看| 九色porny丨国产首页在线| 九九综合九九| 国产激情精品一区二区三区| 久久美女性网| 国产精品视频首页| 99国产精品免费视频观看| 久久精品国内一区二区三区| 999国产精品| 一本色道久久精品| 伊人久久亚洲热| 日韩有吗在线观看| 88xx成人免费观看视频库| 麻豆国产在线| 日韩精品免费一区二区夜夜嗨| 六月婷婷一区| 一区在线免费| 欧美黑人做爰爽爽爽| 国产成人久久精品麻豆二区 | 亚洲免费中文| 麻豆成人在线观看| 色婷婷狠狠五月综合天色拍| 中文字幕免费一区二区| 日本不卡免费高清视频在线| 亚洲色图国产| 婷婷综合六月| 日韩av不卡在线观看| 激情久久久久久久| 欧美黑人做爰爽爽爽| 日韩中文字幕麻豆| 日韩精品永久网址|