Lors de la fusion de la branche de rubrique "B" dans "A" à l'aide de git merge
, j'obtiens des conflits. Je sais que tous les conflits peuvent être résolus en utilisant la version en "B".
J'en suis conscient git merge -s ours
. Mais ce que je veux, c'est quelque chose git merge -s theirs
.
Pourquoi ça n'existe pas? Comment puis-je obtenir le même résultat après la fusion conflictuelle avec les git
commandes existantes ? ( git checkout
chaque fichier non fusionné de B)
MISE À JOUR: La "solution" consistant à simplement supprimer quoi que ce soit de la branche A (le point de validation de fusion vers la version B de l'arborescence) n'est pas ce que je recherche.
git merge -s their
.git merge -s theirs
(qui peut être réalisé facilement avecgit merge -s ours
une branche temporaire), car la nôtre ignore complètement les changements de la branche de fusion ...theirs
en plusours
??? Il s'agit d'un symptôme d'un des problèmes d'ingénierie et de conception de haut niveau dans Git: l'incohérence.Réponses:
Ajoutez l'
-X
option àtheirs
. Par exemple:Tout fusionnera de la manière souhaitée.
La seule chose que j'ai vue causer des problèmes est si les fichiers ont été supprimés de branchB. Ils apparaissent comme des conflits si autre chose que git a fait la suppression.
La solution est simple. Exécutez simplement
git rm
avec le nom des fichiers supprimés:Après cela, le
-X theirs
devrait fonctionner comme prévu.Bien sûr, effectuer la suppression réelle avec la
git rm
commande empêchera le conflit de se produire en premier lieu.Remarque : une option de formulaire plus longue existe également.
Pour l'utiliser, remplacez:
avec:
la source
theirs
». -Xtheirs est l' option stratégique appliquée à la stratégie récursive . Cela signifie que la stratégie récursive fusionnera toujours tout ce qu'elle peut et ne retombera dans "leur" logique qu'en cas de conflit. Bien que ce soit ce dont on a besoin dans la plupart des cas comme ci-dessus, ce n'est pas la même chose que "tout prendre tel quel de la branche B". De toute façon, il fait la fusion réelle.Une solution possible et testée pour fusionner la brancheB dans notre branche extraiteA:
Pour l'automatiser, vous pouvez l'encapsuler dans un script en utilisant branchA et branchB comme arguments.
Cette solution préserve le premier et le deuxième parent du commit de fusion, comme vous pouvez vous y attendre
git merge -s theirs branchB
.la source
git reset --soft branchA
?git reset --hard
changements qui validentbranchA
pointent vers.Les versions plus anciennes de git vous permettaient d'utiliser la stratégie de fusion "leur":
Mais cela a depuis été supprimé, comme expliqué dans ce message par Junio Hamano (le responsable de Git). Comme indiqué dans le lien, vous feriez plutôt ceci:
Attention, cependant, c'est différent d'une fusion réelle. Votre solution est probablement l'option que vous recherchez vraiment.
la source
git reset --hard origin
une solution pour une fusion de leur style? Si je voulais fusionner BranchB dans BranchA (comme dans la réponse d'Alan W. Smith), comment le ferais-je en utilisant lareset
méthode?git reset --hard
une fusion de style «le leur». Bien sûr,git reset --hard
ne crée aucun commit de fusion, ni aucun commit d'ailleurs. Son argument est que nous ne devons pas utiliser une fusion pour remplacer quoi que ce soit dans HEAD par autre chose. Cependant, je ne suis pas nécessairement d'accord.theirs
été supprimé car la justification était incomplète. Il n'a pas permis les cas où le code est bon, c'est juste que l'amont est maintenu sur une base philosophique différente, donc en ce sens est `` mauvais '', donc on veut à la fois se tenir à jour avec l'amont, mais en même temps conserver les bons «correctifs» de code [git & msysgit ont certains de ces «conflits» à cause des philosophies de leur plate-forme cible différente]theirs
parce que j'avais accidentellement modifié certains fichiers dans deux branches distinctes et que je voulais annuler les modifications d'une seule sans avoir à le faire manuellement pour chaque fichier.Il n'est pas tout à fait clair quel est votre résultat souhaité, il y a donc une certaine confusion sur la façon "correcte" de le faire dans les réponses et leurs commentaires. J'essaie de donner un aperçu et de voir les trois options suivantes:
Essayez de fusionner et utilisez B pour les conflits
Ce n'est pas la "leur version pour
git merge -s ours
" mais la "leur version pourgit merge -X ours
" (qui est l'abréviation degit merge -s recursive -X ours
):C'est ce que fait par exemple la réponse d'Alan W. Smith .
Utiliser uniquement le contenu de B
Cela crée un commit de fusion pour les deux branches mais rejette toutes les modifications
branchA
et ne conserve que le contenubranchB
.Notez que la fusion valide maintenant le premier parent est celle de
branchB
et que le second est debranchA
. C'est ce que fait par exemple la réponse de Gandalf458 .Utilisez le contenu de B uniquement et conservez l'ordre parent correct
Ceci est la vraie "leur version pour
git merge -s ours
". Il a le même contenu que dans l'option précédente (c'est-à-dire seulement celui debranchB
) mais l'ordre des parents est correct, c'est-à-dire que le premier parent vientbranchA
et le second debranchB
.C'est ce que fait la réponse de Paul Pladijs (sans nécessiter de succursale temporaire).
la source
git checkout branchA; git merge -s ours --no-commit branchB; git read-tree -um @ branchB; git commit
read-tree
laquelle l'utilisateur Git moyen n'est peut-être pas habitué (du moins je ne le suis pas ;-)). Les solutions de la réponse utilisent uniquement les commandes de haut niveau ("porcelaine") que la plupart des utilisateurs de git doivent connaître. Je les préfère mais merci pour ta version quand même!…commit --amend…
) serait "perdue". Je prévois d'ajouter quelques explications graphiques à cette réponse dès que j'aurai le temps de les faire… ;-)J'ai utilisé la réponse de Paul Pladijs depuis maintenant. J'ai découvert que vous pouvez effectuer une fusion "normale", des conflits se produisent,
pour résoudre le conflit en utilisant la révision de l'autre branche. Si vous procédez ainsi pour chaque fichier, vous avez le même comportement que vous attendez de
Quoi qu'il en soit, l'effort est plus qu'il ne le serait avec la stratégie de fusion! (Ceci a été testé avec git version 1.8.0)
la source
git ls-files --modified | xargs git add
je voulais le faire pour l'ajout de la fusion des deux côtés: /git ls-files --modified
donc je suppose que c'est également une solution viable.git config --global alias.unresolved '!git status --short|egrep "^([DAU])\1"'
-X
et quelle est la différence entre-X
et-s
? ne trouve aucun document.J'ai résolu mon problème en utilisant
la source
Je suppose que vous avez créé une branche hors de master et que vous souhaitez maintenant fusionner à nouveau dans master, en remplaçant les anciens éléments de master. C'est exactement ce que je voulais faire quand je suis tombé sur ce post.
Faites exactement ce que vous voulez faire, sauf d'abord fusionner une branche dans l'autre. Je viens de le faire et cela a très bien fonctionné.
Ensuite, passez en caisse maître et fusionnez votre branche en elle (ça se passera bien maintenant):
la source
Si vous êtes sur la branche A, faites:
Testé sur git version 1.7.8
la source
Pour faire vraiment correctement une fusion qui ne prend que les entrées de la branche que vous fusionnez, vous pouvez le faire
git merge --strategy=ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply --reverse --index
git commit --amend
Il n'y aura aucun conflit dans les scénarios que je connaisse, vous n'avez pas à créer de branches supplémentaires, et cela agit comme un commit de fusion normal.
Cependant, cela ne fonctionne pas bien avec les sous-modules.
la source
Alors que je mentionne dans " git command pour faire une branche comme une autre " comment simuler
git merge -s theirs
, notez que Git 2.15 (Q4 2017) est maintenant plus clair:Voir commit c25d98b (25 sept. 2017) de Junio C Hamano (
gitster
) .(Fusionné par Junio C Hamano -
gitster
- en commit 4da3e23 , 28 sept. 2017)-Xtheirs
est une option de stratégie appliquée à la stratégie récursive. Cela signifie que la stratégie récursive fusionnera tout ce qu'elle peut et ne retombera sur la "theirs
" logique qu'en cas de conflit.Ce débat sur la pertinence ou non d'une
theirs
stratégie de fusion a été ramené récemment dans ce fil de septembre 2017 .Il reconnaît les anciens threads (2008)
Il mentionne l'alias:
Yaroslav Halchenko essaie à nouveau de plaider pour cette stratégie, mais Junio C. Hamano ajoute :
Junio ajoute, comme l'a commenté Mike Beaton :
la source
git merge -s ours <their-ref>
dit effectivement 'marquer les commits constitués jusqu'à <their-ref> sur leur branche comme commits à ignorer de façon permanente » et cela est important parce que, si vous fusionnez par la suite à partir d'états ultérieurs de leur branche, leurs modifications ultérieures seront apportées sans que les modifications ignorées soient apportées.Voir la réponse largement citée de Junio Hamano : si vous souhaitez supprimer le contenu validé, supprimez simplement les validations ou, en tout cas, conservez-le hors de l'historique principal. Pourquoi déranger tout le monde à l'avenir en lisant les messages de validation des validations qui n'ont rien à offrir?
Mais parfois, il y a des exigences administratives, ou peut-être une autre raison. Pour les situations où vous devez vraiment enregistrer des commits qui ne contribuent à rien, vous voulez:
(edit: wow, ai-je réussi à me tromper avant. Celui-ci fonctionne.)
la source
Celui-ci utilise un arbre de lecture de commande de plomberie git, mais permet un flux de travail global plus court.
la source
Cela fusionnera votre newBranch dans la baseBranch existante
la source
git commit --amend
à la fin de votre exemple, ou les utilisateurs peuvent voir la fusion avecgit log
et supposer que l'opération est terminée.Je pense que ce que vous voulez réellement c'est:
Cela semble maladroit, mais cela devrait fonctionner. La seule chose que je n'aime vraiment pas dans cette solution est que l'historique de git sera déroutant ... Mais au moins, l'historique sera complètement préservé et vous n'aurez pas besoin de faire quelque chose de spécial pour les fichiers supprimés.
la source
L'équivalent (qui garde l'ordre parent) de 'git merge -s theirs branchB'
Avant la fusion:
!!! Assurez-vous que vous êtes dans un état propre !!!
Faites la fusion:
Ce que nous avons fait ? Nous avons créé un nouveau commit dont deux parents, le nôtre et le leur, et le contnet du commit est branchB - le leur
Après la fusion:
Plus précisément:
la source
Cette réponse a été donnée par Paul Pladijs. J'ai juste pris ses commandes et fait un alias git pour plus de commodité.
Modifiez votre .gitconfig et ajoutez ce qui suit:
Ensuite, vous pouvez "git merge -s theirs A" en exécutant:
la source
J'ai récemment eu besoin de le faire pour deux référentiels distincts qui partagent une histoire commune. J'ai commencé avec:
Org/repository1 master
Org/repository2 master
Je voulais que toutes les modifications
repository2 master
soient appliquées àrepository1 master
, en acceptant toutes les modifications que repository2 apporterait. En termes de git, cela devrait être une stratégie appelée-s theirs
MAIS elle n'existe pas. Soyez prudent car il-X theirs
est nommé comme il serait ce que vous voulez, mais ce n'est PAS le même (il le dit même dans la page de manuel).La façon dont j'ai résolu cela était d'aller
repository2
et de créer une nouvelle brancherepo1-merge
. Dans cette branche, j'ai courugit pull [email protected]:Org/repository1 -s ours
et ça fusionne bien sans aucun problème. Je le pousse ensuite vers la télécommande.Ensuite, je retourne
repository1
et crée une nouvelle brancherepo2-merge
. Dans cette branche, je coursgit pull [email protected]:Org/repository2 repo1-merge
ce qui se terminera par des problèmes.Enfin, vous devrez soit émettre une demande de fusion
repository1
pour en faire le nouveau maître, soit simplement la conserver en tant que branche.la source
Une façon simple et intuitive (à mon avis) de le faire en deux étapes est
suivi par
(qui marque la fusion des deux branches)
Le seul inconvénient est qu'il ne supprime pas les fichiers qui ont été supprimés dans branchB de votre branche actuelle. Un simple diff entre les deux branches montrera ensuite s'il existe de tels fichiers.
Cette approche montre également clairement à partir du journal de révision ce qui a été fait - et ce qui était prévu.
la source