Aide ABDiff

Workflows Git diff et merge

Git effectue des différences, des fusions et des rebases à l’aide de ses propres algorithmes internes. Ces opérations sont déterministes et entièrement automatisées : Git ne s’appuie jamais sur des outils externes.

Cependant, il y a des situations où le jugement humain est nécessaire. Par exemple, lorsque les changements doivent être évalués visuellement ou sémantiquement plutôt que textuellement. Dans ces cas, Git peut invoquer des outils externes pour aider à l’inspection, et non à la prise de décision.

Un exemple courant sur macOS est FileMerge.app, qui est installé avec les outils de ligne de commande Xcode et peut être lancé par Git en tant qu’aide diff ou merge.

Merge

Lorsque Git fusionne les branches et ne peut pas rapprocher les modifications, il écrit des marqueurs de conflit dans chaque fichier en conflit, puis arrête la fusion et avertit l’utilisateur. Pour chaque fichier avec des marqueurs de conflit, trois étapes sont enregistrées dans l’index Git : commun le nôtre et le leur. À ce stade, le référentiel est dans un état de fusion conflictuel et Git attend que tous les conflits soient résolus.

Étant donné un fichier conflictuel File.swift, les fichiers générés

Pour résoudre le conflit manuellement modifiez le fichier :

  1. Ouvrez le fichier dans un éditeur et supprimez les marqueurs de conflit.
  2. Mise en scène du fichier résolu avec git add.

Pour résoudre le conflit dans un outil externe exécutez :

git mergetool

git mergetool lance l’outil une fois pour chaque fichier en conflit, en passant la BASE, le nôtre, le leur et fusionner les chemins de résultat à l’outil. Git attend que l’outil se désort avant de lancer le fichier suivant. Le code de sortie de l’application pour chaque fichier détermine si le fichier est marqué comme résolu ou non. Vous avez également la possibilité d’exécuter explicitement git add <file> pour le marquer comme mis en scène.

S’il y a plusieurs outils de fusion configurés, Git choisit le premier trouvé dans cette liste :

  1. merge.tool configuration.
  2. $GIT_MERGE_TOOL variable d’environnement.
  3. Détection automatique à partir d’outils installés connus.

Invocation de l’outil externe

Pour chaque fichier en conflit Example.swift Git crée des fichiers supplémentaires vus ici :

Example_BACKUP_70842.swift
Example_BASE_70842.swift
Example_LOCAL_70842.swift
Example_REMOTE_70842.swift
Example.swift

Le nombre de suffixe change pour chaque invocation. Ensuite, il invoque l’outil avec une commande configurée comme nous l’avons vu dans Intégration Git. Pour abd, la commande est

abd --base Example_BASE_70842.swift --local Example_LOCAL_70842.swift --remote Example_REMOTE_70842.swift --result Example.swift

L’outil est censé supprimer les marqueurs de conflit et sortir normalement. Cela indique que le conflit a été résolu.

Diff

Pour diffing, les outils externes ne sont utiles que pour l’inspection visuelle. Git ignore le code de retour lorsque l’application quitte. Si vous invoquez git difftool, Git énumérera les fichiers modifiés et lancera l’outil externe pour chaque paire de fichiers.

Habituellement, il est préférable de simplement faire glisser et déposer les fichiers que vous souhaitez comparer. Mais si vous préférez tout comparer, exécutez git difftool. L’outil externe invoqué est le premier trouvé dans cette liste :

  1. diff.tool configuration.
  2. $GIT_DIFF_TOOL variable d’environnement.
  3. Détection automatique à partir d’outils connus dans $PATH.
  4. Retour à vimdiff.