Question Y a-t-il une version "leur" de "git merge -son"?


Lors de la fusion de la branche de sujet "B" en "A" en utilisant git merge, J'ai des conflits. Je sais que tous les conflits peuvent être résolus en utilisant 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 n'existe-t-il pas? Comment puis-je obtenir le même résultat après la fusion conflictuelle avec git commandes? (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 commit de fusion à la version B de l'arbre) n'est pas ce que je cherche.


666
2017-10-06 11:16


origine


Réponses:


Ajouter le -X option à theirs. Par exemple:

git checkout branchA
git merge -X theirs branchB

Tout va fusionner de la manière souhaitée.

La seule chose que j'ai vu causer des problèmes est si les fichiers ont été supprimés de la branche B. Ils apparaissent comme des conflits si quelque chose d'autre que git a fait l'enlèvement.

La solution est facile. Juste courir git rm avec le nom de tous les fichiers qui ont été supprimés:

git rm {DELETED-FILE-NAME}

Après cela, le -X theirs devrait fonctionner comme prévu.

Bien sûr, faire l'enlèvement réel avec le git rm commande empêchera le conflit de se produire en premier lieu.


Remarque: Une option de forme plus longue existe également. Pour l'utiliser, remplacez:

-X theirs

avec:

--strategy-option=theirs

777
2017-07-29 15:58



Une solution possible et testée pour fusionner la branche B dans notre branche A:

# in case branchA is not our current branch
git checkout branchA

# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours branchB    

# make temporary branch to merged commit
git branch branchTEMP         

# get contents of working tree and index to the one of branchB
git reset --hard branchB

# reset to our merged commit but 
# keep contents of working tree and index
git reset --soft branchTEMP

# change the contents of the merged commit
# with the contents of branchB
git commit --amend

# get rid off our temporary branch
git branch -D branchTEMP

# verify that the merge commit contains only contents of branchB
git diff HEAD branchB

Pour l'automatiser, vous pouvez l'intégrer dans un script en utilisant les fonctions branchA et branchB en tant qu'arguments.

Cette solution préserve le premier et deuxième parent de la validation de fusion, tout comme vous attendez de git merge -s theirs branchB.


180
2018-02-11 13:42



Les anciennes versions de git vous ont permis d'utiliser la stratégie de fusion "theirs":


git pull --strategy=theirs remote_branch

Mais cela a depuis été supprimé, comme expliqué dans ce message par Junio ​​Hamano (le mainteneur Git). Comme indiqué dans le lien, vous feriez plutôt ceci:


git fetch origin
git reset --hard origin

Méfiez-vous, cependant, que c'est différent d'une fusion réelle. Votre solution est probablement l'option que vous recherchez vraiment.


79
2017-10-06 13:28



J'ai utilisé la réponse de Paul Pladijs depuis maintenant. J'ai découvert, vous pouvez faire une fusion "normale", des conflits se produisent, de sorte que vous faites

git checkout --theirs <file>

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

git merge <branch> -s theirs

Quoi qu'il en soit, l'effort est plus que ce serait avec la stratégie de fusion! (Cela a été testé avec git version 1.8.0)


53
2017-11-03 12:51



Il n'est pas tout à fait clair quel est le résultat souhaité, donc il y a une certaine confusion au sujet de 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

C'est ne pas la "leur version pour git merge -s ours"mais la" leur version pour git merge -X ours"(ce qui est court pour git merge -s recursive -X ours):

git checkout branchA
# also uses -s recursive implicitly
git merge -X theirs branchB

C'est ce que La réponse d'Alan W. Smith Est-ce que.

Utiliser le contenu de B uniquement

Cela crée un commit de fusion pour les deux branches mais supprime toutes les modifications de branchA et ne garde que le contenu de branchB.

# Get the content you want to keep.
# If you want to keep branchB at the current commit, you can add --detached,
# else it will be advanced to the merge commit in the next step.
git checkout branchB

# Do the merge an keep current (our) content from branchB we just checked out.
git merge -s ours branchA

# Set branchA to current commit and check it out.
git checkout -B branchA

Notez que la fusion valide le premier parent maintenant est celle de branchBet seulement la seconde vient de branchA. C'est ce que La réponse de Gandalf458 Est-ce que.

Utiliser uniquement le contenu de B et conserver l'ordre correct des parents

C'est le vrai "leur version pour git merge -s oursIl a le même contenu que dans l'option précédente (c'est-à-dire seulement celle de branchB) mais l'ordre des parents est correct, c'est-à-dire que le premier parent vient de branchA et le second de branchB.

git checkout branchA

# Do a merge commit. The content of this commit does not matter,
# so use a strategy that never fails.
# Note: This advances branchA.
git merge -s ours branchB

# Change working tree and index to desired content.
# --detach ensures branchB will not move when doing the reset in the next step.
git checkout --detach branchB

# Move HEAD to branchA without changing contents of working tree and index.
git reset --soft branchA

# 'attach' HEAD to branchA.
# This ensures branchA will move when doing 'commit --amend'.
git checkout branchA

# Change content of merge commit to current index (i.e. content of branchB).
git commit --amend -C HEAD

C'est quoi La réponse de Paul Pladijs fait (sans nécessiter une branche temporaire).


45
2017-12-07 00:04



J'ai résolu mon problème en utilisant

git checkout -m old
git checkout -b new B
git merge -s ours old

21
2017-10-06 11:34



Si vous êtes sur la succursale A, faites:

git merge -s recursive -X theirs B

Testé sur git version 1.7.8


14
2018-04-12 19:17



Lors de la fusion de la branche de sujet "B" dans "A" en utilisant la fusion git, j'ai quelques conflits. Je> connais tous les conflits peuvent être résolus en utilisant la version dans "B".

Je suis conscient de git merge -son nous. Mais ce que je veux, c'est quelque chose comme git merge> -s leur.

Je suppose que vous avez créé une branche hors de maître et que vous voulez maintenant revenir en arrière dans le maître, en remplaçant les anciennes choses dans le maître. C'est exactement ce que je voulais faire quand je suis tombé sur ce post.

Faites exactement ce que vous voulez faire, sauf fusionner l'une branche dans l'autre en premier. Je viens de faire ça, et ça a bien fonctionné.

git checkout Branch
git merge master -s ours

Puis, checkout master et fusionnez votre branche dedans (ça ira bien maintenant):

git checkout master
git merge Branch

8
2017-09-08 09:40



Pour vraiment faire correctement une fusion qui prend seulement entrée de la branche que vous fusionnez, 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 conflit dans un scénario que je connaisse, vous n'avez pas besoin de 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.


6
2017-10-30 14:47



Voir La réponse largement citée de Junio ​​Hamano: si vous voulez supprimer le contenu engagé, il vous suffit de rejeter les validations, ou du moins de les conserver hors de l'historique principal. Pourquoi déranger tout le monde dans la lecture future commettre des messages de commits 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 n'apportent rien, vous voulez:

(edit: wow, est-ce que j'ai réussi à me tromper avant?

git update-ref HEAD $(
        git commit-tree -m 'completely superseding with branchB content' \
                        -p HEAD -p branchB    branchB:
)
git reset --hard

4
2018-05-13 15:48