Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

После многих исследований по выпуску 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 = [email protected]
[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

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

Ответ 3

Изменение бит команд из эта страница:

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

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

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

Ответ 4

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

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

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

  • Локальный файл, содержащий конфликт.
  • Файл в ветке, в которую вы сливаетесь.
  • Файл в ветке, из которой вы сливаетесь.
  • Файл как он был в обеих ветках ancesestor node. Этот файл очень полезен для выяснения того, что происходит!

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

Ответ 5

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

См. commit 2300328 (29 января 2016 г.) Диксон Вонг (diwo).
(Слияние Junio ​​C Hamano - gitster - в commit 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).

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