亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

淺析Git 分支的新建與合并

2024-07-21 02:03:39
字體:
來源:轉載
供稿:網友

分支的新建與合并

現在讓我們來看一個簡單的分支與合并的例子,實際工作中大體也會用到這樣的工作流程:

  • 開發某個網站。
  • 為實現某個新的需求,創建一個分支。
  • 在這個分支上開展工作。

假設此時,你突然接到一個電話說有個很嚴重的問題需要緊急修補,那么可以按照下面的方式處理:

  • 返回到原先已經發布到生產服務器上的分支。
  • 為這次緊急修補建立一個新分支,并在其中修復問題。
  • 通過測試后,回到生產服務器所在的分支,將修補分支合并進來,然后再推送到生產服務器上。
  • 切換到之前實現新需求的分支,繼續工作。

分支的新建與切換

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


圖 3-10. 一個簡短的提交歷史

現在,你決定要修補問題追蹤系統上的 #53 問題。順帶說明下,Git 并不同任何特定的問題追蹤系統打交道。這里為了說明要解決的問題,才把新建的分支取名為 iss53。要新建并切換到該分支,運行git checkout并加上-b參數:

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

這相當于執行下面這兩條命令:

$ git branch iss53$ git checkout iss53

圖 3-11 示意該命令的執行結果。


圖 3-11. 創建了一個新分支的指針

接著你開始嘗試修復問題,在提交了若干次更新后,iss53分支的指針也會隨著向前推進,因為它就是當前分支(換句話說,當前的HEAD指針正指向iss53,見圖 3-12):

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


圖 3-12. iss53 分支隨工作進展向前推進

現在你就接到了那個網站問題的緊急電話,需要馬上修補。有了 Git ,我們就不需要同時發布這個補丁和iss53里作出的修改,也不需要在創建和發布該補丁到服務器之前花費大力氣來復原這些修改。唯一需要的僅僅是切換回master分支。

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

$ git checkout masterSwitched to branch 'master'

此時工作目錄中的內容和你在解決問題 #53 之前一模一樣,你可以集中精力進行緊急修補。這一點值得牢記:Git 會把工作目錄的內容恢復為檢出某分支時它所指向的那個提交對象的快照。它會自動添加、刪除和修改文件以確保目錄的內容和你當時提交時完全一樣。

接下來,你得進行緊急修補。我們創建一個緊急修補分支hotfix來開展工作,直到搞定(見圖 3-13):

$ git checkout -b hotfixSwitched 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(-)


圖 3-13. hotfix 分支是從 master 分支所在點分化出來的

有必要作些測試,確保修補是成功的,然后回到master分支并把它合并進來,然后發布到生產服務器。用git merge命令來進行合并:

$ git checkout master$ git merge hotfixUpdating f42c576..3a0874cFast-forward README | 1 - 1 file changed, 1 deletion(-)

請注意,合并時出現了“Fast forward”的提示。由于當前master分支所在的提交對象是要并入的hotfix分支的直接上游,Git 只需把master分支指針直接右移。換句話說,如果順著一個分支走下去可以到達另一個分支的話,那么 Git 在合并兩者時,只會簡單地把指針右移,因為這種單線的歷史分支不存在任何需要解決的分歧,所以這種合并過程可以稱為快進(Fast forward)。

現在最新的修改已經在當前master分支所指向的提交對象中了,可以部署到生產服務器上去了(見圖 3-14)。


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

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

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

現在回到之前未完成的 #53 問題修復分支上繼續工作(圖 3-15):

$ git checkout iss53Switched 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(+)


圖 3-15. iss53 分支可以不受影響繼續推進。

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

刪除遠程分支:

$ git push origin --delete <BranchName>

查看遠程分支:

$ git branch -a

分支的合并

在問題 #53 相關的工作完成之后,可以合并回master分支。實際操作同前面合并hotfix分支差不多,只需回到master分支,運行git merge命令指定要合并進來的分支:

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

請注意,這次合并操作的底層實現,并不同于之前hotfix的并入方式。因為這次你的開發歷史是從更早的地方開始分叉的。由于當前master分支所指向的提交對象(C4)并不是iss53分支的直接祖先,Git 不得不進行一些額外處理。就此例而言,Git 會用兩個分支的末端(C4 和 C5)以及它們的共同祖先(C2)進行一次簡單的三方合并計算。圖 3-16 用紅框標出了 Git 用于合并的三個提交對象:


圖 3-16. Git 為分支合并自動識別出最佳的同源合并點。

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

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


圖 3-17. Git 自動創建了一個包含了合并結果的提交對象。

既然之前的工作成果已經合并到master了,那么iss53也就沒用了。你可以就此刪除它,并在問題追蹤系統里關閉該問題。

$ git branch -d iss53

遇到沖突時的分支合并

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

$ git merge iss53Auto-merging index.htmlCONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result.

Git 作了合并,但沒有提交,它會停下來等你解決沖突。要看看哪些文件在合并時發生沖突,可以用git status查閱:

$ git statusOn branch masterYou have unmerged paths. (fix conflicts and run "git commit")Unmerged paths: (use "git add <file>..." to mark resolution)    both modified:   index.htmlno changes added to commit (use "git add" and/or "git commit -a")

任何包含未解決沖突的文件都會以未合并(unmerged)的狀態列出。Git 會在有沖突的文件里加入標準的沖突解決標記,可以通過它們來手工定位并解決這些沖突??梢钥吹酱宋募愃葡旅孢@樣的部分:

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

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

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

這個解決方案各采納了兩個分支中的一部分內容,而且我還刪除了<<<<<<<,=======>>>>>>>這些行。在解決了所有文件里的所有沖突后,運行git add將把它們標記為已解決狀態(譯注:實際上就是來一次快照保存到暫存區域。)。因為一旦暫存,就表示沖突已經解決。如果你想用一個有圖形界面的工具來解決這些問題,不妨運行git mergetool,它會調用一個可視化的合并工具并引導你解決所有沖突:

$ git mergetoolThis 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 emergeMerging:index.htmlNormal merge conflict for 'index.html': {local}: modified file {remote}: modified fileHit return to start merge resolution tool (opendiff):

如果不想用默認的合并工具(Git 為我默認選擇了opendiff,因為我在 Mac 上運行了該命令),你可以在上方"merge tool candidates"里找到可用的合并工具列表,輸入你想用的工具名。我們將在第七章討論怎樣改變環境中的默認值。

退出合并工具以后,Git 會詢問你合并是否成功。如果回答是,它會為你把相關文件暫存起來,以表明狀態為已解決。

再運行一次git status來確認所有沖突都已解決:

$ git statusOn branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage)    modified:  index.html

如果覺得滿意了,并且確認所有沖突都已解決,也就是進入了暫存區,就可以用git commit來完成這次合并提交。提交的記錄差不多是這樣:

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

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

總結

到此這篇關于Git 分支的新建與合并的文章就介紹到這了,更多相關Git 分支內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人深夜直播免费观看| 中文字幕日韩精品有码视频| 92看片淫黄大片看国产片| 久久五月情影视| 狠狠躁夜夜躁人人躁婷婷91| 国产综合在线视频| 国产伦精品一区二区三区精品视频| 久久伊人91精品综合网站| 国产精品丝袜久久久久久高清| 日韩精品久久久久久久玫瑰园| 日韩视频―中文字幕| www日韩中文字幕在线看| 久久久久久91香蕉国产| 日韩在线欧美在线国产在线| 国产成人精品网站| 成人xvideos免费视频| 亚洲精品suv精品一区二区| 欧美激情在线观看视频| 亚洲人成网站999久久久综合| 亚洲欧美日本伦理| 亚洲国产黄色片| 国产精品一二三在线| 国产精品久久久久久久9999| 国产一区欧美二区三区| 中文字幕日韩有码| 色多多国产成人永久免费网站| 97久久伊人激情网| 久久久视频精品| 国产日韩av在线播放| 在线观看免费高清视频97| 亚洲乱码av中文一区二区| 国产精品久久久久久久久久ktv| 亚洲黄色av女优在线观看| 亚洲精品免费av| 亚洲韩国日本中文字幕| 在线观看国产欧美| 欧美成人亚洲成人| 国产日韩精品在线| 国内精品久久久久影院 日本资源| 亚洲a中文字幕| 久久精品亚洲94久久精品| 日韩在线视频一区| 国产精品美腿一区在线看| 亚洲一区制服诱惑| 欧美性20hd另类| 亚洲成av人影院在线观看| 欧美激情亚洲自拍| 亚洲精选在线观看| 亚洲资源在线看| 91精品国产高清久久久久久91| 精品亚洲一区二区三区在线播放| 精品无人区乱码1区2区3区在线| 亚洲国产日韩欧美在线99| 亚洲欧美日韩精品久久亚洲区| 国产精品吹潮在线观看| 日韩在线观看你懂的| 亚洲一区www| 久久久精品在线| 亚洲成人网在线| 欧美理论电影网| 国产亚洲精品久久久久久牛牛| 在线看福利67194| 最近的2019中文字幕免费一页| 中文字幕成人在线| 亚洲欧洲在线看| 欧美一级片在线播放| 亚洲电影免费在线观看| 成人av色在线观看| 日韩在线观看免费| 国产偷亚洲偷欧美偷精品| 欧美亚洲日本黄色| 国产欧美久久一区二区| 日韩av网址在线| 久久夜色精品国产欧美乱| www.亚洲一区| 91色在线视频| 九九热这里只有在线精品视| 久久久噜噜噜久久中文字免| 日韩综合视频在线观看| 97在线免费观看视频| 国产精品极品美女粉嫩高清在线| 国产精品免费视频久久久| 精品久久久久久中文字幕一区奶水| 精品久久久久久中文字幕| 91久久精品一区| 性欧美长视频免费观看不卡| 国产91精品不卡视频| 91精品国产沙发| 国产91在线视频| 国产视频一区在线| 91精品国产91久久久久久| 国产精品尤物福利片在线观看| 日韩亚洲欧美中文在线| 久久精品色欧美aⅴ一区二区| 亚洲四色影视在线观看| 欧美日韩国产综合视频在线观看中文| 欧美大码xxxx| 欧美性资源免费| 国产丝袜一区二区三区免费视频| 欧美成人高清视频| 亚洲色图综合久久| 欧美激情精品久久久久久大尺度| www.久久久久久.com| 日韩在线播放一区| 一区二区三区视频免费在线观看| 91久久精品在线| 欧美成人午夜激情视频| 成人黄色激情网| 欧美激情视频在线观看| 国产欧美 在线欧美| 国产精品老女人精品视频| 亚洲成年网站在线观看| 久久免费成人精品视频| 91久久久久久久久久久| 精品人伦一区二区三区蜜桃免费| 视频在线观看一区二区| 国产日本欧美一区二区三区| 亚洲偷熟乱区亚洲香蕉av| 国产欧美中文字幕| 欧美激情小视频| 国产精品精品视频一区二区三区| 91免费国产网站| 亚洲国产精品人久久电影| 91色精品视频在线| 亚洲国产精品va在线看黑人动漫| 伊人成人开心激情综合网| 国产精品女人久久久久久| 日韩在线中文字| 亚洲免费福利视频| 欧美国产日韩精品| 久久精品国产亚洲精品2020| 精品久久久久久久久久久| 91在线播放国产| 国产精品国产福利国产秒拍| 国产亚洲成精品久久| 久久久精品视频在线观看| 国产精品va在线| 免费97视频在线精品国自产拍| 亚洲国产精彩中文乱码av在线播放| 欧美激情二区三区| 国产精品一区二区久久久| 在线播放国产一区二区三区| 国产精品av在线播放| 亚洲成人999| 97人人爽人人喊人人模波多| 国产在线视频91| 91久久久国产精品| 欧美在线视频一区| 九九久久久久99精品| 91情侣偷在线精品国产| 欧美巨乳美女视频| 2019中文字幕在线| 国产午夜精品视频免费不卡69堂| 国产这里只有精品| 黄网动漫久久久| 国产精品亚洲视频在线观看| 在线看片第一页欧美| 日日狠狠久久偷偷四色综合免费| 久久久精品美女| 欧美成人全部免费| 亚洲精品欧美一区二区三区| 欧美性xxxx极品高清hd直播| 亚洲美女性视频| 91国内精品久久|