Comment conserver le fichier local ou le fichier distant lors de la fusion en utilisant Git et la ligne de commande?

194

Je sais comment fusionner les modifications à l'aide de vimdiff, mais, en supposant que je sache simplement que le fichier entier est bon à conserver ou à jeter, comment faire?

Je ne veux pas ouvrir vimdiff pour chacun d'eux, je veux changer une commande qui dit «garder local» ou «garder à distance».

EG: J'ai obtenu une fusion avec des fichiers marqués comme modifiés parce que quelqu'un l'a ouvert sous Windows, en changeant l'EOL, puis s'est engagé. Lors de la fusion, je souhaite simplement conserver ma propre version et supprimer la sienne.

Je suis également intéressé par le contraire: j'ai foiré beaucoup de temps et je veux accepter le fichier distant, en rejetant mes modifications.

e-satis
la source

Réponses:

309

Vous pouvez aussi bien:

git checkout --theirs /path/to/file

pour conserver le fichier distant, et:

git checkout --ours /path/to/file

pour conserver le fichier local.

Ensuite, git addeux et tout est fait.

Edition: Gardez à l'esprit que c'est pour un mergescénario. Au cours d'une rebase --theirsréférence à la branche où vous avez travaillé.

En attendant Dev ...
la source
4
Je l'ai fait .. mais rien ne se passe .. comment puis-je savoir qu'il prend le bon fichier? J'utilise git version 1.8.4si cela compte.
Rosdi Kasim
3
pourquoi utiliser le mot inverse? Je suppose que "le leur" serait un fichier distant et "le nôtre" serait mon fichier
phuclv
1
Il en est ainsi, @ LưuVĩnhPhúc
Waiting for Dev ...
7
non, leurs significations sont inversées stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 les leurs seraient mes fichiers et les nôtres sont les fichiers de la branche distante
phuclv
6
"Facile", oui. Intuitif? Non.
Wilbur Whateley
107

Cette approche semble plus simple, évitant d'avoir à sélectionner individuellement chaque fichier:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

ou

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

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

keflavich
la source
3
J'aime celui-ci. Surtout s'il y a plus d'un fichier.
Tek
La question était pour deux commandes différentes, mais il n'y a aucune description de ce que font ces deux. Que fait chaque ligne?
Alex
J'ai parcouru au moins cinq réponses stackoverflow avant de trouver cela, c'est ce que je voulais. Merci.
Bolton Bailey
14

git checkout {branch-name} -- {file-name}

Cela utilisera le fichier de la branche de choix.

J'aime cela parce que la posh-gitsaisie semi - automatique fonctionne très bien avec cela. Il supprime également toute ambiguïté quant à la branche distante et à la section locale. Et --theirsça n'a pas marché pour moi de toute façon.

Ben Wilde
la source
Aucune ambiguïté, fonctionne pour {mine} et {leur}, prend en charge l'ajout de répertoires entiers. Cela devrait être la réponse acceptée.
dotancohen
9

Pour le truc de fin de ligne, reportez-vous à man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Assurez-vous d'ajouter autocrlf = falseet / ousafecrlf = false au clone Windows (.git / config)

Utiliser git mergetool

Si vous configurez un mergetool comme celui-ci:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

Ensuite, un simple

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

Fera le travail

Utilisation de commandes git simples

Dans d'autres cas, je suppose

git checkout HEAD -- path/to/myfile.txt

devrait faire l'affaire

Modifiez pour faire l'inverse (parce que vous avez foiré):

git checkout remote/branch_to_merge -- path/to/myfile.txt
sehe
la source
+1 pour les pourboires, mais non accepté mais parce que ce n'est pas ce que j'ai demandé. Je veux quelque chose qui fonctionne dans tous les cas, pas seulement dans les cas d'exemple. De plus, "git checkout remote / branch_to_merge - path / to / myfile.txt" ne fonctionnera pas si vous avez déjà commencé votre fusion: il indiquera que vous êtes au milieu d'une fusion et vous en empêchera.
e-satis
1
@ e-satis: c'est surprenant. Je considérerais cela comme un bug, car le paiement avec un chemin n'est pas un paiement normal (et cela n'affecte pas HEAD). Je vais essayer maintenant parce que je ne peux pas le croire
sehe
1
@ e-satis: Soooo ... j'avais raison; git checkout remote/branch_to_merge -- path/to/myfile.txtfonctionne comme un charme tout en résolvant un conflit de fusion. (git 1.7.1)
sehe
1
Ajout d' une solution basée sur mergetool git maintenant
sehe