Comment puis-je prévisualiser une fusion dans git?

j'ai une branche git (la canalisation principale, par exemple) et je veux fusionner dans une autre branche de développement. Ou dois-je?

afin de décider si j'ai vraiment envie de fusionner cette branche, j'aimerais voir une sorte d'aperçu de ce que la fusion va faire. De préférence avec la possibilité de voir la liste des commits qui sont appliquées.

jusqu'à présent , le mieux que je puisse trouver est merge --no-ff --no-commit , puis diff HEAD .

301
demandé sur Eyal 2011-04-28 15:04:17
la source

10 ответов

j'ai trouvé que la solution la plus efficace pour moi est de juste effectuer la fusion et avorter si vous n'aimez pas les résultats . Cette syntaxe particulière me semble propre et simple. Si vous voulez vous assurer de ne pas gâcher votre branche actuelle, ou si vous n'êtes pas prêt à fusionner malgré l'existence de conflits, créez simplement une nouvelle sous-branche à partir de celle-ci et fusionnez cela.

stratégie 1: la voie sûre – fusionner une branche temporaire:

git checkout mybranch
git checkout -b mynew-temporary-branch
git merge some-other-branch

de cette façon, vous pouvez simplement jeter la branche temporaire si vous voulez juste voir ce que sont les conflits. Vous n'avez pas besoin de vous embêter à "avorter" la fusion, et vous pouvez retourner à votre travail -- simplement vérifier 'mybranch' à nouveau et vous n'aurez pas de code fusionné ou de conflits de fusion dans votre branche.

il s'agit en gros d'un dry-run.

stratégie 2: Quand vous voulez vraiment fusionner, mais seulement s'il n'y a pas de conflits

git checkout mybranch
git merge some-other-branch

si git signale des conflits (et seulement S'il y a conflits) vous pouvez alors faire:

git merge --abort

si la fusion est réussie, vous ne pouvez pas l'annuler (seulement réinitialiser).

si vous n'êtes pas prêt à fusionner, utilisez la méthode plus sûre ci-dessus.

[EDIT: 2016-Nov - j'ai troqué la stratégie de 1 pour 2, car il semble que la plupart des gens sont à la recherche de "la sécurité façon." La stratégie 2 est maintenant plus d'une note que vous pouvez simplement abandonner la fusion si la fusion a des conflits que vous n'êtes pas prêt à traiter. Gardez à l'esprit si la lecture des commentaires!]

194
répondu Kasapo 2016-11-10 03:31:45
la source
  • git log ..otherbranch
    • liste des changements qui seront fusionnés dans la Direction générale actuelle.
  • git diff ...otherbranch
    • différence entre l'ancêtre commun (base de fusion) et la tête de ce qui sera fusionné. notez les trois points , qui ont une signification particulière par rapport à deux points (Voir ci-dessous).
  • gitk ...otherbranch
    • représentation graphique des branches depuis leur fusion la dernière fois.

la chaîne vide implique HEAD , c'est pourquoi il suffit de ..otherbranch au lieu de HEAD..otherbranch .

les deux points vs. les trois points ont une signification légèrement différente pour diff que pour les commandes qui énumèrent les révisions (log, gitk etc.). Pour log et autres deux points ( a..b ) signifie Tout ce qui est dans b mais pas a et trois points ( a...b ) signifie tout ce qui est dans un seul a ou b . Mais diff fonctionne avec deux révisions et là le cas plus simple représenté par deux points ( a..b ) est la différence simple de a à b et trois points ( a...b ) différence moyenne entre l'ancêtre commun et b ( git diff $(git merge-base a b)..b ).

336
répondu Jan Hudec 2018-08-01 19:12:43
la source

si vous êtes comme moi, vous cherchez l'équivalent de svn update -n . La suite semble faire l'affaire. Notez que assurez-vous de faire un git fetch d'abord afin que votre repo local a les mises à jour appropriées pour comparer.

$ git fetch origin
$ git diff --name-status origin/master
D       TableAudit/Step0_DeleteOldFiles.sh
D       TableAudit/Step1_PopulateRawTableList.sh
A       manbuild/staff_companies.sql
M       update-all-slave-dbs.sh

ou si vous voulez une diff de votre tête à la télécommande:

$ git fetch origin
$ git diff origin/master

IMO cette solution est beaucoup plus facile et moins sujette aux erreurs (et donc beaucoup moins risquée) que le top solution qui propose "fusionner puis avorter".

15
répondu djschny 2018-08-03 14:08:41
la source

Si vous avez déjà récupéré les changements, mon préféré est:

git log [email protected]{u}

qui nécessite git 1.7.x je crois bien. La notation @{u} est un raccourci pour la branche amont donc un peu plus polyvalent que git log ...origin/master .

Note: Si vous utilisez zsh et la chose étendue glog dessus, vous avez probablement à faire quelque chose comme:

git log [email protected]\{u\}
6
répondu Pablo Olmos de Aguilera C. 2013-02-03 22:50:02
la source

en ajoutant aux réponses existantes, un alias pourrait être créé pour afficher la diff et/ou le log avant une fusion. Beaucoup de réponses omettent le fetch à faire en premier avant de "prévisualiser" la fusion; c'est un alias qui combine ces deux étapes en une seule (émuler quelque chose de similaire à mercurial hg incoming / outgoing )

donc, en se basant sur " git log ..otherbranch ", vous pouvez ajouter ce qui suit à ~/.gitconfig :

...
[alias]
    # fetch and show what would be merged (use option "-p" to see patch)
    incoming = "!git remote update -p; git log [email protected]{u}"

pour symmetry, l'alias suivant peut être utilisé pour montrer ce qui est commis et serait poussé, avant de pousser:

    # what would be pushed (currently committed)
    outgoing = log @{u}..

et alors vous pouvez lancer " git incoming " pour montrer beaucoup de changements, ou " git incoming -p "pour montrer le patch (i.e., la" diff"), " git incoming --pretty=oneline ", pour un résumé bref, etc. Vous pouvez alors (optionnellement) lancer " git pull " pour réellement fusionner. (Bien que, puisque vous avez déjà récupéré, la fusion pourrait être faite directement.)

de même, " git outgoing "montre ce que serait poussé si vous deviez exécuter" git push ".

6
répondu michael 2016-04-21 10:23:21
la source

git log currentbranch..otherbranch vous donnera la liste des commits qui vont aller dans la branche courante si vous faites une fusion. Les arguments habituels pour se connecter qui donnent des détails sur les commits vous donneront plus d'informations.

git diff currentbranch otherbranch vous donnera la différence entre les deux commits qui deviendront un. Ce sera une différence qui vous donne tout ce qui sera fusionné.

est-ce que ça aiderait?

3
répondu Noufal Ibrahim 2011-04-28 16:08:35
la source

a moins de réaliser la fusion de manière très discrète (voir la réponse de Kasapo), il ne semble pas y avoir de façon fiable de le voir.

cela dit, Voici une méthode qui se rapproche légèrement:

git log TARGET_BRANCH...SOURCE_BRANCH --cherry

cela donne une bonne indication de ce que commits fera dans la fusion. Pour voir diffs, ajouter -p . Pour voir les noms de fichiers, ajoutez l'un des --raw , --stat , --name-only , --name-status .

le problème avec l'approche git diff TARGET_BRANCH...SOURCE_BRANCH (voir la réponse de Jan Hudec) est que vous verrez des diffs pour les changements déjà dans votre branche cible si votre branche source contient des fusions croisées.

2
répondu antak 2016-04-19 08:00:07
la source

Pull Request - j'ai utilisé la plupart des idées déjà soumises, mais une que j'utilise aussi souvent est ( surtout si elle vient d'un autre dev ) faire une Pull Request qui donne un moyen pratique de passer en revue tous les changements dans une fusion avant qu'elle n'ait lieu. Je sais que C'est GitHub pas git mais c'est sûr que c'est pratique.

2
répondu G-Man 2017-04-06 16:11:21
la source

peut-être que ceci peut vous aider ? git-diff-tree - compare le contenu et le mode de blobs trouvés via deux objets de tree

1
répondu Chugaister 2011-04-28 15:12:00
la source

Je ne veux pas utiliser la commande de fusion git comme précurseur pour examiner des fichiers contradictoires. Je ne veux pas faire une fusion, je veux identifier les problèmes potentiels avant que je ne fusionne - des problèmes que l'auto-fusion pourrait me cacher. La solution que j'ai cherché est de savoir comment faire cracher par git une liste de fichiers qui ont été modifiés dans les deux branches qui seront fusionnés dans le futur, par rapport à un ancêtre commun. Une fois que j'ai cette liste, je peux utiliser d'autres outils de comparaison de fichiers pour repérer les choses plus loin. J'ai cherché plusieurs fois, et je n'ai toujours pas trouvé ce que je veux dans un natif commande git.

voici ma solution, au cas où cela aiderait quelqu'un d'autre là-bas:

Dans ce scénario, j'ai une branche appelée QA qui a beaucoup de changements depuis la dernière version de production. Notre dernière version de production est marquée avec "15.20.1". J'ai une autre branche de développement appelée new_stuff que je veux fusionner dans la branche QA. Les deux QA et new_stuff point s'engage à ce que "suivre" (tel que rapporté par gitk) le 15.20.1 tag.

git checkout QA
git pull
git diff 15.20.1 --name-only > QA_files
git checkout new_stuff
git pull
git diff 15.20.1 --name-only > new_stuff_files
comm -12 QA_files new_stuff_files

voici quelques discussions qui m'ont fait comprendre pourquoi je suis intéressé à cibler ces fichiers spécifiques:

Comment faire confiance à git merge?

https://softwareengineering.stackexchange.com/questions/199780/how-far-do-you-trust-automerge

0
répondu Laura 2017-05-23 14:47:29
la source

Autres questions sur git git-merge