Почему git mergetool открывает 4 окна в vimdiff? (Я ожидал 3)

когда я встретил конфликт, я попытался использовать git-mergetool чтобы решить эту проблему. Я набрал:

>git mergetool -t vimdiff

открыл vimdiff в 4-way, не 3-way. Мои сплит-окна в vimdiff выглядят так:

:ls
  1 #a   "Gemfile.lock"                 line 1
  2 %a   "Gemfile.lock.LOCAL.4828.lock" line 1
  3  a   "Gemfile.lock.BASE.4828.lock"  line 0
  4  a   "Gemfile.lock.REMOTE.4828.lock" line 0

что это такое? Я хочу 3-way diff: целевой файл, файл слияния и рабочий файл. Как настроить git или vimdiff?

5 ответов


в качестве альтернативы, вы думали об использовании беглец?


после многих исследований для выпуска mergetool с vimdiff и только 3 windows, я придумал эту конфигурацию, которая позволяет мне выбрать, когда я хочу 3 windows или по умолчанию 4 windows:

git config --global merge.tool vimdiff
git config --global alias.mt mergetool

git config --global mergetool.merge3.cmd 'vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"'
git config --global alias.m3 'mergetool -t merge3'

теперь вы можете запустить 3 окна, просто набрав:

git m3

и значение по умолчанию (4 окна) будет по-прежнему работает, как ожидалось с:

git mt

кроме того, вы, вероятно, хотите, чтобы добавить эти строки в конец ~/.vimrc или /etc/vim/vimrc

 " shortcuts to vimdiff
 let mapleader=','
 let g:mapleader=','

 if &diff
    map <leader>1 :diffget LOCAL<CR>
    map <leader>2 :diffget BASE<CR>
    map <leader>3 :diffget REMOTE<CR>
 endif

это создаст ярлыки, такие как ,1 схватить слева, ,3 чтобы захватить справа (в обоих режимах), а также ,2 для захвата из базы (центральное окно)в режиме 4 windows.

это очень помогает!

мой ~/.gitconfig файл выглядит так:

[user]
        name = Dr Beco
        email = my@email
[merge]
        tool = vimdiff
[mergetool "merge3"]
        cmd = vim -d -c \"wincmd l\" \"$LOCAL\" \"$MERGED\" \"$REMOTE\"
[alias]
        lo = log --pretty=format:\"%h %ce %cd %s\" --graph
        co = checkout
        ci = commit
        cm = commit -a -m
        st = status
        br = branch
        m3 = mergetool -t merge3
        mt = mergetool
[diff]
        tool = vimdiff

Я надеюсь, что это поможет вам (и тем, кто доберется сюда).


изменение немного команд из на этой странице:

git config --global mergetool.vimdiff3.cmd 'vim -f -d "$LOCAL" "$MERGED" "$REMOTE"'
git config --global merge.tool vimdiff3
  • 'Merged' будет вашей рабочей копией.
  • 'Local' файл, который находится в ветке, которую вы пытаетесь внести изменения
  • 'Remote' файл из ветви, с которой вы пытаетесь слиться.

и затем выполнить команды: git mergetool.

Примечание: я использую беглец также и очень рекомендую его.


Примечание: В то время как вы можете использовать только 3 окна, как описано в Д-Р Беко ' s ответ
(vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"'),
режим 4-windows улучшен с помощью git 2.8 (март 2016 года)

посмотреть совершить 2300328 (29 янв 2016) by Диксон Вонг (diwo).
(слитый Junio C Hamano -- gitster -- на совершить 82c17b7, 17 февраля 2016)

на vimdiff бэкэнд для "git mergetool " был изменен, чтобы организовать и число буферов в порядке, который будет соответствовать ожиданию большинство людей, которые читают слева направо, затем сверху вниз и назначают буферы 1 2 3 4 "мысленно" для локальной базы удаленного слияния на основе windows в таком порядке.

внутренне, git теперь будет использовать:

"$merge_tool_path" -f -d -c '4wincmd w | wincmd J' \
            "$LOCAL" "$BASE" "$REMOTE" "$MERGED"

вместо:

"$merge_tool_path" -f -d -c 'wincmd J' \
        "$MERGED" "$LOCAL" "$BASE" "$REMOTE"

mergetool: переупорядочить буферы vim/gvim в трех направлениях диффс

при вызове default (g)vimdiff трехстороннее слияние, объединенный файл загружается как первый буфер, но перемещается вниз как четвертое окно.
Это вызывает разъединение между vim команды, которые работают на окно позиции (например,CTRL-W_w) и те, которые работают с индексом буфера (например, do/dp).

это изменение переупорядочивает буферы, чтобы иметь то же самое индекс как Windows, пока сохранение курсора по умолчанию для объединенного результата в качестве нижнего окна.


Я поддержу рекомендацию беглеца.

вы также можете попробовать соединения.ВИМ. Это плагин Vim, предназначенный для работы в качестве замены Git или mercurial mergetool. Это позволяет легко перетасовать различные взгляды на конфликт. Это также очень быстро, просто и делает хорошую работу по созданию слияния более интуитивным. Вот видеоуроки.

перечисленные вами файлы:

  1. локальный файл, содержащий конфликт.
  2. файл в ветке, в которую вы сливаетесь.
  3. файл в ветке, из которой вы сливаетесь.
  4. файл, как это было в обеих филиал узел ancesestor. Этот файл очень полезен для выяснения того, что происходит!

надеюсь, что это помогает.