运用 vimdiff 作为 Git 的兼并东西确实可能会让新手感到困惑,但它是一个功能强大的东西,一旦把握了它,就能够十分高效地进行代码兼并和比较。以下是一个简短的教程,旨在帮助了解 vimdiff 的根本用法以及如何利用它来进行 Git 兼并。

Git装备

在开始之前,需求知道如何将vimdiff设置为Git的兼并东西。具体步骤如下:

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

这将把Git设置为默认的兼并东西,在兼并时显现一起祖先,并禁用翻开vimdiff的提示。

  • git config merge.tool vimdiff: 这会将 vimdiff 设置为默认的兼并东西。
  • git config merge.conflictstyle diff3: 这会告诉 Git 在兼并抵触时显现一起祖先的版别,这样就能够看到两个分支以及它们的一起起点的内容。
  • git config mergetool.prompt false: 这会禁用翻开兼并东西时的提示,Git 将自动翻开 vimdiff 而不询问是否想要继续。

完结这些设置后,当运转 git mergetool 指令来处理兼并抵触时,Git 将自动运用 vimdiff 来翻开有抵触的文件。

创建兼并抵触

下面用一个例子举例:

创建一个名为”zoo”的目录,并进入”zoo”目录,然后初始化Git库房,最后新建一个animals.txt

mkdir zoo  #
cd zoo
git init
vi animals.txt

在文件中增加一些动物信息后并保存:

cat
dog
octopus
octocat

之后提交该文件

git add animals.txt
git commit -m "Initial commit"

增加文件animals.txt到Git,提交文件,并附上音讯”Initial commit”。

创建一个名为”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

此时,会得到一个兼并过错:

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抵触

处理这个抵触能够输入以下指令:

git mergetool

履行上述指令后,Git会尝试运用vimdiff作为兼并东西来处理抵触。vimdiff会翻开一个窗口,显现两个版别的文件,中心会有抵触符号。需求手动比较这两个版别,并选择一个处理方案来替换抵触的部分。运用 hjkl 键在窗口之间导航,运用 :diffget LOCAL:diffget REMOTE:diffget BASE 来将对应窗口的内容复制到 MERGED 窗口中。处理抵触后,保存并封闭文件,Git会提示你提交抵触的处理成果。

Git兼并利器:Vimdiff运用指南

上述窗口看起来很迷糊,其实很好了解,下面解释一下都有什么。从左到右,从上到下:

  1. LOCAL:
    • 这是当时分支(通常是履行 git merge 指令时地点的分支)的文件内容。
    • 在兼并过程中,这代表了您的最新更改。
  2. BASE:
    • 这是两个分支的一起祖先的文件内容。
    • 它显现了自从两个分支从一起点分开以来,发生了哪些变化。
  3. REMOTE:
    • 这是试图兼并进来的分支的文件内容。
    • git merge 指令中,“ 便是这儿的 REMOTE
  4. MERGED:
    • 这是兼并后的文件内容将显现的地方。
    • 目标是将 LOCALREMOTE 的更改兼并到这个窗口中,以处理所有抵触。

假设想要保存“octodog”的更改(来自REMOTE)。为此,将光标移动到MERGED文件(Ctrl w, j),然后移动到兼并抵触区域。接着,能够选择保存LOCAL版别、BASE版别或REMOTE版别中的哪一部分,或许兼并这些内容。完结后,保存并封闭文件,Git会提示你提交抵触的处理成果。

:diffget RE

这会将REMOTE中相应的更改增加到MERGED文件中,也能够:

`:diffg RE` - 从REMOTE获取内容
`:diffg BA` - 从BASE获取内容
`:diffg LO` - 从LOCAL获取内容

这些指令允许快速地从一个特定的版别中获取内容,并将其应用于MERGED区域。一旦处理了所有的抵触,保存并封闭文件,Git会提示提交抵触的处理成果。

保存文件并退出(快速写入并退出多个文件的方法是::wqa)。一旦处理了所有抵触并保存了文件后运转git commit,完结这些步骤后,就成功地处理了兼并抵触,并将更改提交到了 Git 库房。

Git兼并利器:Vimdiff运用指南

以下是一些其他的指令:

  • 运用:diffthis指令来翻开两个版别之间的差异,这样能够更清楚地看到差异。
  • 运用:nextdiffto指令来切换到下一个差异,这样能够逐渐处理多个抵触。
  • 运用:diffoff指令来封闭差异显现,这样能够更专注于编辑。
  • 运用:diffmerge指令来兼并两个版别,这将掩盖当时的MERGED区域。
  • 运用:diffmergeoff指令来封闭兼并显现,这样能够回到正常的编辑模式。

参考