98 votes

Fusion interactive Git ?

J'ai deux branches avec exactement le même fichier (au cas où vous vous poseriez la question, il s'agit d'un fichier .sql) et je veux le fusionner de manière interactive.

En gros, je veux ouvrir un programme de différences comme je le fais quand il y a un conflit (ou une ligne de commande) et sélectionner exactement quelles lignes vont où.

Y a-t-il un moyen de le faire ?

93voto

Novelocrat Points 12126

Oui, mais ce sera surtout en le faisant manuellement. Vous direz à Git que vous fusionnez les deux branches concernées, mais qu'il ne doit pas essayer de commiter le résultat par lui-même, ( édité pour ajouter : ni l'avance rapide s'il pense que la fusion est triviale) :

git merge --no-commit --no-ff branch-to-merge

Ensuite, vous demanderez à git le fichier tel qu'il est apparu dans les deux branches :

git show HEAD:filename >filename.HEAD
git show branch-to-merge:filename >filename.branch

et leur base de fusion,

git show `git merge-base HEAD branch-to-merge`:filename  >filename.base

Vous les fusionnerez en utilisant l'outil de votre choix (par exemple)

meld filename.{HEAD,branch,base}

vous pourrez constater que ( git add filename ), puis de valider la fusion ( git commit ).

46voto

taj Points 1

Depuis la branche dans laquelle vous voulez fusionner :

git checkout -p branch_to_merge --

Cela ne vérifiera pas la branche_to_merge, mais vous permettra d'ajouter de manière interactive des morceaux du patch (diff).

http://git-scm.com/docs/git-checkout

45voto

Brad O Points 131

Le moyen le plus simple est de faire git merge <other_branch puis git mergetool pour résoudre graphiquement les conflits. Voir #10935226 pour savoir comment configurer mergetool.

Le problème est que votre fichier modifié peut fusionner en accéléré avec l'ancien. Alors vous devez devenir un peu plus intelligent.

Novelocrat offre un excellent moyen de creuser un peu plus, mais vous devrez souvent modifier la commande initiale en git merge --no-commit --no-ff <other_branch> parce que --no-commit signifie vraiment "Ne pas commiter la fusion... sauf si c'est une fusion rapide". C'est un peu un piège pour beaucoup de gens qui essaient de faire exactement ce que vous voulez.

Parfois, la méthode la moins confuse n'est pas très élégante : vérifiez l'autre branche dans une copie de travail différente, utilisez votre outil de fusion préféré pour obtenir la version que vous voulez dans le répertoire que vous voulez, puis livrez-la.

39voto

Hugh Points 561

Selon ce gist, où temp pourrait être une branche existante.

https://gist.github.com/katylava/564416


Sur le maître :

git checkout -b temp

Sur temp :

git merge --no-commit --no-ff refactor

qui met tout en scène, donc :

git reset HEAD

Commencez ensuite à ajouter les pièces que vous voulez :

git add --interactive

0voto

John Fisher Points 13621

Vous pourriez simplement utiliser WinMerge , DiffMerge ou tout autre outil de comparaison/fusion disponible pour effectuer le travail manuellement. Si vous voulez le connecter à "git difftool", vous pouvez chercher en ligne pour trouver des moyens de faire fonctionner ces outils avec git.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X