Comment résoudre un conflit de fusion git en faveur de modifications retirées?
Fondamentalement, je dois supprimer toutes les modifications conflictuelles d'une arborescence de travail sans avoir à passer par tous les conflits git mergetool
pendant un certain temps en conservant toutes les modifications sans conflit. Faites-le de préférence en tirant, pas après.
git
git-merge
git-merge-conflict
sanmai
la source
la source
Réponses:
Ou, tout simplement, pour le référentiel par défaut:
Si vous êtes déjà en conflit ...
la source
-s recursive
qu'ici est redondant, car c'est la stratégie de fusion par défaut. Vous pouvez donc le simplifiergit pull -X theirs
, ce qui est fondamentalement équivalent àgit pull --strategy-option theirs
.MERGING
état. Je peux alorsgit merge --abort
et réessayer, mais à chaque fois je me retrouve avec une fusion. … Je sais cependant qu'un rebase a été poussé vers mon amont, alors c'est peut-être la cause de cela?git checkout --theirs path/to/file
. Utilisé lors du rebase et obtenu des résultats inattendus. Explication trouvée dans le doc: Notez que pendant git rebase et git pull --rebase, les nôtres et les leurs peuvent apparaître échangés; --ours donne la version de la branche sur laquelle les modifications sont rebasées, tandis que - theirs donne la version de la branche qui contient votre travail qui est rebasé.git checkout --theirs/--ours path
page de manuel indique qu'elle fonctionne pour les chemins non fusionnés . Donc s'il n'y avait pas de conflit dans le chemin, il est déjà fusionné cette commande ne fera rien. Cela peut entraîner des problèmes lorsque vous souhaitez par exemple la version «leur» d'un sous-dossier entier. Donc, dans ce cas, il serait plus sûr de fairegit checkout MERGE_HEAD path
ou d'utiliser le hachage de validation.git pull -X theirs
crée un commit de fusion s'il y a des conflits (par exemple si un autre committer a courugit push -f
vers la télécommande). Si vous ne voulez pas de validations de fusion, exécutez plutôtgit fetch && git reset --hard origin/master
.Vous pouvez utiliser l' option de stratégie récursive "la leur" :
git merge --strategy-option theirs
De l' homme :
Remarque: comme l'indique la page de manuel, l' option de stratégie de fusion "nôtre" est très différente de la stratégie de fusion "nôtre" .
la source
git checkout --theirs
pour opérer sur un seul fichier conflictuelgit checkout <ref to theirs> -- the/conflicted.file
; puisgit add
leurs changements.Si vous êtes déjà en état de conflit et que vous souhaitez simplement accepter tous les leurs:
Si vous voulez faire le contraire:
C'est assez drastique, alors assurez-vous vraiment de tout effacer comme ça avant de le faire.
la source
.
et spécifiez le (s) fichier (s) à la place du point que vous souhaitez extraire. probablement moins "drastique" et exactement ce que vous voulez faire.git add -u
place pour ignorer les fichiers qui ne sont pas sous contrôle de version.OK, imaginez le scénario dans lequel je venais de:
Vous tentez un
merge
, ou peut-être uncherry-pick
, et vous êtes arrêté avecMaintenant, 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 sur une nouvelle ligne que mon IDE avait ajoutée automatiquement. Pour annuler vos modifications et accepter les leurs, la manière la plus simple est:
L'inverse de ceci (pour écraser la version entrante avec votre version) est
Étonnamment, je n'ai pas pu trouver cette réponse très facilement sur le Net.
la source
git status
entrecheckout
etadd
, le fichier apparaît toujours comme "les deux modifiés".git reset --hard
et puisgit pull [remote server name] [branch name] -Xtheirs
(annule la fusion puis tire les nouveaux trucs par-dessus mes trucs) - je ne sais pas si c'est ce que vous voulez.Les
git pull -X theirs
réponses peuvent créer un vilain commit de fusion ou émettre unSi vous souhaitez simplement ignorer toute modification locale des fichiers du référentiel, par exemple sur un client qui doit toujours être le miroir d'une origine, exécutez ceci (replace
master
par la branche souhaitée):Comment ça marche?
git fetch
faitgit pull
mais sans fusion . Fait ensuite correspondregit reset --hard
votre arbre de travail au dernier commit. Toutes vos modifications locales apportées aux fichiers du référentiel seront ignorées , mais les nouveaux fichiers locaux seront laissés seuls.la source
git fetch && git reset --hard {remote}/{branch}
c'est ce qui a résolu mon problème. J'avais besoin d'abandonner complètement mes propres changements en faveur de l'état "leur" d'une branche, mais il s'estgit pull -X theirs
étouffé avec certains fichiers déplacés / renommés. Merci!Après la fusion de git, si vous rencontrez des conflits et que vous souhaitez que votre ou leur
la source
Pour résoudre tous les conflits avec la version dans une branche particulière:
Donc, si vous êtes déjà dans l'état de fusion et que vous souhaitez conserver la version principale des fichiers en conflit:
la source
git cherry-pick --continue
ou unegit commit --allow-empty
commande pour valider ces modifications, et il ne semble pas y avoir de système derrière lequel la commande est requise, ce qui rend l'automatisation difficile. Je suis en train de résoudre ce problème en testant l'existence d'un.git/COMMIT_EDITMSG
fichier, mais cela semble hacky et fragile, et je ne suis pas encore convaincu que cela fonctionne toujours.git add
), vous pouvez résoudre le reste en bloc via cela.git checkout --ours
/git checkout --theirs
est également utile.Veuillez noter que parfois cela ne fonctionnera pas :
ou
Je l'ai fait à la place, en supposant que HEAD est à nous et MERGE_HEAD est à eux
ou:
Après cela, nous sommes bons:
Si vous voulez en savoir plus, consultez le merveilleux article de torek ici: git checkout --ours ne supprime pas les fichiers de la liste des fichiers non fusionnés
la source
Utilisateurs IDE VS Code (Git intégré):
Si vous souhaitez accepter toutes les modifications entrantes dans le fichier de conflit, procédez comme suit.
De même, vous pouvez faire pour d'autres options comme Accepter tous les deux, Accepter tout le courant, etc.,
la source
J'avais une
next-version
branche de longue date avec des tonnes de suppressions de fichiers qui avaient changédevelop
, des fichiers qui avaient été ajoutés à différents endroits sur les deux branches, etc.Je voulais prendre tout le contenu de la
next-version
branche dansdevelop
, tout en un gros commit de fusion.La combinaison des commandes ci-dessus qui a fonctionné pour moi était:
Pas une nouvelle réponse, juste en combinant des extraits de nombreuses réponses, en partie pour rassurer que vous pourriez avoir besoin de toutes ces réponses.
la source
Si vous êtes déjà en état de conflit et que vous ne souhaitez pas extraire le chemin un par un. Vous pouvez essayer
la source
Une situation que j'ai trouvée utile si je veux que master reflète les changements d'une nouvelle branche de sujet. J'ai remarqué que -Xtheirs ne fusionne pas sans conflits dans certaines circonstances ... par exemple
Dans ce cas, la solution que j'ai trouvée était
à partir de topicFoo, fusionnez d'abord dans master en utilisant la stratégie -s our, cela créera le faux commit qui n'est que l'état de topicFoo. $ git merge -s our master
vérifier le commit de fusion créé
passez à la caisse principale
fusionnez la branche de sujet en arrière, mais cette fois utilisez la stratégie récursive -Xtheirs, cela vous présentera maintenant une branche principale avec l'état de topicFoo.
la source