Question Existe-t-il une option git-merge --dry-run?


Je fusionne dans une branche distante qui peut avoir beaucoup de conflits. Comment puis-je savoir s'il y aura des conflits ou non?

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


579
2018-02-01 19:18


origine


Réponses:


Comme indiqué précédemment, passer dans le --no-commit drapeau, mais pour éviter un commit d'avance rapide, passez aussi --no-ff, ainsi:

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

Pour examiner les changements par étapes:

$ git diff --cached

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

$ git merge --abort

632
2018-02-01 19:57



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

  1. Récupérez la télécommande dans votre dépôt. Par exemple: git fetch origin master
  2. Exécutez git merge-base: git merge-base FETCH_HEAD master
  3. Exécutez git merge-tree: git merge-tree mergebase master FETCH_HEAD (mergebase est l'identifiant hexadécimal que la base de fusion a imprimé à l'étape précédente)

Supposons maintenant que vous souhaitiez fusionner le maître distant avec votre maître local, mais vous pouvez utiliser n'importe quelle branche. git merge-tree exécute la fusion en mémoire et imprime le résultat sur 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 commençant par 'changé dans les deux', il y aura probablement un conflit.


194
2018-06-08 19:04



Ma solution brutale à cette solution est:

1: créer une branche pré-master (à partir du master bien sûr)
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 le maître alors.
3a: fusionner le pré-master en master ou
3b: fusionner toutes les branches libérées par wannabe en master

Quoi qu'il en soit, je voudrais suivre @ orange80 conseiller.


45
2018-05-16 16:29



Annuler une fusion avec git est si facile que vous ne devriez même pas vous inquiéter de la marche à sec:

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

EDIT: Comme indiqué dans les commentaires ci-dessous, si vous avez des changements dans votre répertoire de travail ou zone de transit, vous aurez probablement envie de les stocker avant de faire ce qui précède (sinon ils disparaîtront à la suite de la git reset au dessus)


43
2018-02-01 21:24



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

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

Maintenant, je viens d'appeler

git mergetest <branchname>

Pour savoir s'il y a des conflits.


27
2018-04-18 06:10



Juste diff votre branche actuelle contre la branche distante, cela vous dira ce qui va changer lorsque vous faites un pull / fusion.

#see diff between current master and remote branch
git diff master origin/master

24
2017-12-10 03:31



Je utilise l demande-tirer commande git de le faire. Cela vous permet de voir tous les changements qui se produiraient 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 master

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 -pparamètre, vous obtiendrez également le texte du patch complet, exactement comme si vous faisiez un diff git sur chaque fichier modifié.


17
2018-06-26 10:24



Je suis surpris que personne n'ait encore suggéré d'utiliser des correctifs.

Supposons que vous souhaitiez tester une fusion à partir de your_branch dans 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

Cela devrait faire l'affaire.

Si vous obtenez des erreurs comme

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

cela signifie que le correctif n'a pas fonctionné et qu'une fusion produirait des conflits. Aucune sortie signifie que le correctif est propre et que vous pouvez facilement fusionner la branche


Notez que cela sera ne pas en fait changer votre arbre de travail (en dehors 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 à tous ceux qui sont plus intelligents / plus expérimentés avec git que moi: merci de me le faire savoir si je me trompe ici et que cette méthode montre un comportement différent d'une fusion régulière. Il semble étrange que dans les 8+ années où cette question a existé personne ne suggère cette solution apparemment évidente.


14
2017-09-14 06:32



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 pouvez aussi le faire de 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 fonctionnera pas que le clonage vers / tmp, vous aurez besoin d'une copie, pour être sûr que les modifications non validées ne seront pas en conflit).


7
2017-12-17 03:00



Je suis conscient 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-seulement

Refusez de fusionner et de quitter avec un statut différent de zéro, sauf si le HEAD actuel est déjà à jour ou si la fusion peut être résolue en avance rapide.

Cela vous permettra de fusionner et d'avancer rapidement, et si ce n'est pas le cas, il vous abandonne et vous avertit que l'avance rapide n'a pas pu être effectuée, mais laisse votre branche de travail intacte. S'il peut avancer rapidement, 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
2017-07-02 23:20