Perché git mergetool apre 4 finestre in vimdiff? (Mi aspetto 3)
Domanda
Quando ho incontrato un conflitto, ho cercato di usare git-mergetool
per risolverlo. Ho scritto:
>git mergetool -t vimdiff
Si è aperto vimdiff
a 4 vie, non a 3 vie. Le mie finestre divise in look vimdiff come:
: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
Che cosa sono? Voglio un diff 3 vie: file di destinazione, file di unione e file di lavoro. Come devo configurare il mio git o vimdiff?
Soluzione
In alternativa, hai pensato di usare fuggitivo ?
Non ho intenzione di mentire a voi; fugitive.vim può benissimo essere il migliore Git involucro di tutti i tempi.
C'è un un vimcast eccellente, Fugitive.vim - risolvere i conflitti di unione con vimdiff , di Drew Neil. Questo fa parte di una serie sul fuggitivo.
Il href="http://vimcasts.org/" rel="noreferrer"> Vimcasts sito
Per usare diffusa quale si mergetool è possibile utilizzare il seguente. . Nota: si consiglia di cambiare Fugitive ha molto più da offrire che essere solo uno script strumento di unione quindi assicuratevi di leggere la documentazione e / o controllare i vimcasts. git config --global mergetool.fugitive.cmd 'vim -f -c "Gdiff" "$MERGED"'
git config --global merge.tool fugitive
vim
a mvim
o gvim
Altri suggerimenti
Dopo un sacco di ricerca per il rilascio mergetool con vimdiff e solo 3 finestre, mi si avvicinò con questa configurazione, che mi permette di scegliere quando voglio 3 finestre o al mancato 4 finestre:
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'
Ora si può iniziare a 3 finestre semplicemente a digitare:
git m3
E il default (4 finestre) saranno ancora funziona come previsto con:
git mt
Inoltre, probabilmente vorrebbe aggiungere queste righe alla fine del vostro ~/.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
Questo creerà i collegamenti come ,1
per afferrare da sinistra, ,3
per afferrare da destra (in entrambe le modalità) e anche ,2
per afferrare dalla base (finestra centrale) nella modalità 4 finestre.
che aiuta molto!
I miei ~/.gitconfig
aspetto di file come questo:
[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
Spero che questo ti aiuta (e chi arriva a qui).
Modifica di un po 'i comandi da questa pagina :
git config --global mergetool.vimdiff3.cmd 'vim -f -d "$LOCAL" "$MERGED" "$REMOTE"'
git config --global merge.tool vimdiff3
- 'uniti' sarebbe la vostra copia di lavoro.
- 'locale' il file che si trova nel ramo si sta cercando di apportare le modifiche
- 'a distanza' il file dal ramo si sta tentando di fusione con.
E poi si esegue il comando:. git mergetool
Nota ??strong>:. Io uso fuggitivo anche e lo consiglio vivamente
Nota: mentre è possibile utilizzare solo il 3 di Windows come descritto in Dr Beco 's answer
(vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"'
),
la modalità 4-finestre si arricchisce con git 2.8 (Marzo 2016)
commettere 2.300.328 (29 gennaio 2016) da Dickson Wong (diwo
)
(fusa per Junio ??Hamano C - gitster
- in commettere 82c17b7 17 Feb 2016)
Il backend
vimdiff
per "git mergetool
" è stato ottimizzato per organizzare e buffer numeri nell'ordine in cui corrisponderebbe l'aspettativa di maggior parte delle persone che leggono da sinistra a destra, poi verso il basso e assegnare buffer 1 2 3 4 "mentalmente" a base locale finestre unione remota basata in questo ordine.
Internamente, git utilizzerà ora:
"$merge_tool_path" -f -d -c '4wincmd w | wincmd J' \
"$LOCAL" "$BASE" "$REMOTE" "$MERGED"
invece che:
"$merge_tool_path" -f -d -c 'wincmd J' \
"$MERGED" "$LOCAL" "$BASE" "$REMOTE"
mergetool
: riordino vim / gvim buffer in tre vie diffQuando si richiama default (g)
vimdiff
a tre vie di unione, il file unito è caricato come il primo tampone ma spostato verso il basso come quarta finestra.
Ciò causa una disconnessione tra i comandivim
che operano sulla finestra posizioni (ad es CTRL - W_w ). e quelli che operano su indice tampone (ad es do / dp )Questo cambiamento riordina i buffer di avere lo stesso indice come finestre, mentre mantenendo il default del cursore al risultato unito come la finestra in basso.
Io secondo la raccomandazione fuggitivo.
Si potrebbe anche provare splice.vim . E 'un Vim plugin concepito per agire come un git o mercurial mergetool rimpiazzo. Esso consente di rimescolare facilmente vari punti di vista del conflitto. E 'anche molto veloce, semplice e fa un buon lavoro a rendere più intuitiva la fusione. Ecco un screencast .
I file che hai elencato sono:
- Il file locale contenente il conflitto.
- Il file nel ramo si sta fondendosi in.
- Il file nel ramo si sta fondendo da.
- Il file come è stato in entrambi nodo ancesestor ramo. Questo file è molto utile per capire cosa sta succedendo!
Spero che questo aiuti.