web-dev-qa-db-fra.com

Résoudre les conflits de fusion Git en faveur de leurs modifications lors d'un pull

Comment résoudre un conflit de fusion git en faveur de modifications tirées?

Fondamentalement, je dois supprimer toutes les modifications conflictuelles d'un arbre de travail sans avoir à passer par tous les conflits avec un git mergetool tout en conservant toutes les modifications sans conflit. De préférence, faites-le en tirant, pas après.

1023
sanmai

Vous pouvez utiliser la stratégie récursive "leur" :

git merge --strategy-option theirs

De la homme :

ours
    This option forces conflicting hunks to be auto-resolved cleanly by 
    favoring our version. Changes from the other tree that do not 
    conflict with our side are reflected to the merge result.

    This should not be confused with the ours merge strategy, which does 
    not even look at what the other tree contains at all. It discards 
    everything the other tree did, declaring our history contains all that
    happened in it.

theirs
    This is opposite of ours.

Remarque: comme le dit la page de manuel, l'option de stratégie de fusion "our" est très différente de celle de "our our" . ) stratégie .

876
Ikke
git pull -s recursive -X theirs <remoterepo or other repo>

Ou simplement pour le référentiel par défaut:

git pull -X theirs

Si vous êtes déjà dans un état conflictuel ...

git checkout --theirs path/to/file
937
Pascal Fares

Si vous êtes déjà en conflit et que vous voulez simplement accepter tous de leur:

git checkout --theirs .
git add .

Si vous voulez faire le contraire:

git checkout --ours .
git add .

C'est assez drastique, alors assurez-vous que vous voulez vraiment tout effacer de la sorte avant de le faire.

390
lots-to-learn

OK, imaginez le scénario dans lequel je venais de parler:

Vous essayez un merge, ou peut-être un cherry-pick, et vous êtes arrêté avec

$ git cherry-pick 1023e24
error: could not apply 1023e24... [Commit Message]
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

Maintenant, vous affichez le fichier en conflit et vous ne voulez vraiment pas conserver vos modifications. Dans mon cas ci-dessus, le fichier était en conflit uniquement sur une nouvelle ligne que mon IDE avait ajouté automatiquement. Pour annuler vos modifications et accepter leurs modifications, la méthode la plus simple consiste à:

git checkout --theirs path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php

L’inverse de cette opération (pour écraser la version entrante avec votre version) est

git checkout --ours path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php

Étonnamment, je n'ai pas trouvé cette réponse très facilement sur le net.

216
Theodore R. Smith

Les réponses _git pull -X theirs_ peuvent créer un commit de fusion moche ou émettre un

erreur: vos modifications locales dans les fichiers suivants seraient écrasées par la fusion:

Si vous souhaitez simplement ignorer les modifications locales apportées aux fichiers du référentiel, par exemple sur un client qui doit toujours être le miroir d'une origine, exécutez la procédure suivante (remplacez master par la branche souhaitée):

_git fetch && git reset --hard Origin/master
_

Comment ça marche? _git fetch_ fait _git pull_ mais sans fusion . Alors git reset --hard rend votre arbre de travail correspondre au dernier commit. Toutes les modifications locales apportées aux fichiers dans le référentiel seront rejetées , mais les nouveaux fichiers locaux resteront seuls.

28
Dan Dascalescu

Pour résoudre tous les conflits avec la version d'une branche particulière:

git diff --name-only --diff-filter=U | xargs git checkout ${branchName}

Donc, si vous êtes déjà dans l'état de fusion et que vous voulez conserver la version principale des fichiers en conflit:

git diff --name-only --diff-filter=U | xargs git checkout master
19
Ariel Alvarez

S'il vous plaît ne pas que parfois cela ne fonctionnera pas :

git checkout - votre chemin/vers/fichier

ou

git checkout - leur chemin/vers/fichier

Je l’ai fait à la place, en supposant que HEAD est à nous et MERGE_HEAD est à eux

git checkout HEAD -- path/to/file

ou:

git checkout MERGE_HEAD -- path/to/file

Après nous faisons cela et nous sommes bien:

git add .

Si vous voulez en savoir plus, voyez le post merveilleux de torek ici: git checkout --ours ne supprime pas les fichiers de la liste des fichiers non fusionnés

15
Nicolas D

Code VS (Git intégré) IDE Utilisateurs:

Si vous souhaitez accepter toutes les modifications entrantes dans le fichier de conflit , procédez comme suit.

1. Go to command palette - Ctrl + Shift + P
2. Select the option - Merge Conflict: Accept All Incoming

De même, vous pouvez utiliser d'autres options telles que , Accepter tous les deux, Accepter tous les courants, etc., .

9
SridharKritha