Y a-t-il une option git-merge --dry-run?

je fusionne dans une branche éloignée qui peut avoir beaucoup de conflits. Comment savoir s'il y aura des conflits ou non?

Je ne vois rien comme un --dry-run sur git-merge .

594
demandé sur Mahmoud Adam 2009-02-01 22:18:26

13 réponses

comme noté précédemment, passer dans le drapeau --no-commit , mais pour éviter une propagation rapide, aussi passer dans --no-ff , comme suit:

$ git merge --no-commit --no-ff $BRANCH

afin D'examiner la mise en scène change:

$ git diff --cached

et vous pouvez annuler la fusion, même s'il s'agit d'une fusion rapide:

$ git merge --abort
650
répondu mipadi 2017-12-01 10:17:22

j'ai juste dû implémenter une méthode qui détecte automatiquement les conflits entre un dépôt et sa télécommande. Cette solution fait la fusion en mémoire pour ne pas toucher l'index, ni l'arbre de travail. Je pense que c'est la façon la plus sûre de résoudre ce problème. Voici comment cela fonctionne:

  1. aller Chercher la télécommande de votre référentiel. Exemple: git fetch origin master
  2. Run git merge-base: git merge-base FETCH_HEAD master
  3. Exécuter git merge-tree: git merge-tree mergebase master FETCH_HEAD ( mergebase est l'id hexadécimal qui fusionne-base imprimé dans l'étape précédente)

supposons maintenant que vous voulez fusionner le maître distant avec votre maître local, mais vous pouvez utiliser n'importe quelles branches. git merge-tree exécutera la fusion en mémoire et imprimera le résultat à la sortie standard. Grep pour le motif << ou >> . Ou vous pouvez imprimer la sortie dans un fichier et vérifier cela. Si vous trouvez une ligne en commençant par "changé dans les deux", il y aura très probablement un conflit.

200
répondu akostajti 2015-01-29 21:50:35

ma solution simple de force brute à ceci est:

1: Créer une branche pré-master (à partir de master of course)

2: fusionner toutes les choses que vous voulez faire à ce pré-maître

alors vous pouvez voir comment la fusion s'est produite sans toucher maître alors.

3a: fusionner le pré-master en master ou

3b: fusionner toutes les branches de wannabe-libérés dans le maître

De Toute Façon Je suivrait @orange80 conseillerait.

45
répondu hades 2015-03-04 10:58:25

annuler une fusion avec git est si facile que vous ne devriez même pas vous soucier de la course à sec:

$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world

éditer: comme noté dans les commentaires ci-dessous, si vous avez des changements dans votre répertoire de travail ou de la zone de transit, vous aurez probablement envie de les cacher avant de faire le ci-dessus (sinon ils disparaîtront après le git reset ci-dessus)

43
répondu Brian Phillips 2015-01-15 20:16:59

j'ai fait un alias pour faire ceci et fonctionne comme un charme, je fais ceci:

 git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff ""; git merge --abort; echo "Merge aborted"; };f '

maintenant je viens d'appeler

git mergetest <branchname>

Pour savoir s'il y a des conflits.

30
répondu Okonomiyaki3000 2014-04-18 06:10:08

il suffit de faire la différence entre votre branche actuelle et la branche distante, cela vous indiquera ce qui va changer lorsque vous faites une pull/merge.

#see diff between current master and remote branch
git diff master origin/master
24
répondu timh 2010-12-10 03:31:39

j'utilise la commande request-pull git pour cela. Il vous permet de voir chaque changement qui se produirait lors de la fusion, mais sans rien faire sur vos dépôts locaux ou distants .

par exemple, imaginez que vous voulez fusionner une branche nommée "feature-x" dans votre branche principale

git request-pull master origin feature-x

vous montrera un résumé de ce qui se passerait (sans rien faire):

The following changes since commit fc01dde318:
    Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
    http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
    Adding some layout
    Refactoring
ioserver.js            |   8 +++---
package.json           |   7 +++++-
server.js              |   4 +--
layout/ldkdsd.js       | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js

si vous ajoutez le paramètre -p , vous obtiendrez aussi le texte complet du correctif, exactement comme si vous faisiez une différence de git sur chaque fichier modifié.

17
répondu ArnaudR 2015-06-26 10:24:45

je suis surpris que personne n'ait encore suggéré d'utiliser les patches.

dites que vous voulez tester une fusion de your_branch en master (je suppose que vous avez master vérifié):

$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch

ça devrait faire l'affaire.

si vous avez des erreurs comme

error: patch failed: test.txt:1
error: test.txt: patch does not apply

cela signifie que le patch n'a pas réussi et qu'une fusion produirait des conflits. Aucune sortie signifie que le patch est propre et vous pourriez facilement fusionner la branche


notez que ceci va et non changer réellement votre arbre de travail (en plus de créer le fichier patch bien sûr, mais vous pouvez le supprimer en toute sécurité par la suite). De la documentation git-apply:

--check
    Instead of applying the patch, see if the patch is applicable to the
    current working tree and/or the index file and detects errors. Turns
    off "apply".

Note à quiconque est plus intelligent/plus expérimenté avec git que moi: s'il vous plaît ne me faire savoir si je me trompe ici et cette méthode ne montre un comportement différent qu'une simple fusion. Il semble étrange qu'au cours des huit années que cette question ait existé, personne ne suggère cette solution apparemment évidente.

15
répondu HackerCow 2017-09-14 06:32:59

cela pourrait être intéressant: de la documentation:

si vous avez essayé une fusion qui a entraîné des conflits complexes et que vous voulez recommencer, vous pouvez récupérer avec git merge -- abort .

mais vous pourriez aussi le faire de la manière naïve (mais lente):

rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)

(Note: cela ne marchera pas seulement cloner vers /tmp, vous aurez besoin d'une copie, afin d'être sûr que les changements non engagés ne seront pas en conflit).

7
répondu 2013-12-17 03:00:21

je sais que c'est une vieille question, mais c'est la première à apparaître sur une recherche Google.

Git a introduit une option --ff-only lors de la fusion.

de: http://git-scm.com/docs/git-merge


--ff-uniquement

refuser de fusionner et de sortir avec un statut non-zéro à moins que le current HEAD est déjà à jour ou la fusion peut être résolue rapidement.

faire ceci va tenter de fusionner et fast-forward, et s'il ne peut pas il annule et vous incite que le fast-forward ne pouvait pas être effectué, mais laisse votre branche de travail intacte. S'il peut accélérer, alors il effectuera la fusion sur votre branche de travail. Cette option est également disponible sur git pull . Ainsi, vous pourriez faire ce qui suit:

git pull --ff-only origin branchA #See if you can pull down and merge branchA

git merge --ff-only branchA branchB #See if you can merge branchA into branchB
7
répondu Jason McKindly 2015-06-11 20:10:41

j'utilise git log pour voir ce qui a changé sur une branche de fonctionnalité de la branche principale

git log does_this_branch..contain_this_branch_changes

p. ex. - pour voir ce qui se produit dans une branche de fonctionnalité qui a été fusionnée ou non à master:

git log master..feature_branch
5
répondu nelsonenzo 2013-07-02 23:20:07

si vous voulez passer de B à A, vous devez vous assurer que git log B..A ne vous montre rien, i.e. a n'a rien que B n'a pas. Mais même si B..Un a quelque chose, vous pourriez encore être en mesure de fusionner sans conflits, le ci-dessus montre deux choses: qu'il y aura une avance rapide, et donc vous n'aurez pas un conflit.

2
répondu Erik Allik 2013-08-24 14:30:55

faites une copie temporaire de votre copie de travail, puis fusionnez-la et différenciez les deux.

-3
répondu vanboom 2015-01-05 17:23:27