Почему git mergetool открывает 4 окна в vimdiff? (Я бы ожидал 3) - PullRequest
25 голосов
/ 05 сентября 2011

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

>git mergetool -t vimdiff

Он открылся vimdiff в 4-х направлениях, а не в 3-х.Мои разделенные окна в 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-х сторонний diff: целевой файл, файл слияния и рабочий файл.Как мне настроить мой git или vimdiff?

Ответы [ 5 ]

32 голосов
/ 06 сентября 2011

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

Я не собираюсь вам врать; fugitive.vim вполне может быть лучшим Git обертка всех времен.

Существует отличный vimcast, Fugitive.vim - разрешение конфликтов слияния с vimdiff , автор Drew Neil. Это часть серии о беглеце.

Сайт Vimcasts - хорошее место, чтобы узнать больше о vim.

Чтобы использовать беглеца при объединении, вы можете использовать следующее.

git config --global mergetool.fugitive.cmd 'vim -f -c "Gdiff" "$MERGED"'
git config --global merge.tool fugitive

Примечание: вы можете изменить vim на mvim или gvim.

Fugitive может предложить гораздо больше, чем просто сценарий инструмента слияния, поэтому обязательно прочитайте документацию и / или ознакомьтесь с vimcasts.

9 голосов
/ 05 ноября 2013

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

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 окон.

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

Мой ~/.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

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

5 голосов
/ 18 февраля 2016

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

См. Фиксация 2300328 (29 января 2016 г.) Диксон Вонг (diwo) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 82c17b7 , 17 февраля 2016 г.)

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

Внутри 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 в трехсторонних разностях

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

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

5 голосов
/ 06 сентября 2011

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

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

И затем вы выполняете команду: git mergetool.

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

4 голосов
/ 06 сентября 2011

Я буду второй рекомендации беглеца.

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

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

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

Надеюсь, это поможет.

...