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