Je suis en train de rebaser après a 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, j'ouvre simplement le fichier ou un outil de fusion et accepte manuellement toutes "leurs" ou "mes" modifications. Cependant, je soupçonne que je manque une commande git pratique.
Notez également que je ne pourrai choisir une stratégie de fusion pour chaque fichier que lorsque je verrai quels fichiers sont en conflit et éventuellement quels sont les conflits.
git
git-rebase
git-merge-conflict
Steven Wexler
la source
la source
Réponses:
Pour chaque fichier en conflit que vous obtenez, vous pouvez spécifier
À partir des
git checkout
documentsla source
git rebase -s recursive -X <ours/theirs>
ougit merge -s recursive -X <ours/theirs>
. Gardez à l'esprit que pour un rebase, «le nôtre» et «le leur» sont inversés par rapport à ce qu'ils sont lors d'une fusion. Vous pourriez probablement aussi utiliser un glob de fichier / shell, commegit checkout --theirs -- *.txt
.ours/theirs
rebase me rendait fou !! (Il est logique maintenant que je pense à la façon dont un rebase fonctionne réellement, mais pas du tout intuitif.)git checkout --outs -- "**/*.csproj"
ferez ce que vous voulez dire. La même chose est vraie, par exemple pourgit lfs track "*.jpg"
. Si vous avez des fichiers jpg dans votre CWD, sans les guillemets, seuls ceux-ci seront suivis.Même si cette question reçoit une réponse, elle fournit un exemple de ce que «leur» et «le nôtre» signifient dans le cas de git rebase vs merge. Voir ce lien
Git Rebase
theirs
est en fait la branche actuelle dans le cas de rebase . Ainsi, l'ensemble de commandes ci-dessous accepte réellement vos modifications de branche actuelles sur la branche distante.Git Merge
Pour fusion , le sens de
theirs
etours
est inversé. Donc, pour obtenir le même effet lors d'une fusion , c'est-à-dire, conservez vos modifications de branche actuelles (ours
) sur la branche distante fusionnée (theirs
).la source
Notez que
git checkout --ours|--theirs
va écraser les fichiers entièrement , en choisissant soittheirs
ou laours
version, ce qui pourrait être ou ne pas être ce que vous voulez faire (si vous avez des modifications non conflictuelles provenant de l'autre côté, ils seront perdus).Si, à la place, vous souhaitez effectuer une fusion à trois sur le fichier et résoudre uniquement les mecs en conflit à l' aide
--ours|--theirs
, tout en conservant les mecs non en conflit des deux côtés en place, vous souhaiterez peut-être recourir àgit merge-file
; voir les détails dans cette réponse .la source
example.txt
dans laours
version, on est en conflit (également changé dans latheirs
révision), autre est non conflictuel. Si vous le faitesgit checkout --theirs example.txt
, il lira à l'aveuglette tout le fichier lors de latheirs
révision, et la partie non conflictuelle du diff sera perdue.git checkout --merge <path>
.