J'ai une branche git (la ligne principale, par exemple) et je veux fusionner dans une autre branche de développement. Ou alors?
Afin de décider si je veux vraiment fusionner cette branche, je voudrais voir une sorte d'aperçu de ce que la fusion fera. De préférence avec la possibilité de voir la liste des commits appliqués.
Jusqu'à présent, le mieux que je puisse trouver est merge --no-ff --no-commit
, et puis diff HEAD
.
git merge
etgit reset --keep HEAD@{1}
si je n'aime pas le résultat.git reset --keep HEAD@{1}
retourné l'fatal: Cannot do a keep reset in the middle of a merge.
aide?--preview
option dans git-merge?Réponses:
J'ai trouvé que la solution qui me convenait le mieux était de simplement effectuer la fusion et de l'annuler en cas de conflit . Cette syntaxe particulière me semble propre et simple. Il s'agit de la stratégie 2 ci-dessous.
Cependant, si vous voulez vous assurer de ne pas gâcher votre branche actuelle, ou si vous n'êtes tout simplement pas prêt à fusionner indépendamment de l'existence de conflits, créez simplement une nouvelle sous-branche et fusionnez-la:
Stratégie 1: La manière sûre - fusionner une branche temporaire:
De cette façon, vous pouvez simplement supprimer la branche temporaire si vous voulez simplement voir quels sont les conflits. Vous n'avez pas à vous soucier d '«abandonner» la fusion, et vous pouvez retourner à votre travail - il vous suffit de retirer à nouveau «mybranch» et vous n'aurez aucun code fusionné ni conflit de fusion dans votre branche.
Il s'agit essentiellement d'un essai à sec.
Stratégie 2: quand vous voulez vraiment fusionner, mais seulement s'il n'y a pas de conflits
Si git signale des conflits (et UNIQUEMENT EN CAS DE CONFLIT ), vous pouvez alors:
Si la fusion réussit, 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 échangé la stratégie 1 pour 2, car il semble que la plupart des gens recherchent «la manière sûre». La stratégie 2 est désormais plus une note que vous pouvez simplement annuler la fusion si la fusion a des conflits que vous n'êtes pas prêt à traiter. Gardez à l'esprit si vous lisez des commentaires!]
la source
git merge --no-ff --no-commit
si vous ne souhaitez pas valider directement les modifications. Cela élimine le "besoin" d'une branche différente, ce qui facilite un peu plus la révision des modifications, imo.git merge --no-ff --no-commit
? Je suppose que vous pouvez toujours faire ungit merge --abort
après cela si vous n'aimez pas ce que vous voyez? Même si la fusion ne produit pas de conflits?git reset --hard HEAD
, puis extraire une autre branchegit checkout <different branch name>
et supprimer la branche temporairegit delete -b <name of temporary branch>
.git log ..otherbranch
git diff ...otherbranch
gitk ...otherbranch
Une chaîne vide implique
HEAD
, c'est pourquoi juste..otherbranch
au lieu deHEAD..otherbranch
.Les deux contre trois points ont une signification légèrement différente pour diff que pour les commandes qui listent les révisions (log, gitk etc.). Pour log et autres, deux points (
a..b
) signifient tout ce qui est dansb
mais pasa
et trois points (a...b
) signifient tout ce qui est dans un seula
oub
. Mais diff fonctionne avec deux révisions et là le cas le plus simple représenté par deux points (a..b
) est la différence simple dea
àb
et trois points (a...b
) différence moyenne entre ancêtre commun etb
(git diff $(git merge-base a b)..b
).la source
git checkout master
avant d'essayer. Je me demandais pourquoi cela disait que tous mes changements allaient êtregit show ..otherbranch
affichera une liste des modifications et des différences qui seront fusionnées dans la branche actuelle.Si vous êtes comme moi, vous cherchez l'équivalent de
svn update -n
. Ce qui suit semble faire l'affaire. Notez que assurez-vous de faire unegit fetch
première afin que votre référentiel local dispose des mises à jour appropriées pour comparer.ou si vous voulez un diff de votre tête à la télécommande:
IMO cette solution est beaucoup plus facile et moins sujette aux erreurs (et donc beaucoup moins risquée) que la solution haut de gamme qui propose de "fusionner puis abandonner".
la source
$ git checkout target-branch
et ensuite$ git diff --name-status ...branch-to-be-merged
(trois points sont essentiels, alors saisissez-les telsLa plupart des réponses ici nécessitent soit un répertoire de travail propre et plusieurs étapes interactives (mauvaises pour les scripts), soit ne fonctionnent pas dans tous les cas, par exemple les fusions passées qui apportent déjà certaines des modifications en suspens dans votre branche cible, ou des sélections faisant le même.
Pour vraiment voir ce qui changerait dans la
master
branche si vous y fusionniez,develop
en ce moment:- https://git.seveas.net/previewing-a-merge-result.html
(merci à David Normington pour le lien)
PS:
Si vous obtenez des conflits de fusion, ils s'afficheront avec les marqueurs de conflit habituels dans la sortie, par exemple:
L'utilisateur @dreftymac fait valoir un bon argument: cela le rend impropre à l'écriture de scripts, car vous ne pouvez pas facilement saisir cela dans le code d'état. Les marqueurs de conflit peuvent être très différents selon les circonstances (supprimés vs modifiés, etc.), ce qui rend également difficile la grep. Il faut se méfier.
la source
true
s'il y a des conflits etfalse
s'il n'y a pas de conflits (par exemple, une valeur booléenne qui ne nécessite pas le test du "globe oculaire" ou toute intervention humaine).git merge-tree ... | grep -q '^[a-z].*in both$' && echo conflict || echo safe to merge
mais c'est finnicky; J'oublie probablement un cas. peut-être voulez-vous plutôt vérifier les marqueurs de conflit? Par exemple, cela n'attrape probablement pas les conflits de style «le leur a été supprimé, le nôtre a changé». (Je viens de vérifier et cela ne montre même pas de marqueurs de conflit, donc vous avez besoin d'une expression méticuleuse pour être en sécurité ici)less -R
pour gérer la sortie colorée sans modifier votre configuration.Si vous avez déjà récupéré les modifications, mon préféré est:
Cela nécessite cependant git 1.7.x. La
@{u}
notation est un "raccourci" pour la branche en amont, donc c'est un peu plus polyvalent quegit log ...origin/master
.Remarque: Si vous utilisez zsh et la fonction glog étendue, vous devrez probablement faire quelque chose comme:
la source
En plus des réponses existantes, un alias pourrait être créé pour afficher le diff et / ou le journal avant une fusion. De nombreuses réponses omettent la tâche
fetch
à effectuer avant de "prévisualiser" la fusion; il s'agit d'un alias qui combine ces deux étapes en une (émulant quelque chose de similaire àhg incoming
/ de mercurialoutgoing
)Donc, en vous appuyant sur "
git log ..otherbranch
", vous pouvez ajouter ce qui suit à~/.gitconfig
:Pour la symétrie, l'alias suivant peut être utilisé pour montrer ce qui est validé et serait poussé, avant de pousser:
Et puis vous pouvez exécuter "
git incoming
" pour afficher un grand nombre de modifications, ou "git incoming -p
" pour afficher le correctif (c'est-à-dire le "diff"), "git incoming --pretty=oneline
", pour un résumé concis, etc. Vous pouvez ensuite (facultativement) exécuter "git pull
" pour fusionnent réellement. (Cependant, puisque vous avez déjà récupéré, la fusion peut être effectuée directement.)De même, "
git outgoing
" montre ce qui serait poussé si vous exécutiez "git push
".la source
git log currentbranch..otherbranch
vous donnera la liste des commits qui iront dans la branche courante si vous faites une fusion. Les arguments habituels pour vous 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 un diff qui vous donnera tout ce qui sera fusionné.Est-ce que cela aiderait?
la source
git log otherbranch..currentbranch
donne la liste des commits sur currentbranch . Lagit diff otherbranch currentbranch
donne vous diff de la version à fusionner à la pointe actuelle, qui est à peu près aussi inutile que possible, car ce que vous voulez est différent de la base de fusion à la tête de fusion.Pull Request - J'ai utilisé la plupart des idées déjà soumises, mais celle que j'utilise aussi souvent est (surtout si elle provient d'un autre développeur) de faire une Pull Request qui donne un moyen pratique de revoir toutes les modifications d'une fusion avant qu'elle ne prenne endroit. Je sais que GitHub n'est pas git, mais c'est certainement pratique.
la source
À moins d'effectuer réellement la fusion de manière jetable (voir la réponse de Kasapo), il ne semble pas y avoir de moyen fiable de voir cela.
Cela dit, voici une méthode qui se rapproche légèrement:
Cela donne une indication juste des validations qui feront la fusion. Pour voir les différences, ajoutez
-p
. Pour voir les noms de fichiers, ajouter l' un--raw
,--stat
,--name-only
,--name-status
.Le problème avec l'
git diff TARGET_BRANCH...SOURCE_BRANCH
approche (voir la réponse de Jan Hudec) est que vous verrez des différences pour les changements déjà dans votre branche cible si votre branche source contient des fusions croisées.la source
Peut-être que cela peut vous aider ? git-diff-tree - Compare le contenu et le mode des blobs trouvés via deux objets d'arbre
la source
Je ne veux pas utiliser la commande git merge comme précurseur de l'examen des fichiers en conflit. Je ne veux pas faire de fusion, je veux identifier les problèmes potentiels avant de fusionner - des problèmes que la fusion automatique pourrait me cacher. La solution que je cherchais est de savoir comment avoir git cracher une liste de fichiers qui ont été modifiés dans les deux branches qui seront fusionnés à l'avenir, par rapport à un ancêtre commun. Une fois que j'ai cette liste, je peux utiliser d'autres outils de comparaison de fichiers pour explorer plus loin les choses. J'ai cherché plusieurs fois et je n'ai toujours pas trouvé ce que je veux dans une commande native git.
Voici ma solution de contournement, au cas où cela aiderait quelqu'un d'autre là-bas:
Dans ce scénario, j'ai une branche appelée QA qui comporte de nombreux changements depuis la dernière version de production. Notre dernière version de production est étiquetée "15.20.1". J'ai une autre branche de développement appelée new_stuff que je veux fusionner avec la branche QA. QA et new_stuff pointent tous les deux sur les commits qui "suivent" (comme rapporté par gitk) la balise 15.20.1.
Voici quelques discussions qui expliquent pourquoi je souhaite cibler ces fichiers spécifiques:
Comment puis-je faire confiance à Git Merge?
/software/199780/how-far-do-you-trust-automerge
la source