web-dev-qa-db-fra.com

Choisissez la stratégie de fusion Git pour des fichiers spécifiques ("le nôtre", "le mien", "le leur")

Je suis en train de rebaser après un git pull --rebase. J'ai quelques fichiers qui ont des conflits de fusion. Comment puis-je accepter "leurs" modifications ou "mes" modifications pour des fichiers spécifiques?

$ git status
# Not currently on any branch.
# You are currently rebasing.
#   (fix conflicts and then run "git rebase --continue")
#   (use "git rebase --skip" to skip this patch)
#   (use "git rebase --abort" to check out the original branch)
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:  CorrectlyMergedFile
#
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#       both modified: FileWhereIWantToAcceptTheirChanges
#       both modified: FileWhereIWantToAcceptMyChanges

Normalement, je viens d'ouvrir le fichier ou un outil de fusion et d'accepter manuellement toutes les "modifications" ou "mes". Cependant, je soupçonne que je manque une commande pratique git.

De plus, notez que je ne pourrai choisir une stratégie de fusion pour chaque fichier que lorsque je saurai quels fichiers sont en conflit et éventuellement quels sont ces conflits.

179
Steven Wexler

Pour chaque fichier en conflit que vous obtenez, vous pouvez spécifier

_git checkout --ours -- <paths>
# or
git checkout --theirs -- <paths>
_

À partir de la _git checkout_ docs

_git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>..._

--ours
--theirs
Lorsque vous extrayez des chemins de l’index, recherchez l’étape 2 (ours) ou 3 (theirs) pour les chemins non fusionnés.

L'index peut contenir des entrées non fusionnées en raison d'une fusion précédente ayant échoué. Par défaut, si vous essayez d'extraire une telle entrée de l'index, l'opération d'extraction échouera et rien ne sera extrait. Utiliser _-f_ ignorera ces entrées non fusionnées. Le contenu d'un côté spécifique de la fusion peut être extrait de l'index en utilisant _--ours_ ou _--theirs_. Avec _-m_, les modifications apportées au fichier d'arborescence de travail peuvent être ignorées pour recréer le résultat de la fusion en conflit d'origine.

222
user456814

Même si l'on répond à cette question, donnez un exemple de ce que "leur" et "notre" signifient dans le cas de git rebase vs fusion. Voir ce lien

Git Rebase
theirs est en fait la branche courante dans le cas de rebase . Les commandes ci-dessous acceptent donc les modifications de votre branche actuelle sur la branche distante.

# see current branch
$ git branch
... 
* branch-a
# rebase preferring current branch changes during conflicts
$ git rebase -X theirs branch-b

Git Merge
Pour fusionner , la signification de theirs et ours est inversée. Donc, pour obtenir le même effet lors d’une fusion , c’est-à-dire conserver les modifications actuelles de votre branche (ours) sur la branche distante en cours de fusion (theirs) .

# assuming branch-a is our current version
$ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b
90
Abe

Notez que git checkout --ours|--theirs va écraser complètement les fichiers , en choisissant soit la version theirs ou ours, qui peut être ou ne pas être ce que vous voulez. vouloir faire (si vous avez des changements non conflictuels venant de l'autre côté, ils seront perdus).

Si, au lieu de cela, vous souhaitez effectuer une fusion à trois voies sur le fichier et résoudre uniquement les mecs en conflit à l'aide de --ours|--theirs, tandis que en gardant les mecs non en conflit des deux côtés en place, vous voudrez peut-être recourir à git merge-file; voir les détails dans cette réponse .

22
jakub.g