詳解git merge命令應(yīng)用的三種情景
一、git merge 命令應(yīng)用的三種情景
1.1 “快進(jìn)”(無沖突)
master分支
假設(shè)現(xiàn)在只有一個默認(rèn)的 master 分支,并提交了3次,B0、B1和B2都是提交對象。
首先要清楚,每次產(chǎn)生的提交對象會包含一個指向上次提交對象(父對象)的指針,所以圖中B0、B1和B2之間的箭頭是指針指向父對象的意思,真正的提交順序還是B0到B1再到B2。同時 master 指針指向最新的提交B2。
另外Git中還有一個名為 HEAD 的特殊指針,它是一個指針,指向當(dāng)前所在的本地分支(可以將 HEAD想象為當(dāng)前分支的別名)。
dev新分支
現(xiàn)在新建一個分支并切換到新分支。
$ git checkout -b dev Switched to a new branch 'dev'
它是下面兩條命令的簡寫:
$ git branch dev $ git checkout dev
因?yàn)槭窃贐2創(chuàng)建 dev,所以新分支 dev 指向B2。另外從分支 master 切換到分支 dev,所以HEAD指向當(dāng)前分支 dev。
在 dev 分支工作并提交了2次:
合并dev和master
在分支 dev 的工作結(jié)束,切換到分支 master ,然后把 dev 合并到 master 上:
$ git checkout master Switched to branch 'master' $ git merge dev Merge made by the 'recursive' strategy. test-2.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
由于當(dāng)前 master 分支所指向的提交是你當(dāng)前提交(dev的提交)的直接上游,所以 Git 只是簡單的將 master 指針向前移動。 換句話說,當(dāng)你試圖合并兩個分支時,如果順著一個分支走下去能夠到達(dá)另一個分支,那么 Git 在合并兩者的時候,只會簡單的將指針向前推進(jìn)(指針右移),因?yàn)檫@種情況下的合并操作沒有需要解決的分歧——這就叫做 “快進(jìn)(fast-forward)”。合并結(jié)果如下:
最后,你可以刪除 dev 分支,因?yàn)槟阋呀?jīng)不再需要它了 —— master 分支已經(jīng)指向了同一個位置。 你可以使用帶 -d 選項(xiàng)的 git branch 命令來刪除分支:
$ git branch -d dev
1.2 非“快進(jìn)”,修改不同文件。(無沖突)
當(dāng)在新分支 dev 進(jìn)行了一次提交B3,再回到分支 master 又進(jìn)行一次提交 B4。
這里用 git merge 合并分為兩種情況,現(xiàn)在講第一種情況:
在 master 分支和 dev 分支的公共祖先 B2 后,master 和 dev 的提交是對不同文件或者同一文件的不同部分進(jìn)行了修改,Git 可以合并它們。(比如說原來有 test-1 和 test-2 兩個文件,B4修改的是 test-1 文件,而B3修改的是 test-2 文件,然后合并兩個分支。)
$ git checkout master Switched to branch 'master' $ git merge dev Merge made by the 'recursive' strategy. test-2.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
合并是成功的。
出現(xiàn)這種情況的時候,Git 會使用兩個分支的末端所指的快照(B3 和 B4)以及這兩個分支的公共祖先(B2),做一個簡單的三方合并。注意這里合并后 master 自動 commit 提交了一次,產(chǎn)生了提交B5。而B5中的結(jié)果是三方合并的結(jié)果。合并結(jié)果如下:
最后,合并完成,你已經(jīng)不再需要dev分支了。 現(xiàn)在你可以刪除這個分支。
$ git branch -d dev
1.3 非“快進(jìn)”,修改相同文件。(有沖突)
當(dāng)在新分支 dev 進(jìn)行了一次提交B3,再回到分支 master 又進(jìn)行一次提交 B4。
上面講的是第一種情況,現(xiàn)在講第二種情況:
在 master 分支和 dev 分支的公共祖先 B2 后,master 和 dev 的提交是對同一個文件的同一個部分進(jìn)行了不同的修改,Git 就沒法干凈的合并它們。(比如說原來有 test-1 和 test-2 兩個文件,B4修改的是 test-1 文件,而B3修改的也是 test-1 文件的同一部分,然后合并兩個分支。)
$ git checkout master Switched to branch 'master' $ git merge dev Auto-merging test-1.txt CONFLICT (content): Merge conflict in test-1.txt Automatic merge failed; fix conflicts and then commit the result.
合并是失敗的。
此時 Git 做了合并,但是沒有自動地創(chuàng)建一個新的合并提交。 Git 會暫停下來,等待你去解決合并產(chǎn)生的沖突。 你可以在合并沖突后的任意時刻使用 git status 命令來查看那些因包含合并沖突而處于未合并(unmerged)狀態(tài)的文件:
$ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add <file>..." to mark resolution) both modified: test-1.txt no changes added to commit (use "git add" and/or "git commit -a")
任何因包含合并沖突而有待解決的文件,都會以未合并狀態(tài)標(biāo)識出來。 Git 會在有沖突的文件中加入標(biāo)準(zhǔn)的沖突解決標(biāo)記,這樣你可以打開這些包含沖突的文件然后手動解決沖突。 出現(xiàn)沖突的文件會包含一些特殊區(qū)段,看起來像下面這個樣子:
This is test-1. update test-1. add test-1. <<<<<<< HEAD test master. ======= test dev. >>>>>>> dev
這里 HEAD 表示所指示的版本(也就是你的 master 分支所在的位置,因?yàn)槟阍谶\(yùn)行 merge 命令的時候已經(jīng)檢出到了這個分支)在這個區(qū)段的上半部分(======= 的上半部分),而 dev 分支所指示的版本在 ======= 的下半部分。 為了解決沖突,你必須選擇使用由 ======= 分割的兩部分中的一個,或者你也可以自行合并這些內(nèi)容。 例如,你可以通過把這段內(nèi)容換成下面的樣子來解決沖突:
This is test-1. update test-1. add test-1. test master. test dev.
然后手動提交:
$ git add . $ git commit -m "connection" [master f7daa6b] connection
然后沖突就解決了。合并結(jié)果如下:
最后,合并完成,你已經(jīng)不再需要dev分支了。 現(xiàn)在你可以刪除這個分支。
$ git branch -d dev
到此這篇關(guān)于詳解git merge命令應(yīng)用的三種情景的文章就介紹到這了,更多相關(guān)git merge命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
chatGPT使用及注冊過程中常見的一些錯誤解決方法(所有報錯匯總)
這篇文章主要介紹了chatGPT注冊報錯及使用過程中報錯匯總及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02Kali滲透測試之使用Metasploit對Web應(yīng)用的攻擊
這篇文章主要介紹了Kali滲透測試:使用Metasploit對Web應(yīng)用的攻擊,這種漏洞源于Web應(yīng)用程序沒有對用戶輸入的內(nèi)容進(jìn)行準(zhǔn)確的驗(yàn)證,從而導(dǎo)致操作系統(tǒng)執(zhí)行了攻擊者輸入的命令,需要的朋友可以參考下2022-05-05gVim, gVim Easy, gVim Read-only 的簡單區(qū)別
今天打算好好學(xué)習(xí)一下python,買了一本書看了介紹無語了,gVim, gVim Diff, gVim Easy, gVim Read-only 的簡單區(qū)別,需要的朋友可以參考下2016-01-01Clion、IEDA、pycharm的一些簡單設(shè)置步驟(設(shè)置中文菜單、輸出中文、字體大小、背景顏色主題)
這篇文章主要介紹了Clion、IEDA、pycharm的一些簡單設(shè)置步驟(設(shè)置中文菜單、輸出中文、字體大小、背景顏色主題),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08在VScode中配置ROS環(huán)境的詳細(xì)過程
這篇文章主要介紹了在VScode中配置ROS環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07Skywalking-agent調(diào)試說明以trace-ignore為例
這篇文章主要為大家介紹了以trace-ignore為例的Skywalking-agent調(diào)試說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06