如何在 mergetool 期间选择整个 REMOTE 文件?

Posted

技术标签:

【中文标题】如何在 mergetool 期间选择整个 REMOTE 文件?【英文标题】:How to select the entire REMOTE file during mergetool? 【发布时间】:2019-08-21 02:33:01 【问题描述】:

我正在使用 CLI 合并工具 vimdiff,而不是逐行输入 :diffg RE 以选择远程版本,有没有一种方法可以让整个文件的远程版本作为目标合并?

【问题讨论】:

Git 允许您指定合并策略(我们的,他们的),但这些会影响整个合并。小心 【参考方案1】:

(CLI 替代)

我知道它并没有真正按原样回答您的问题,但如果您需要从一侧获取合并中特定冲突文件的所有内容,您不需要甚至需要一个工具。

你可以查看你想要的文件版本(检查文档here和there)然后add它来解决冲突:

git checkout --ours path/to/file
# or
git checkout --theirs path/to/file

# and then to conclude the resolution
git add path/to/file

请注意,如果您对该移动感到后悔,您也可以使用冲突标记将其恢复为未合并状态,使用

git checkout -m path/to/file

【讨论】:

【参考方案2】:

简答:

使用:%diffget 获取所有块。


解释:

diffget 像大多数 vim 命令一样采用一个范围。引用 vimhelp:

                                                        :diffg :diffget
:[range]diffg[et] [bufspec]
                Modify the current buffer to undo difference with another
                buffer.  [...]
                See below for [range].

[...]

When no [range] is given, the diff at the cursor position or just above it is
affected.  When [range] is used, Vim tries to only put or get the specified
lines.

% 用作范围时“等于 1,$(整个文件)”,请参阅 :help :%

【讨论】:

【参考方案3】:

在 mergetool 中,如果你有超过 2 个缓冲区,则不能使用 :diffget,因为 Vim 不知道从哪个文件中获取差异。

但是,当您解决冲突时(您需要运行 mergetool),您有几个由 Git 创建的文件来管理冲突:

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

    both modified:   my/conflicting/file.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .env
    my/conflicting/file.py.orig
    my/conflicting/file_BACKUP_5038.py
    my/conflicting/file_BASE_5038.py
    my/conflicting/file_LOCAL_5038.py
    my/conflicting/file_REMOTE_5038.py

它们代表冲突的不同方面:

BACKUP 是带有冲突标记的文件的副本, LOCAL 是冲突前的当前状态, BASE 包含在您的本地文件和正在合​​并的文件(或在 rebase、cherry-pick 或 stash pop/apply 的情况下应用)之间的共同祖先提交时文件的状态, REMOTE 是尝试应用的提交

所以你可以做的是将_REMOTE_文件复制为你当前的(cp path/to/file_REMOTE_* path/to/file),或者在mergetool中,复制_REMOTE_:%y)的内容并用它替换你的文件内容(ggVGp,到顶部,进入视线模式,到最后,粘贴)。

【讨论】:

以上是关于如何在 mergetool 期间选择整个 REMOTE 文件?的主要内容,如果未能解决你的问题,请参考以下文章

eclipse git 解决冲突 解决 mergetool 不能使用问题

如何使用 Visual Studio Code 作为 mercurial 的默认 MergeTool

如何配置git mergetool配置

markdown 如何使用`git mergetool`来解决冲突

markdown 如何使用`git mergetool`来解决冲突

如何解决与“git mergetool”的多个冲突而不必关闭文件之间的编辑器?