Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用vimdiff解决git合并冲突?_Git_Vim_Git Merge_Mergetool_Git Merge Conflict - Fatal编程技术网

如何使用vimdiff解决git合并冲突?

如何使用vimdiff解决git合并冲突?,git,vim,git-merge,mergetool,git-merge-conflict,Git,Vim,Git Merge,Mergetool,Git Merge Conflict,我刚刚在git中将一个分支合并到我的master中,我得到了自动合并失败;修复冲突,然后提交结果。现在我运行了git mergetool并打开了vimdiff,显示下图。我不知道如何使用vimdiff。这里的每个面板是什么意思?我应该如何继续修复合并冲突 所有四个缓冲区都提供同一文件的不同视图。左上角的缓冲区(本地)是文件在目标分支中的外观(合并到的分支)。右上角的缓冲区(远程)是文件在源分支(合并源分支)中的外观。中间的缓冲区(BASE)是这两个版本的共同祖先(因此您可以比较左右版本之间的差异

我刚刚在git中将一个分支合并到我的master中,我得到了
自动合并失败;修复冲突,然后提交结果。
现在我运行了
git mergetool
并打开了vimdiff,显示下图。我不知道如何使用vimdiff。这里的每个面板是什么意思?我应该如何继续修复合并冲突


所有四个缓冲区都提供同一文件的不同视图。左上角的缓冲区(本地)是文件在目标分支中的外观(合并到的分支)。右上角的缓冲区(远程)是文件在源分支(合并源分支)中的外观。中间的缓冲区(BASE)是这两个版本的共同祖先(因此您可以比较左右版本之间的差异)

我可能在以下几点上弄错了。我认为合并冲突的根源是两个文件自BASE以来更改了文件的相同部分;本地已将引号从双引号更改为单引号,远程已进行相同的更改,但也将背景值从颜色更改为URL。(我认为合并不够聪明,没有注意到对LOCAL的所有更改也都存在于REMOTE中;它只知道LOCAL自BASE以来在REMOTE的相同位置进行了更改)


在任何情况下,底部缓冲区包含您可以实际编辑工作目录中的文件。你可以做任何你喜欢的改变<代码>vim向您展示了它与每个俯视图的不同之处,这些俯视图是自动合并无法处理的区域。如果不希望远程更改,请从本地拉取更改。如果您喜欢远程更改而不是本地更改,请从远程拉取更改。若你们认为远程和本地都是错误的,那个就从基地撤军。如果你有更好的想法,做一些完全不同的事情!最后,您在此处所做的更改将实际提交。

@chepner的回答很好,我想在问题的“我应该如何着手解决合并冲突”部分添加一些细节。如果您了解如何在本例中实际使用vimdiff,下面将介绍


首先,要解决“中止一切”选项-如果您不想使用“vimdiff”并想中止合并:按Esc,然后键入
:qa并点击回车键。(另见)。Git会询问您合并是否完成,请用
n
回复


如果您想使用vimdiff,这里有一些有用的快捷方式。这假设您了解Vim的基本知识(导航和插入/正常模式):

  • 导航到底部缓冲区(合并结果):Ctrl-W j
  • 使用j/k导航到下一个差异;或者,最好使用[c]和[c分别导航到下一个和上一个差异
  • 如果您想查看更多上下文,请在折叠时使用ZO打开它
  • 对于每个差异,根据@chepner的回答,您可以从本地、远程或基本版本获取代码,或者根据需要编辑并重做
    • 要从本地版本获取它,请使用
      :diffget LO
    • 从远程:
      :diffget RE
    • from base:
      :diffget BA
    • 或者,如果您想自己编辑代码,请先从本地/远程/基本获取一个版本,然后转到插入模式并编辑其余版本
  • 完成后,保存合并结果,并退出所有窗口
    :wqa
    • 如果要中止合并当前文件而不将其标记为已解决,请使用
      :cquit
      退出:
  • 通常,git会检测到进行了合并并创建合并提交
在没有复制粘贴或自定义快捷方式的情况下,似乎不可能同时添加本地和远程冲突块:这是一个遗憾,因为add-add是一种常见的冲突类型

要防止vimdiff每次启动时都要求您按enter键,请将以下内容添加到
。vimrc

set shortmess=Ot
# Git Merge conflict
nnoremap <leader>gm /\v^\<\<\<\<\<\<\< \|\=\=\=\=\=\=\=$\|\>\>\>\>\>\>\> /<cr>
如所述:


您可以在Internet上搜索其他vimdiff快捷方式。我发现这一条很有用:

替代vimdiff的终极合并工具

这是一种开玩笑的语言,但在尝试vimdiff之后,我最终将其作为vimmer融合到了一起

要解决合并冲突,我几乎总是需要看到:

  • 遥远的
  • 本地的
  • 两个不同点:
    • 差基遥控器
    • 差基局部
然后试着把它们放在一起

vimdiff在屏幕上显示基本、本地和远程:

    +--------------------------------+
    | LOCAL  |     BASE     | REMOTE |
    +--------------------------------+
    |             MERGED             |
    +--------------------------------+
我不知道如何让它清楚地显示这两个差异,我需要除了看右左了很多次

此外,本地和远程在git合并冲突标记中已经可见,因此我不会从再次显示它们的工具中获得太多

因此,我创建了自己的微型“difftool”,它实际上显示了我所缺少的差异:

~/bin/cirosantilli合并工具

#!/usr/bin/env bash
BASE="$1"
LOCAL="$2"
REMOTE="$3"
diff --color -u "$BASE" "$LOCAL"
diff --color -u "$BASE" "$REMOTE"
exit 1

并将其安装在以下位置:

git config --global mergetool.cirosantilli-mergetool.cmd 'cirosantilli-mergetool $BASE $LOCAL $REMOTE'
git config --global mergetool.cirosantilli-mergetool.trustExitCode true
# If you want this to become your default mergetool.
#git config --global merge.tool 'cirosantilli-mergetool'
现在,当您这样做时:

git mergetool -t cirosantilli-mergetool
它显示了我希望在终端上显示的两个差异,例如,沿以下方向显示的内容:

--- ./src/dev/arm/RealView_BASE_15560.py        2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_LOCAL_15560.py       2019-12-27 13:46:41.979021479 +0000
@@ -994,7 +994,7 @@                                                              
                                       
     def setupBootLoader(self, cur_sys, loc):
         if not cur_sys.boot_loader:                           
-            cur_sys.boot_loader = [ loc('boot_emm.arm64'), loc('boot_emm.arm') ]
+            cur_sys.boot_loader = [ loc('boot.arm64'), loc('boot.arm') ]
         cur_sys.atags_addr = 0x8000000                  
         cur_sys.load_offset = 0x80000000                    

@@ -1054,7 +1054,7 @@                                           
             ]                                                     
                       
     def setupBootLoader(self, cur_sys, loc):
-        cur_sys.boot_loader = [ loc('boot_emm_v2.arm64') ]
+        cur_sys.boot_loader = [ loc('boot_v2.arm64') ]
         super(VExpress_GEM5_V2_Base,self).setupBootLoader(
                 cur_sys, loc)                             
                                                           
--- ./src/dev/arm/RealView_BASE_15560.py        2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_REMOTE_15560.py      2019-12-27 13:46:41.991021366 +0000
@@ -610,10 +610,10 @@           
     def attachIO(self, *args, **kwargs):              
         self._attach_io(self._off_chip_devices(), *args, **kwargs)
                                      
-    def setupBootLoader(self, cur_sys, loc):
-        cur_sys.boot_loader = loc('boot.arm') 
-        cur_sys.atags_addr = 0x100                           
-        cur_sys.load_offset = 0       
+    def setupBootLoader(self, cur_sys, boot_loader, atags_addr, load_offset):
+        cur_sys.boot_loader = boot_loader      
+        cur_sys.atags_addr = atags_addr     
+        cur_sys.load_offset = load_offset
因此,您可以在这里看到两个压差倾倒到终端中:

  • RealView\u BASE\u 15560.py
    vs
    RealView\u LOCAL\u 15560.py
  • RealView\u BASE\u 15560.py
    vs
    RealView\u REMOTE\u 15560.py
如果差别很大,我就用它来搜索

TODO:为了实现涅盘,剩下的最后一件事就是只为冲突的大块头显示差异。因为如果差异很大,但只有一个小块头冲突,那么找到它很烦人

是的,您确实丢失了vimdiff提供的一些快捷方式,但一般来说,解决冲突需要仔细地从两个版本复制粘贴,这在使用git冲突标记的正常vim会话中可以很好地完成

在运行
vimdiff
时观察和扩散文件

在我坐下来用计算机自动完成我的完美设置之前
vim -d main_BASE_1367.py main_LOCAL_1367.py
vim -d main_BASE_1367.py main_REMOTE_1367.py
vim main.py
# Git Merge conflict
nnoremap <leader>gm /\v^\<\<\<\<\<\<\< \|\=\=\=\=\=\=\=$\|\>\>\>\>\>\>\> /<cr>