830 votes

Existe-t-il une version "ours" de "git merge -s ours" ?

Lors de la fusion de la branche de sujet "B" dans "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 les données existantes ? git des commandes ? ( git checkout chaque fichier non fusionné de B)

La "solution" qui consiste à éliminer tout ce qui provient de la branche A (le point de validation de la fusion vers la version B de l'arbre) n'est pas ce que je recherche.

976voto

Alan W. Smith Points 6704

Une alternative similaire est le --strategy-option (forme courte -X ), qui accepte l'option theirs . Par exemple :

git checkout branchA
git merge -X theirs branchB

Cependant, cela équivaut plutôt à -X ours que -s ours . La différence essentielle étant que -X effectue une fusion récursive régulière, en résolvant tous les conflits en utilisant le côté choisi, alors que -s ours change la fusion pour ignorer complètement l'autre côté.

Dans certains cas, le principal problème utilisant -X theirs au lieu de l'hypothétique -s theirs est un fichier supprimé. Dans ce cas, il suffit d'exécuter git rm avec le nom des fichiers qui ont été supprimés :

git rm {DELETED-FILE-NAME}

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

Bien sûr, faire la suppression réelle avec le git rm Le commandement empêchera le conflit de se produire en premier lieu.

209voto

Paul Pladijs Points 3630

Une solution possible et testée pour fusionner la brancheB dans notre brancheA vérifiée :

# 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'envelopper dans un script en utilisant branchA et branchB comme arguments.

Cette solution préserve le premier et le second parent du commit de fusion, comme on pourrait s'y attendre de la part de git merge -s theirs branchB .

87voto

Pat Notz Points 46841

Les anciennes versions de git permettaient d'utiliser la stratégie de fusion "leurs" :

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 devriez plutôt faire ceci :

git fetch origin
git reset --hard origin

Attention, cependant, il s'agit d'une différence par rapport à une fusion réelle. Votre solution est probablement l'option que vous recherchez réellement.

61voto

musicmatze Points 877

J'utilise la réponse de Paul Pladijs depuis maintenant. J'ai découvert que vous pouvez faire une fusion "normale", des conflits surviennent, alors 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 celui que vous attendez de la part de

git merge <branch> -s theirs

De toute façon, l'effort est plus important qu'il ne le serait avec la stratégie de fusion ! (Ceci a été testé avec la version 1.8.0 de git)

21voto

elmarco Points 6329

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X