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