运用 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会提示你提交抵触的处理成果。
上述窗口看起来很迷糊,其实很好了解,下面解释一下都有什么。从左到右,从上到下:
-
LOCAL
:- 这是当时分支(通常是履行
git merge
指令时地点的分支)的文件内容。 - 在兼并过程中,这代表了您的最新更改。
- 这是当时分支(通常是履行
-
BASE
:- 这是两个分支的一起祖先的文件内容。
- 它显现了自从两个分支从一起点分开以来,发生了哪些变化。
-
REMOTE
:- 这是试图兼并进来的分支的文件内容。
- 在
git merge
指令中,“ 便是这儿的REMOTE
。
-
MERGED
:- 这是兼并后的文件内容将显现的地方。
- 目标是将
LOCAL
和REMOTE
的更改兼并到这个窗口中,以处理所有抵触。
假设想要保存“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 库房。
以下是一些其他的指令:
- 运用
:diffthis
指令来翻开两个版别之间的差异,这样能够更清楚地看到差异。 - 运用
:nextdiffto
指令来切换到下一个差异,这样能够逐渐处理多个抵触。 - 运用
:diffoff
指令来封闭差异显现,这样能够更专注于编辑。 - 运用
:diffmerge
指令来兼并两个版别,这将掩盖当时的MERGED区域。 - 运用
:diffmergeoff
指令来封闭兼并显现,这样能够回到正常的编辑模式。