Résoudre les conflits de fusion Git en faveur de leurs changements lors d'une traction

comment résoudre un conflit de fusion git en faveur de modifications retirées?

fondamentalement, je dois supprimer tous les changements conflictuels d'un arbre de travail sans avoir à passer par tous les conflits avec un git mergetool tout en gardant tous les changements sans conflit. De préférence, ce faisant, tout en tirant, pas par la suite.

771
demandé sur sanmai 2012-05-22 11:18:07

8 réponses

vous pouvez utiliser le récursif "leur" stratégie option :

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.

Note: Comme le dit la page de manuel, la" fusion option stratégie est très différente de la "fusion stratégie .

613
répondu Ikke 2016-05-06 17:31:40
git pull -s recursive -X theirs <remoterepo or other repo>

ou, simplement, pour le dépôt par défaut:

git pull -X theirs

si vous êtes déjà en conflit...

git checkout --theirs path/to/file
705
répondu Pascal Fares 2017-06-06 00:21:06

si vous êtes déjà en état de conflit, et vous voulez juste accepter tout de leurs:

git checkout --theirs .
git add .

Si vous voulez faire le contraire:

git checkout --ours .
git add .

C'est assez drastique, donc assurez-vous que vous voulez vraiment tout effacer comme ça avant de le faire.

294
répondu lots-to-learn 2015-11-06 15:18:44

Ok donc, imaginez le scénario dans lequel j'étais:

vous tentez 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 voyez le fichier en conflit et vous ne voulez vraiment pas garder vos modifications. Dans mon cas ci-dessus, le fichier était en conflit sur juste une nouvelle ligne que mon IDE avait auto-ajoutée. Pour annuler vos modifications et accepter leurs, la manière la plus simple est:

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

overwrite 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 pu trouver cette réponse très facilement sur le Net.

203
répondu Theodore R. Smith 2014-08-01 12:11:25

Pour résoudre tous les conflits avec la version dans 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 garder la version maître des fichiers en conflit:

git diff --name-only --diff-filter=U | xargs git checkout master
15
répondu Ariel Alvarez 2015-12-06 08:54:47

les réponses git pull -X theirs peuvent créer un laid commit de fusion, ou émettre un

erreur: vos modifications locales aux fichiers suivants seraient écrasées par fusion:

si vous voulez simplement ignorer toute modification locale des fichiers de la repo, par exemple sur un client qui devrait toujours être un miroir d'une origine, Lancez ceci (remplacer master par la branche que vous voulez):

git fetch && git reset --hard origin/master

Comment ça fonctionne? git fetch ne git pull , mais sans fusionner . Puis git reset --hard rend votre arbre de travail compatible avec le dernier commit. Tous vos changements locaux dans les fichiers de la pension seront éliminés , mais les nouveaux fichiers locaux seront laissés seuls.

11
répondu Dan Dascalescu 2018-01-23 11:00:32

s'il vous Plaît pas que, parfois, ce sera pas de travail :

git checkout --our path/to / file

ou

git checkout --leur chemin / vers / Fichier

j'ai fait cela à la place, en supposant que la tête est la nôtre et MERGE_HEAD est le leur

git checkout HEAD -- path/to/file

ou:

git checkout MERGE_HEAD -- path/to/file

après avoir fait ceci et nous sommes bons:

git add .

si vous voulez comprendre plus, voir le merveilleux post de torek ici : git checkout --le nôtre ne pas supprimer des fichiers à partir dissociées de la liste des fichiers

9
répondu Nicolas D 2017-05-23 12:10:44

de https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging

cela fera essentiellement une fausse Fusion. Il va enregistrer une nouvelle fusion commettre avec les deux branches comme parents, mais il ne regarde même pas la branche vous êtes à la fusion. Il enregistrera simplement comme le résultat de la fusion le code exact dans votre branche.

$ git merge -s ours mundo

Fusion faite par la stratégie "la nôtre".

$ git diff HEAD HEAD~

vous pouvez voir qu'il n'y a pas de différence entre la branche sur laquelle nous étions et le résultat de la fusion.

cela peut souvent être utile pour faire croire à Git qu'une branche est déjà fusionné lors d'une fusion plus tard. Par exemple, dire vous avez ramifié une branche de libération et avez fait du travail dessus vous voudrez fusionner de nouveau dans votre branche principale à un moment donné. Dans entre-temps une correction sur maître doit être intégré dans votre branche de version. Vous pouvez fusionner la branche bugfix dans la version branche et aussi fusionner-la même branche dans votre branche principale (même si le correctif est déjà là) donc quand vous fusionnez plus tard le release branch encore une fois, il n'y a aucun conflit avec le bugfix.

une situation que j'ai trouvé utile si je veux que master reflète les changements d'une nouvelle branche thématique. J'ai remarqué que-Xtheirs ne fusionne pas sans conflits dans certaines circonstances... par exemple

$ git merge -Xtheirs topicFoo 

CONFLICT (modify/delete): js/search.js deleted in HEAD and modified in topicFoo. Version topicFoo of js/search.js left in tree.

dans ce cas, la solution que j'ai trouvée était

$ git checkout topicFoo

de topicFoo, première Fusion EN master en utilisant la stratégie-nôtre, cela créera le faux commit qui est juste l'état de topicFoo. $ git merge-s our master

vérifier la fusion s'engager

$ git log

maintenant la caisse de la branche principale

$ git checkout master

fusionnez la branche thématique mais cette fois utilisez la stratégie récursive-Xtheirs, cela vous présentera maintenant une branche master avec l'état de topicFoo.

$ git merge -X theirs topicFoo
-1
répondu Amos Folarin 2017-10-05 17:29:38