228 votes

Comment tester une fusion sans la réaliser au préalable ?

Existe-t-il un moyen de simuler un git merge entre deux branches, la branche de travail actuelle et le master, mais sans faire de changements ?

J'ai souvent des conflits quand je dois faire un git merge . Existe-t-il un moyen de simuler d'abord la fusion ?

2 votes

194voto

Amber Points 159296

Vous pouvez utiliser git merge --no-commit pour empêcher la fusion d'être effectivement engagée, et si vous n'aimez pas la façon dont la fusion se déroule, il suffit de revenir à la tête originale.

Si vous ne voulez absolument pas finaliser la fusion, même s'il s'agit d'une avance rapide (et donc sans conflit, par définition), vous pouvez ajouter --no-ff également.

1 votes

Je ne pense pas que git merge --abort existe - peut-être voulez-vous dire git reset --merge ?

1 votes

Non, j'ai juste oublié que contrairement à rebase il n'y a pas de --abort para git merge .

11 votes

Je mettrais --no-ff aussi. Pour éviter qu'une fusion ne se produise.

178voto

Mark Longair Points 93104

Je ne pense pas qu'il soit possible de simuler ce qui va se passer avant d'avoir essayé la fusion. Toutefois, si vous vous assurez que la sortie de git status est vide avant de faire la fusion, il est tout à fait sûr d'aller de l'avant et de l'essayer. Si vous rencontrez des conflits, vous pouvez immédiatement revenir à l'état dans lequel vous étiez avant avec :

git reset --merge

Depuis git 1.7.4, vous pouvez également interrompre la fusion en faisant :

git merge --abort

(Comme Le message de validation qui a ajouté cette option explique ce point a été ajouté par souci de cohérence avec git rebase --abort et ainsi de suite).

5 votes

La réponse de @Amber répond exactement à la question "Comment simuler la fusion". --no-commit est beaucoup plus facile à mon avis

21 votes

@samirahmed : @Amber a répondu à la question plus littéralement, bien sûr, bien qu'avec --no-commit tu changes quand même l'index et l'arbre de travail, ce qui n'est pas exactement "sans faire de changement" :) Ce que je veux dire, c'est que lorsque les gens posent ce genre de question, c'est généralement parce qu'ils ne sont pas conscients que la meilleure façon de voir comment se déroulerait une fusion est de juste essayez la fusion souvent parce qu'ils ne savent pas qu'il est facile de revenir à l'état antérieur en cas de problème.

2 votes

Je ne sais pas si cela a été ajouté dans une version plus récente de git, mais dans la docs (1.8.4) il est indiqué " git merge --abort est équivalent à git reset --merge cuando MERGE_HEAD est présent", ce qui est plus facile à retenir :)

140voto

Ian Points 152

Si je veux comparer les changements sur une branche topic à master, je trouve que le plus simple et le plus sûr est de faire ce qui suit :

git checkout master
git checkout -b trial_merge
git merge topic_branch

Après avoir terminé la fusion, il est facile de voir le changement consolidé de master

git diff master

Lorsque cela est fait, il suffit de supprimer la branche trial_merge

git checkout master
git branch -D trial_merge

De cette façon, la branche principale ne change jamais.

8 votes

Vous pouvez également faire git checkout --detach et testez tout ce que vous voulez. Plus tard, si vous voulez garder vos changements, faites git checkout -b new_branch . Et si vous voulez jeter vos changements, vérifiez n'importe quelle branche que vous voulez ( git checkout master ).

0 votes

Si topic_branch est énorme (comme c'est probablement le cas si vous êtes à l'origine de cette question), l'option diff master est probablement trop grande pour que vous puissiez voir si une fusion va causer des conflits.

1 votes

J'aime beaucoup ce système... sûr et simple.

15voto

kolypto Points 3161

Voici la solution que j'ai trouvée : git merge-tree fait la fusion "en mémoire" et imprime la différence sans toucher à votre répertoire de travail. Vous pouvez même tester une branche sans la vérifier.

Obtenir le différentiel de fusion

Tout d'abord, faites ceci pour vous assurer que votre référentiel connaît toutes les branches distantes :

$ git fetch --all

Maintenant, utilisez cet extrait de bash pour voir comment se branchez $branch serait fusionner en $master :

$ branch='feature'
$ git merge-tree $(git merge-base $branch master) master $branch

Aucune modification n'est apportée à votre répertoire de travail ou à votre index. Il s'agit d'un fusion à sec .

Récupérer les informations de la sortie

La sortie est un différentiel. Dans le cas où la branche a été fusionnée, il sera vide.

Pour savoir s'il y a des conflits, il faut rechercher <<< :

$ git merge-tree $(git merge-base $branch master) master $branch | fgrep '<<<'

Pour extraire les différences de conflit, utiliser sed pour extraire des lignes entre <<< y >>> :

$ git merge-tree $(git merge-base $branch master) master $branch | \
  sed -ne '/^\+<<</,/^\+>>>/ p'

Caractéristiques

  • Le diff sera vide si une branche est déjà fusionnée.
  • Utilisez grep/sed pour extraire des informations sur les conflits
  • Utilice origin/feature pour tester des branches avec lesquelles vous n'avez jamais travaillé
  • Peut être utilisé pour voir comment 2 branches ont divergé

Ajoutez-le à vos favoris

Obtenir le différentiel de la fusion :

git config --global alias.mergediff '!f(){ branch="$1" ; into="$2" ; git merge-tree $(git merge-base "$branch" "$into") "$into" "$branch" ; };f '

Utilisation :

$ git mergediff <feature-branch> <merge-into>
$ git mergediff feature master

Obtenir des conflits de fusion :

git config --global alias.mergetest '!f(){ git mergediff $@ | sed -ne "/^+<</,/^+>>/ p" ; };f '

Utilisation :

$ git mergetest <feature-branch> <merge-into>
$ git mergetest feature master

7voto

Mohan S Nayaka Points 177

Pourquoi ne pas simplement créer une branche jetable (git checkout -b), et y faire une fusion de test ?

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