Das ultimative Mergetool, um vimdiff zu ersetzen
Das ist eine Art Augenzwinkern, aber es ist das, worauf ich mich nach dem Versuch von vimdiff als Vimmer konzentriert habe.
Um einen Zusammenführungskonflikt zu lösen, muss ich fast immer Folgendes sehen:
- FERNBEDIENUNG
- LOKAL
- zwei Unterschiede:
- diff BASE REMOTE
- diff BASE LOCAL
um dann zu versuchen, beide zusammenzufügen.
Während vimdiff BASE, LOCAL und REMOTE auf dem Bildschirm anzeigt:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
Ich weiß nicht, wie ich die beiden Unterschiede, die ich außerdem brauche, deutlich machen kann, indem ich ein paar Mal nach rechts, links, rechts und links schaue.
Außerdem sind LOCAL und REMOTE bereits in den Konfliktmarkierungen für Git-Merge sichtbar, sodass ich nicht so viel von einem Tool profitiere, das sie erneut anzeigt.
Deshalb habe ich stattdessen mein eigenes kleines "Difftool" erstellt, das tatsächlich die Unterschiede zeigt, die mir fehlten:
~ / bin / cirosantilli-mergetool
#!/usr/bin/env bash
BASE="$1"
LOCAL="$2"
REMOTE="$3"
diff --color -u "$BASE" "$LOCAL"
diff --color -u "$BASE" "$REMOTE"
exit 1
GitHub stromaufwärts .
Und installieren Sie es mit:
git config --global mergetool.cirosantilli-mergetool.cmd 'cirosantilli-mergetool $BASE $LOCAL $REMOTE'
git config --global mergetool.cirosantilli-mergetool.trustExitCode true
# If you want this to become your default mergetool.
#git config --global merge.tool 'cirosantilli-mergetool'
Wenn Sie dies tun:
git mergetool -t cirosantilli-mergetool
Es zeigt die beiden Unterschiede, die ich auf dem Terminal haben möchte, z. B. etwas entlang:
--- ./src/dev/arm/RealView_BASE_15560.py 2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_LOCAL_15560.py 2019-12-27 13:46:41.979021479 +0000
@@ -994,7 +994,7 @@
def setupBootLoader(self, cur_sys, loc):
if not cur_sys.boot_loader:
- cur_sys.boot_loader = [ loc('boot_emm.arm64'), loc('boot_emm.arm') ]
+ cur_sys.boot_loader = [ loc('boot.arm64'), loc('boot.arm') ]
cur_sys.atags_addr = 0x8000000
cur_sys.load_offset = 0x80000000
@@ -1054,7 +1054,7 @@
]
def setupBootLoader(self, cur_sys, loc):
- cur_sys.boot_loader = [ loc('boot_emm_v2.arm64') ]
+ cur_sys.boot_loader = [ loc('boot_v2.arm64') ]
super(VExpress_GEM5_V2_Base,self).setupBootLoader(
cur_sys, loc)
--- ./src/dev/arm/RealView_BASE_15560.py 2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_REMOTE_15560.py 2019-12-27 13:46:41.991021366 +0000
@@ -610,10 +610,10 @@
def attachIO(self, *args, **kwargs):
self._attach_io(self._off_chip_devices(), *args, **kwargs)
- def setupBootLoader(self, cur_sys, loc):
- cur_sys.boot_loader = loc('boot.arm')
- cur_sys.atags_addr = 0x100
- cur_sys.load_offset = 0
+ def setupBootLoader(self, cur_sys, boot_loader, atags_addr, load_offset):
+ cur_sys.boot_loader = boot_loader
+ cur_sys.atags_addr = atags_addr
+ cur_sys.load_offset = load_offset
Sie können hier also die beiden im Terminal abgelegten Diffs sehen:
RealView_BASE_15560.py
vs. RealView_LOCAL_15560.py
RealView_BASE_15560.py
vs. RealView_REMOTE_15560.py
Wenn die Unterschiede groß sind, suche ich einfach nach meinen tmux-Superkräften .
Ja, Sie verlieren zwar einige von vimdiff bereitgestellte Verknüpfungen, aber im Allgemeinen erfordert das Lösen von Konflikten ein sorgfältiges Kopieren und Einfügen aus beiden Versionen, was ich in einer normalen vim-Sitzung mit den Git-Konfliktmarkierungen problemlos tun kann.
Beobachten und Verteilen von Dateien während der vimdiff
Ausführung
Bevor ich mich cirosantilli-mergetool
hinsetzte und mein perfektes Setup mit automatisierte , tat ich Folgendes, um die beiden Unterschiede zu erreichen, die ich brauchte.
Wenn während der git mergetool
Ausführung vimdiff
ein Konflikt mit einer Datei mit dem Namen z. B. main.py
auftritt, generiert git Dateien für jede der folgenden Versionen:
main_BASE_1367.py
main_LOCAL_1367.py
main_REMOTE_1367.py
im selben Verzeichnis wie main.py
wo 1367
ist die PID von git mergetool und daher eine "zufällige" Ganzzahl, wie unter: Welche BACKUP-, BASE-, LOCAL- und REMOTE-Dateien werden in einem Git-Merge-Konflikt generiert?
Um die gewünschten Unterschiede zu sehen, finde ich zuerst die generierten Dateien mit git status
, öffne dann neue Terminals und mache einen Vimdiff zwischen den Dateipaaren, die mir wichtig sind:
vim -d main_BASE_1367.py main_LOCAL_1367.py
vim -d main_BASE_1367.py main_REMOTE_1367.py
Zusammen mit git mergetool
helfen diese Informationen VIEL, schnell herauszufinden, was los ist!
Auch wenn mergetool ausgeführt wird, können Sie die Datei einfach öffnen:
vim main.py
direkt und bearbeiten Sie es dort, wenn Sie der Meinung sind, dass es mit einem größeren Editorfenster einfacher wird.
Springe direkt, um Konflikte zusammenzuführen
Während ]c
in vimdiff zum nächsten Diff-Punkt gesprungen wird, gibt es dort nicht immer einen Zusammenführungskonflikt.
Um dies zu unterstützen, habe ich in meinem ~/.vimrc
:
# Git Merge conflict
nnoremap <leader>gm /\v^\<\<\<\<\<\<\< \|\=\=\=\=\=\=\=$\|\>\>\>\>\>\>\> /<cr>
das findet die Konflikte direkt.
git imerge
Vielleicht ist die beste Option, einfach auf die Verwendung von vimdiff zu verzichten und sich auf reguläres vim + git imerge zu verlassen, das unter folgendem erwähnt wurde: Wie kann ich herausfinden, welche Git-Commits Konflikte verursachen? da die Lernkurve von vimdiff ärgerlich ist und nicht die Funktionen erfüllt, die wir am meisten benötigen.