使用 vimdiff
作為 Git 的合并工具確實(shí)可能會(huì)讓新手感到困惑,但它是一個(gè)功能強(qiáng)大的工具,一旦掌握了它,就可以非常高效地進(jìn)行代碼合并和比較。以下是一個(gè)簡(jiǎn)短的教程,旨在幫助理解 vimdiff
的基本用法以及如何利用它來(lái)進(jìn)行 Git 合并。
Git配置
在開始之前,需要知道如何將vimdiff設(shè)置為Git的合并工具。具體步驟如下:
git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false
這將把Git設(shè)置為默認(rèn)的合并工具,在合并時(shí)顯示共同祖先,并禁用打開vimdiff的提示。
-
git config merge.tool vimdiff
: 這會(huì)將vimdiff
設(shè)置為默認(rèn)的合并工具。 -
git config merge.conflictstyle diff3
: 這會(huì)告訴 Git 在合并沖突時(shí)顯示共同祖先的版本,這樣就可以看到兩個(gè)分支以及它們的共同起點(diǎn)的內(nèi)容。 -
git config mergetool.prompt false
: 這會(huì)禁用打開合并工具時(shí)的提示,Git 將自動(dòng)打開vimdiff
而不詢問(wèn)是否想要繼續(xù)。
完成這些設(shè)置后,當(dāng)運(yùn)行 git mergetool
命令來(lái)解決合并沖突時(shí),Git 將自動(dòng)使用 vimdiff
來(lái)打開有沖突的文件。
創(chuàng)建合并沖突
下面用一個(gè)例子舉例:
創(chuàng)建一個(gè)名為"zoo"的目錄,并進(jìn)入"zoo"目錄,然后初始化Git倉(cāng)庫(kù),最后新建一個(gè)animals.txt
。
mkdir zoo #
cd zoo
git init
vi animals.txt
在文件中添加一些動(dòng)物信息后并保存:
cat
dog
octopus
octocat
之后提交該文件
git add animals.txt
git commit -m "Initial commit"
添加文件animals.txt
到Git,提交文件,并附上消息"Initial commit"。
創(chuàng)建一個(gè)名為"octodog"的分支,并切換到"octodog"分支,并打開文件animals.txt
,并將"octopus"改為"octodog"。
git branch octodog
git checkout octodog
vi animals.txt # let's change octopus to octodog
添加文件animals.txt
到Git,提交文件,并附上消息"Replace octopus with an octodog"。
git add animals.txt
git commit -m "Replace octopus with an octodog"
切換到"master"分支,打開文件animals.txt
,并將"octopus"改為"octoman"。
git checkout master
vi animals.txt # let's change octopus to octoman
添加文件animals.txt
到Git,提交文件,并附上消息"Replace octopus with an octoman"。
git add animals.txt
git commit -m "Replace octopus with an octoman"
合并"octodog"分支到"master"分支。
git merge octodog # merge octodog into master
此時(shí),會(huì)得到一個(gè)合并錯(cuò)誤:
Auto-merging animals.txt
CONFLICT (content): Merge conflict in animals.txt
Automatic merge failed; fix conflicts and then commit the result.
這表明在animals.txt
文件中存在合并沖突。
使用vimdiff解決merge沖突
解決這個(gè)沖突可以輸入以下命令:
git mergetool
執(zhí)行上述命令后,Git會(huì)嘗試使用vimdiff作為合并工具來(lái)解決沖突。vimdiff會(huì)打開一個(gè)窗口,顯示兩個(gè)版本的文件,中間會(huì)有沖突標(biāo)記。需要手動(dòng)比較這兩個(gè)版本,并選擇一個(gè)解決方案來(lái)替換沖突的部分。使用 hjkl
鍵在窗口之間導(dǎo)航,使用 :diffget LOCAL
、:diffget REMOTE
或 :diffget BASE
來(lái)將對(duì)應(yīng)窗口的內(nèi)容復(fù)制到 MERGED
窗口中。解決沖突后,保存并關(guān)閉文件,Git會(huì)提示你提交沖突的解決結(jié)果。
上述窗口看起來(lái)很迷糊,其實(shí)很好理解,下面解釋一下都有什么。從左到右,從上到下:
-
LOCAL
:- 這是當(dāng)前分支(通常是執(zhí)行
git merge
命令時(shí)所在的分支)的文件內(nèi)容。 - 在合并過(guò)程中,這代表了您的最新更改。
- 這是當(dāng)前分支(通常是執(zhí)行
-
BASE
:- 這是兩個(gè)分支的共同祖先的文件內(nèi)容。
- 它顯示了自從兩個(gè)分支從共同點(diǎn)分開以來(lái),發(fā)生了哪些變化。
-
REMOTE
:- 這是試圖合并進(jìn)來(lái)的分支的文件內(nèi)容。
- 在
git merge
命令中,`` 就是這里的REMOTE
。
-
MERGED
:- 這是合并后的文件內(nèi)容將顯示的地方。
- 目標(biāo)是將
LOCAL
和REMOTE
的更改合并到這個(gè)窗口中,以解決所有沖突。
假設(shè)想要保留“octodog”的更改(來(lái)自REMOTE)。為此,將光標(biāo)移動(dòng)到MERGED文件(Ctrl + w, j),然后移動(dòng)到合并沖突區(qū)域。接著,可以選擇保留LOCAL版本、BASE版本或REMOTE版本中的哪一部分,或者合并這些內(nèi)容。完成后,保存并關(guān)閉文件,Git會(huì)提示你提交沖突的解決結(jié)果。
:diffget RE
這會(huì)將REMOTE中相應(yīng)的更改添加到MERGED文件中,也可以:
`:diffg RE` - 從REMOTE獲取內(nèi)容
`:diffg BA` - 從BASE獲取內(nèi)容
`:diffg LO` - 從LOCAL獲取內(nèi)容
這些命令允許快速地從一個(gè)特定的版本中獲取內(nèi)容,并將其應(yīng)用于MERGED區(qū)域。一旦解決了所有的沖突,保存并關(guān)閉文件,Git會(huì)提示提交沖突的解決結(jié)果。
保存文件并退出(快速寫入并退出多個(gè)文件的方法是::wqa)。一旦解決了所有沖突并保存了文件后運(yùn)行git commit
,完成這些步驟后,就成功地解決了合并沖突,并將更改提交到了 Git 倉(cāng)庫(kù)。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-857216.html
以下是一些其他的命令:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-857216.html
- 使用
:diffthis
命令來(lái)打開兩個(gè)版本之間的差異,這樣可以更清楚地看到差異。 - 使用
:nextdiffto
命令來(lái)切換到下一個(gè)差異,這樣可以逐步解決多個(gè)沖突。 - 使用
:diffoff
命令來(lái)關(guān)閉差異顯示,這樣可以更專注于編輯。 - 使用
:diffmerge
命令來(lái)合并兩個(gè)版本,這將覆蓋當(dāng)前的MERGED區(qū)域。 - 使用
:diffmergeoff
命令來(lái)關(guān)閉合并顯示,這樣可以回到正常的編輯模式。
參考
- https://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/
到了這里,關(guān)于Git合并利器:Vimdiff使用指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!