Comment tester une fusion sans réellement fusionner au préalable

166

Existe-t-il un moyen de simuler un git mergeentre deux branches, la branche de travail actuelle et le maître, mais sans apporter de modifications?

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

dole doug
la source
2
voir aussi stackoverflow.com/questions/501407/…
Andre Holzner
1
Possible duplication de Y a
the Tin Man

Réponses:

132

Je ne pense pas qu'il existe un moyen de simuler ce qui se passera jusqu'à ce que vous essayiez la fusion. Cependant, si vous vous assurez que la sortie de git statusest vide avant de procéder à la fusion, il est tout à fait sûr de continuer et de l'essayer. Si vous rencontrez des conflits, vous pouvez immédiatement revenir à l'état dans lequel vous étiez auparavant avec:

git reset --merge

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

git merge --abort

(Comme l' explique le message de validation qui a ajouté cette option , cela a été ajouté par souci de cohérence avec git rebase --abortet ainsi de suite.)

Mark Longair
la source
4
La réponse de @ Amber répond exactement à ce qui est demandé «comment simuler la fusion». l'utilisation --no-commitest beaucoup plus facile à mon avis
samirahmed
14
@samirahmed: @Amber a répondu à la question plus littéralement, bien sûr, même si --no-commitvous changez toujours l'index et l'arbre de travail, ce qui n'est pas exactement "sans faire de changements" :) Mon point est que lorsque les gens demandent ce genre de question, c'est généralement parce qu'ils ne sont pas conscients que la meilleure façon de voir comment une fusion se déroulerait est simplement d' essayer la fusion , souvent parce qu'ils ne savent pas à quel point il est facile de revenir à l'état dans lequel ils se trouvaient auparavant. s'il s'est avéré qu'il y avait des problèmes.
Mark Longair
2
Je ne sais pas si cela a été ajouté dans une version plus récente de git, mais dans la documentation (1.8.4), il indique " git merge --abortéquivaut à git reset --mergequand MERGE_HEADest présent", donc ce qui est plus facile à retenir :)
Samuel Meacham
@SamuelMeacham: merci de l'avoir signalé - il a été introduit dans la 1.7.4. J'ai mis à jour la réponse avec cela. Merci!
Mark Longair
Cette suggestion n'a rien fait pour moi, sur git 1.9.4.
djangofan
137

Vous pouvez utiliser git merge --no-commitpour empêcher la fusion d'être réellement validée, et si vous n'aimez pas le fonctionnement de la fusion, réinitialisez simplement la tête d'origine.

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

ambre
la source
Je ne pense pas que cela git merge --abortexiste - peut-être voulez-vous dire git reset --merge?
Mark Longair
Non, j'ai juste oublié que contrairement à rebaseil n'y a pas de --abortpour git merge.
Amber
7
Je jetterais --no-fftrop. Pour empêcher une fusion ff.
Andy le
1
@ Andy's --no-ffest à peu près obligatoire ici, car cela --no-commitn'arrête pas les changements rapides.
jackr
1
@Anant Anand Gupta - c'est une bonne astuce mais ça devrait être: git config --global alias.tm "merge --no-commit --no-ff"
pasx
109

Si je veux comparer les changements sur une branche de sujet à master, je trouve qu'il est plus simple et plus sûr de faire ce qui suit:

git checkout master
git checkout -b trial_merge
git merge topic_branch

Une fois la fusion terminée, il est facile de voir le changement consolidé du maître

git diff master

Une fois terminé, supprimez simplement la branche trial_merge

git checkout master
git branch -D trial_merge

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

Ian
la source
4
Vous pouvez également faire git checkout --detachet tester tout ce que vous voulez. Plus tard, si vous souhaitez conserver vos modifications, faites-le git checkout -b new_branch. Et si vous souhaitez annuler vos modifications, extrayez la branche de votre choix ( git checkout master).
Shayan Toqraee
Si topic_branchest énorme (comme c'est probablement le cas si vous êtes à cette question en premier lieu), la diff mastersortie est probablement trop grande pour que vous puissiez regarder si une fusion va provoquer des conflits.
Crescent Fresh
J'aime vraiment beaucoup ça ... sûr et simple.
leo
4

J'utilise :

git merge --ff-only

selon documentation :

Refusez de fusionner et de quitter avec un statut différent de zéro à moins que le HEAD actuel ne soit déjà à jour ou que la fusion puisse être résolue en avance rapide.

Ce n'est pas vraiment une simulation car il y aura une fusion rapide en cas d'absence de conflit entre les deux branches. Mais en cas de conflit, vous serez informé et rien ne se passera.

Ortomala Lokni
la source
4

J'ai pu utiliser git merge --abort, récemment. Cependant, cela ne peut être utilisé qu'en cas de conflit de fusion. Si vous êtes sûr de ne pas vouloir vous engager, utilisez les autres méthodes mentionnées ci-dessus.

haricot5
la source
1
Quelles autres méthodes mentionnées ci-dessus? Ils mentionnent tous git merge --abort. Vous devriez prouver votre réponse à l'avenir en précisant qui a rédigé la réponse à laquelle vous faites référence.
Michael Fulton
3

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

Mohan S Nayaka
la source
1
Ce que vous suggérez est en fait la réponse de Ian exprimée de manière laconique :)
tzot
0

Je ne sais pas exactement si c'est votre cas , mais votre question me rappelle que parfois je lance une fonctionnalité, je m'engage au fil des jours et je fusionne le développement dessus plusieurs fois.

Sur ce point, je perds le contrôle sur les fichiers exacts que j'ai modifiés et je ne le saurai que lorsque ma fonctionnalité sera fermée et que mon code sera développé.

Dans ce cas, un bon moyen de savoir quelles modifications vous avez apportées (pas d'autres des fusions) utilise Sourcetree.

Vous devez cliquer avec le bouton droit sur la branche de base et sélectionner Diff Against Current:

Fonctionnalité de Sourcetree pour connaître les différences entre deux branches

Puis sourcetree vous montrera toutes les modifications qui seront fusionnées si vous fusionnez votre branche dans la branche de base.

Résultats

Bien sûr, il ne vous montrera pas les conflits, mais c'est un outil utile dans les fusions.

Lucas Amorim Silva
la source