L'outil de fusion ultime pour remplacer vimdiff
C'est une sorte de ironie, mais c'est ce vers quoi j'ai fini par converger en tant que vimmer après avoir essayé vimdiff.
Pour résoudre un conflit de fusion, j'ai presque toujours besoin de voir:
- ÉLOIGNÉ
- LOCAL
- deux diffs:
- diff BASE REMOTE
- diff BASE LOCAL
pour ensuite essayer de les mettre ensemble.
Alors que vimdiff affiche BASE, LOCAL et REMOTE à l'écran:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
Je ne sais pas comment faire pour montrer clairement ces deux différences dont j'ai besoin en plus de regarder droite gauche droite gauche plusieurs fois.
De plus, LOCAL et REMOTE sont déjà visibles dans les marqueurs de conflit git merge, donc je ne gagne pas grand-chose à un outil qui les montre à nouveau.
Par conséquent, j'ai plutôt créé mon propre petit "difftool" qui montre en fait les diffs qui me manquaient:
~ / 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 en amont .
Et installez-le avec:
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'
Maintenant, quand vous faites:
git mergetool -t cirosantilli-mergetool
il montre les deux diffs que je veux sur le terminal, par exemple quelque chose le long:
--- ./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
Vous pouvez donc voir ici les deux diffs vidés dans le terminal:
RealView_BASE_15560.py
contre RealView_LOCAL_15560.py
RealView_BASE_15560.py
contre RealView_REMOTE_15560.py
Si les diffs sont gros, je vais juste chercher avec mes superpuissances tmux .
Oui, vous perdez certains raccourcis fournis par vimdiff, mais en général, la résolution des conflits nécessite un copier-coller soigneux des deux versions, ce que je peux faire très bien dans une session vim normale avec les marqueurs de conflit git.
Observation et comparaison de fichiers pendant l' vimdiff
exécution
Avant de cirosantilli-mergetool
m'asseoir et d'automatiser ma configuration parfaite avec , c'est ce que je faisais pour obtenir les deux différences dont j'avais besoin.
Pendant l' git mergetool
exécution vimdiff
, s'il y a un conflit sur un fichier nommé, disons main.py
, git génère des fichiers pour chacune des versions, nommés comme:
main_BASE_1367.py
main_LOCAL_1367.py
main_REMOTE_1367.py
dans le même répertoire que main.py
où se 1367
trouve le PID de git mergetool, et donc un entier "aléatoire", comme mentionné à: Dans un conflit de fusion git, quels sont les fichiers BACKUP, BASE, LOCAL et REMOTE générés?
Donc, pour voir les diffs que je veux, je trouve d'abord les fichiers générés avec git status
, puis j'ouvre de nouveaux terminaux et je fais un vimdiff entre les paires de fichiers qui me tiennent à cœur:
vim -d main_BASE_1367.py main_LOCAL_1367.py
vim -d main_BASE_1367.py main_REMOTE_1367.py
Ensemble git mergetool
, ces informations aident BEAUCOUP à comprendre ce qui se passe rapidement!
De plus, même lorsque mergetool est en cours d'exécution, vous pouvez simplement ouvrir le fichier:
vim main.py
directement et éditez-le ici si vous pensez que ce sera plus facile avec une fenêtre d'éditeur plus grande.
Aller directement à fusionner les conflits
Alors que les ]c
sauts au prochain point de diff dans vimdiff, il n'y a pas toujours de conflit de fusion.
Pour vous aider, j'ai dans mon ~/.vimrc
:
# Git Merge conflict
nnoremap <leader>gm /\v^\<\<\<\<\<\<\< \|\=\=\=\=\=\=\=$\|\>\>\>\>\>\>\> /<cr>
qui trouve directement les conflits.
git imerge
Peut-être que la meilleure option est simplement de renoncer à utiliser vimdiff et de s'appuyer sur vim + git imerge régulier qui a été mentionné à: Comment puis-je savoir quels commits Git provoquent des conflits? puisque la courbe d'apprentissage de vimdiff est ennuyeuse et qu'elle ne fait pas les fonctions dont nous avons le plus besoin.