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.
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 .
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
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.
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.
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.
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
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
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., .