Est-il “leur” version de “git merge -s nôtre”?
Lors de la fusion de sujet, succursale "B" dans "Un" à l'aide de git merge
, je reçois des conflits. Je sais que tous les conflits peuvent être résolus à l'aide de la version "B".
Je suis conscient de git merge -s ours
. Mais ce que je veux, c'est quelque chose comme git merge -s theirs
.
Pourquoi ne pas exister? Comment puis-je obtenir le même résultat après le conflit de fusion avec l'existant git
commandes? (git checkout
chaque désinstallé le fichier à partir de B)
Mise à JOUR: La "solution" de simplement les jeter quelque chose à partir d'Une branche (la fusion point de validation de la version B de l'arbre) n'est pas ce que je suis à la recherche d'.
- Voir aussi cette réponse: stackoverflow.com/questions/928646/... - c'est trivial pour changer l'exemple utiliser la version B à la place de A.
- Voir DONC réponse commande git pour faire une branche comme les autres pour tous les moyens possibles pour simuler
git merge -s their
. - Si vous n'êtes pas vraiment à la recherche d'un
git merge -s theirs
(qui peut être atteint facilement avecgit merge -s ours
et temporaire de la branche), depuis -s nôtre ignore complètement les changements de la fusion de la direction de... - faire le Git devs vraiment le trouver offensive de fournir
theirs
en plus deours
??? C'est un symptôme de l'un de haut niveau de l'ingénierie et de la conception des problèmes dans Git: incohérence. - Le problème ici n'est pas "git merge -s nôtre" être offensant, mais elle était contre-intuitif. Vous pouvez le voir dans le cas des OP question que si une telle fonctionnalité serait ajouté qu'il serait de l'utiliser par erreur, en ce qu'il veut réellement faire, c'est un "git merge -s récursive -X le leur". Il est courant de vouloir fusionner une autre branche primordial en conflit avec la version sur l'autre branche, mais complètement écraser la branche courante, avec une autre branche complètement à jeter le cours du change est vraiment un cas d'exception.
- Tout le monde devrait vérifier l'OP "mise à jour" soigneusement que la question n'a rien à voir avec
git merge -s ours
. - Voir aussi: git merge stratégies
- chaque fois que j'avais à fusionner dans ma vie, j'ai toujours voulu prendre le "leur" version
- Bottom line: c'est
git merge -X theirs
- git merge -X le leur Ne fonctionne pas si vous avez des centaines de suppressions de fichier que vous essayez de fusionner avec une autre branche.
Vous devez vous connecter pour publier un commentaire.
Ajouter le
-X
option pourtheirs
. Par exemple:Tout de la fusion de la façon souhaitée.
La seule chose que j'ai vu causer des problèmes si des fichiers ont été supprimés à partir de branchB. Ils apparaissent comme des conflits si quelque chose d'autre que git ne l'enlèvement.
La solution est facile. Il suffit d'exécuter
git rm
avec le nom de tous les fichiers qui ont été supprimés:Après cela, le
-X theirs
devrait fonctionner comme prévu.Bien sûr, de faire le retrait de l'implant avec la
git rm
commande d'empêcher les conflits de se produire en premier lieu.Note: Une forme longue est également possible. Pour l'utiliser, remplacer:
avec:
theirs
". -Xtheirs est la stratégie de option appliquée à récursive stratégie. Cela signifie que récursive stratégie sera toujours fusionner tout ce qu'il peut, et ne revenir à "leur" logique dans le cas de conflits. Alors que c'est ce dont on a besoin dans la plupart des cas, comme ci-dessus, ce n'est pas la même chose que "juste de prendre tout de la branche B est". Il ne le réel de fusion au lieu de toute façon.git merge -X theirs branchB
git rm --ignore-unmatch $(git diff branchB --name-only)
La deuxième commande supprime tous les fichiers supprimés automatiquement.git merge -X ours
par opposition à l'opposé degit merge -s ours
. Cette réponse doit refléter le fait que le question est en fait valide.Une possible solution testée pour la fusion branchB dans nos extraits branchA:
Pour automatiser, vous pouvez l'envelopper dans un script à l'aide branchA et branchB comme arguments.
Cette solution préserve le premier et le deuxième parent de la fusion de commettre, comme vous pouvez attendre de
git merge -s theirs branchB
.git reset --soft branchA
?git reset --hard
changements qui s'engagentbranchA
points.branchA
enbranchB
. Il est facile pour effectuer une avance rapide et Un reset B, si vous le souhaitez. Le seul inconvénient est que^
et^^
serait annulée. J'aime Shyam la réponse de ici.git reset --soft HEAD@{1}
vous pouvez obtenir tout de même que la création d'une nouvelle branche. En utilisant le présent au lieu degit reset --soft branchTEMP
, vous pouvez laisser lesgit branch branchTEMP
etgit branch -D branchTEMP
tmp=`git rev-parse HEAD`
et puis en utilisant à la place de branchTEMPgit rebase --interactive --preserve-merges HEAD~2
et le résultat en seulement 1 commitLes anciennes versions de git vous a permis d'utiliser le "leur" stratégie de fusion:
Mais cela a depuis été supprimé, comme expliqué dans ce message par Junio Hamano (Git responsable). Comme indiqué dans le lien, au lieu de cela vous voulez faire cela:
Méfiez-vous, cependant, que ce est différente de celle d'une fusion réelle. Votre solution est probablement l'option que vous cherchez vraiment.
git reset --hard origin
une solution pour leur style de fusion? Si je voulais fusionner BranchB en BranchA (comme dans Alan W. Smith réponse), comment pourrais-je le faire à l'aide de lareset
méthode?git reset --hard
fait “leur”style de fusion. Bien sûr,git reset --hard
ne crée pas de fusion de commettre, ou tout s'engager pour cette question. Son point est que il ne faut pas utiliser une fusion pour remplacer celui que dans la TÊTE par quelque chose d'autre. Je ne suis pas forcément d'accord, cependant.theirs
a été supprimé parce que la justification était incomplète. Il n'a pas autorisé pour les cas où le code est bon, c'est juste que l'amont est maintenu sur un autre fondement philosophique, donc dans ce sens est "mauvais", donc on n'a envie à la fois de tenir à jour avec l'amont, mais dans le même temps conserver un bon code de 'bugs' [git & msysgit ont de ce de ce "conflit" en raison de leurs différentes cibles de la plate-forme philosophies]theirs
parce que j'avais accidentellement modifié quelques fichiers dans les deux branches distinctes et a voulu ignorer les modifications de l'un sans avoir à le faire manuellement pour chaque fichier.J'ai utilisé la réponse de Paul Pladijs depuis maintenant. J'ai trouvé, vous pouvez faire un "normal" de fusion, les conflits se produisent, de sorte que vous ne
pour résoudre le conflit en utilisant la révision de l'autre branche. Si vous faites cela pour chaque fichier, vous avez le même comportement que vous attendez de
De toute façon, l'effort est plus que ce serait avec la fusion et de stratégie! (Cela a été testé avec git version 1.8.0)
git ls-files --modified | xargs git add
je voulais le faire pour ajouté sur les deux côtés de fusion :/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"'
Il n'est pas tout à fait clair que le résultat recherché est, il ya une certaine confusion au sujet de la "bonne" façon de le faire dans les réponses et de leurs commentaires. J'essaie de donner une vue d'ensemble et de voir l'une des trois options suivantes:
Essayer de fusion et utilisez B pour les conflits
C'est pas la "leur version pour
git merge -s ours
" mais "leur version pourgit merge -X ours
" (qui est court pourgit merge -s recursive -X ours
):C'est ce que par exemple Alan W. Smith réponse n'.
Utiliser le contenu de B seulement
Cela crée une fusion de s'engager pour les deux branches, mais ignore toutes les modifications de
branchA
et ne conserve que le contenu debranchB
.Noter que la fusion s'engage premier parent, c'est maintenant que de
branchB
et seulement la deuxième est debranchA
. C'est ce que par exemple Gandalf458 réponse n'.Utiliser le contenu à partir de B et de garder parent correcte afin
C'est le réel "leur version pour
git merge -s ours
". Il a le même contenu que l'option avant (c'est à dire uniquement qu'à partir debranchB
) mais l'ordre des parents est correct, c'est à dire le premier parent vient debranchA
et la deuxième à partir de labranchB
.C'est ce que Paul Pladijs réponse n' (sans avoir besoin temporaire de la branche).
git checkout branchA; git merge -s ours --no-commit branchB; git read-tree -um @ branchB; git commit
read-tree
que la moyenne des utilisateurs de git peut pas être utilisé pour (au moins je ne suis pas 😉 ). Les solutions dans la réponse d'utiliser seulement le haut niveau ("porcelaine") la plupart des commandes git les utilisateurs devraient savoir. Je les préfère, mais je vous remercie pour votre version quand même!…commit --amend…
) serait "perdu". J'ai l'intention d'ajouter un peu de graphique d'explications pour cette réponse dès que j'ai le temps de les faire... 😉J'ai résolu mon problème en utilisant
Si vous êtes sur la direction générale de la faire:
Testé sur git version 1.7.8
Je suis en supposant que vous avez créé une branche de master et vous souhaitez fusionner en maître, ignorant tout de l'ancien maître. C'est exactement ce que je voulais faire quand je suis tombé sur ce post.
Faire exactement ce que vous voulez faire, à l'Exception de fusion de l'un dans l'autre en premier. J'ai juste fait ça, et ça a très bien fonctionné.
Puis, checkout master et de fusion de votre branche (il va aller bien maintenant):
Pour vraiment bien faire une fusion qui prend seulement d'entrée de la direction générale, vous êtes la fusion que vous pouvez 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 pas de conflits dans n'importe quel scénario que je connais, vous n'avez pas à faire d'autres branches, et il agit comme une normale de fusion s'engager.
Cela ne veut pas jouer gentil avec les submodules cependant.
Voir Junio Hamano est largement cité répondre: si vous allez jeter commis de contenu, juste jeter la commet, ou en tout cas de le garder hors de la main de l'histoire. Pourquoi s'embêter à tout le monde dans l'avenir de la lecture des messages de validation de commits qui n'ont rien à offrir?
Mais il y a parfois des exigences administratives, ou peut-être une autre raison. Pour les situations où vous avez vraiment d'enregistrement s'engage à ce que n'apportant rien, vous souhaitez:
(edit: wow, j'ai réussi à obtenir cette erreur avant. Celui-ci fonctionne.)
Alors que je le mentionne dans "commande git pour la fabrication de branche en branche comme un autre" comment simuler
git merge -s theirs
, notez que Git 2.15 (T4 2017) est maintenant plus claire:Voir s'engager c25d98b (25 septembre 2017) par Junio C Hamano (
gitster
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager 4da3e23 28 septembre 2017)-Xtheirs
est un stratégie option appliquée à récursive de la stratégie. Cela signifie que récursive stratégie sera toujours fusionner tout ce qu'il peut, et ne revenir à "theirs
" logique dans le cas de conflits.Que le débat de la pertinence ou non d'un
theirs
de fusion de la stratégie a été ramené récemment dans ce Sept. 2017 fil.Il reconnaît les plus âgés (2008) de threads
Il mentionne le nom d'alias:
Yaroslav Halchenko essaie de défendre une fois de plus pour cette stratégie, mais Junio C. Hamano ajoute:
Celui-ci utilise un git plomberie commande de lecture de l'arbre, mais fait pour une courte flux de travail global.
Cela va fusionner votre newBranch existants baseBranch
git commit --amend
à la fin de votre exemple, ou les utilisateurs peuvent voir la fusion s'engager avecgit log
et supposons que l'opération est terminée.Je pense que ce que vous voulez vraiment est:
Cela semble maladroit, mais il devrait fonctionner. La seule chose que je n'aime vraiment pas au sujet de cette solution est l'historique de git sera source de confusion... Mais au moins, l'histoire sera totalement préservée et vous n'aurez pas besoin de faire quelque chose de spécial pour les fichiers supprimés.
L'équivalent(qui garder les parents) afin de 'git merge -s leur branchB'
Avant de fusion:
!!! Assurez-vous que vous êtes en état de propreté !!!
Faire de la fusion:
Ce que nous avons fait ?
Nous avons créé un nouveau commit qui des deux parents de la nôtre et la leur et la contnet de la validation est branchB - leur
Après fusion:
Plus précisément:
Cette réponse a été donnée par Paul Pladijs. J'ai juste pris ses commandements et fait un git alias pour des raisons de commodité.
Modifier votre .gitconfig et ajoutez les éléments suivants:
Ensuite, vous pouvez "git merge -s leur" en cours d'exécution:
Récemment, j'ai besoin de faire cela pour deux référentiels qui partagent une histoire commune. J'ai commencé avec:
Org/repository1 master
Org/repository2 master
Je voulais tous les changements de
repository2 master
être appliqué àrepository1 master
, d'accepter toutes les modifications que repository2 ferait. Dans git, l' devrait être une stratégie dite de-s theirs
MAIS il n'existe pas. Être prudent, car-X theirs
est nommé comme il le serait ce que vous voulez, mais il est PAS le même (il dit même si dans la page de man).La façon dont j'ai résolu ce problème a été 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 elle se confond bien avec pas de problèmes. J'ai ensuite pousser à la distance.Puis-je revenir à
repository1
et de créer une nouvelle brancherepo2-merge
. Dans cette branche, je lancegit pull [email protected]:Org/repository2 repo1-merge
qui viendra compléter les questions.Enfin, il est nécessaire d'émettre une demande de fusion dans
repository1
pour en faire le nouveau maître, ou simplement le garder comme une branche.Une interface simple et intuitive (à mon avis) à deux étapes de la façon de le faire est
suivie par
(qui marque les deux directions fusionnées)
Le seul inconvénient est qu'il ne supprime pas les fichiers qui ont été supprimés dans branchB à partir de votre branche. Un simple diff entre les deux branches par la suite montrera si il y a de tels fichiers.
Cette approche permet également clair à partir du journal de révision après ce qui a été fait et ce qui a été prévu.