open - ¿Por qué git mergetool abre 4 ventanas en vimdiff?(Esperaría 3)
mergetool gui (5)
Como alternativa, ¿has pensado en usar fugitive ?
No te voy a mentir; fugitive.vim puede ser el mejor envoltorio de Git de todos los tiempos.
Hay un video excelente, Fugitive.vim - resolviendo conflictos de fusión con vimdiff , por Drew Neil. Esto es parte de una serie sobre fugitivos.
El Vimcasts web de Vimcasts es un buen lugar para aprender más sobre vim.
Para usar fugitivo como mergetool puede usar lo siguiente.
git config --global mergetool.fugitive.cmd ''vim -f -c "Gdiff" "$MERGED"''
git config --global merge.tool fugitive
Nota: es posible que desee cambiar vim
a mvim
o gvim
.
Fugitive tiene mucho más que ofrecer que solo ser un script de herramientas de combinación, así que asegúrate de leer la documentación y / o consultar los vimcasts.
Cuando encontré un conflicto, traté de usar git-mergetool
para resolverlo. Escribí:
>git mergetool -t vimdiff
Abrió vimdiff
en 4 vías, no en 3 vías. Mis ventanas divididas en vimdiff se parecen a:
: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
¿Qué son? Quiero un diff de 3 vías: archivo de destino, archivo de combinación y archivo de trabajo. ¿Cómo debo configurar mi git o vimdiff?
Después de mucha investigación para publicar mergetool con vimdiff y solo 3 ventanas, se me ocurrió esta configuración, que me permite elegir cuándo quiero 3 ventanas o las 4 ventanas predeterminadas:
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''
Ahora puedes iniciar 3 ventanas solo escribiendo:
git m3
Y el valor predeterminado (4 ventanas) seguirá funcionando como se espera con:
git mt
Además, probablemente le gustaría agregar estas líneas al final de su ~/.vimrc
o /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
Esto creará accesos directos como ,1
para agarrar desde la izquierda, ,3
para agarrar desde la derecha (en ambos modos) y también ,2
para agarrar desde la base (ventana central) en el modo de 4 ventanas.
Eso ayuda mucho!
Mi archivo ~/.gitconfig
ve así:
[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
Espero que esto te ayude a ti (y a los que llegan aquí).
Modificando un poco los comandos de esta página :
git config --global mergetool.vimdiff3.cmd ''vim -f -d "$LOCAL" "$MERGED" "$REMOTE"''
git config --global merge.tool vimdiff3
- ''Fusionado'' sería su copia de trabajo.
- ''Local'' el archivo que se encuentra en la rama en la que está intentando realizar los cambios.
- ''Remoto'' el archivo de la rama con la que está intentando fusionarse.
Y luego ejecutas el comando: git mergetool
.
Nota : Yo también uso fugitivo y lo recomiendo altamente.
Nota: mientras que solo puede usar 3 Windows como se describe en la answer
( vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"''
),
el modo de 4 ventanas se ha mejorado con git 2.8 (marzo de 2016)
Ver commit 2300328 (29 de enero de 2016) por Dickson Wong ( diwo
) .
(Fusionada por Junio C Hamano - gitster
- in commit 82c17b7 , 17 de febrero de 2016)
El backend de
vimdiff
para "git mergetool
" se ha modificado para organizar y numerar los buffers en el orden que coincidiría con la expectativa de la mayoría de las personas que leen de izquierda a derecha, luego de arriba hacia abajo y asignan los buffers 1 2 3 4 "mentalmente" a la base local ventanas de combinación remota basadas en ese orden.
Internamente, git ahora usará:
"$merge_tool_path" -f -d -c ''4wincmd w | wincmd J'' /
"$LOCAL" "$BASE" "$REMOTE" "$MERGED"
en lugar de:
"$merge_tool_path" -f -d -c ''wincmd J'' /
"$MERGED" "$LOCAL" "$BASE" "$REMOTE"
mergetool
: reordenar buffers vim / gvim en diffs de tres víasCuando se invoca la
vimdiff
tres vías predeterminada (g)vimdiff
, el archivo combinado se carga como el primer búfer, pero se mueve a la parte inferior como la cuarta ventana.
Esto provoca una desconexión entre los comandosvim
que operan en las posiciones de la ventana (por ejemplo, CTRL - W_w ) y aquellos que operan en el índice del búfer (por ejemplo, do / dp ).Este cambio reordena los búferes para que tengan el mismo índice que Windows, manteniendo el cursor predeterminado para el resultado combinado como la ventana inferior.
Voy a secundar la recomendación fugitiva.
También puedes probar splice.vim . Es un complemento de Vim diseñado para actuar como un reemplazo instantáneo de git o mergetool mercurial. Te permite mezclar fácilmente varias vistas del conflicto. También es muy rápido, directo y hace un buen trabajo para hacer que la fusión sea más intuitiva. Aquí hay un screencast .
Los archivos que has listado son:
- El archivo local que contiene el conflicto.
- El archivo en la rama en la que se está fusionando.
- El archivo en la rama de la que se está fusionando.
- El archivo tal y como estaba en el nodo ancesestor de ambas ramas. ¡Este archivo es muy útil para descubrir qué está pasando!
Espero que esto ayude.