Résoudre un conflit de fusion «les deux ajoutés» dans git?

138

Je rebase dans git, et un conflit que j'obtiens est «tous les deux ajoutés» - c'est-à-dire que le même nom de fichier a été ajouté indépendamment dans ma branche et dans la branche sur laquelle je rebase. git statusdit moi:

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both added:         src/MyFile.cs

Ma question est la suivante: comment résoudre ce problème? Dois-je utiliser un outil de fusion ou y a-t-il un moyen de le faire uniquement à partir de la ligne de commande? Si je git rm src/MyFile.cs, comment git sait quelle version de fichier je veux supprimer et laquelle je veux conserver?

Jez
la source

Réponses:

139

Si vous utilisez git rmgit supprimera toutes les versions de ce chemin de l'index afin que votre action de résolution vous laisse sans aucune des deux versions.

Vous pouvez utiliser git checkout --ours src/MyFile.cspour choisir la version de la branche sur laquelle vous rebasez ou git checkout --theirs src/MyFile.cspour choisir la version de la branche que vous rebasez.

Si vous voulez un mélange, vous devez utiliser un outil de fusion ou le modifier manuellement.

CB Bailey
la source
1
Merci. Et je viens de réaliser que la raison pour laquelle l'outil de fusion ne fonctionnait pas était que git crée les fichiers .LOCAL et .REMOTE pour la fusion, mais pas le fichier .BASE. Je pense qu'il devrait simplement créer un fichier .BASE vide. Si vous créez manuellement le fichier .BASE vide, l'outil de fusion fonctionne correctement.
Jez
1
@Jez: S'il vous plaît voir ce fil: thread.gmane.org/gmane.comp.version-control.git/188776/…
CB Bailey
1
Alors, dites-vous que cela sera corrigé dans une version récente de git?
Jez
1
@Jez: C'est dans les versions git> = 1.7.9.1 git.kernel.org/?p=git/…
CB Bailey
21
De @Tom répond: Lorsque vous faites ... git checkout --ours someFile Il peut sembler que cela n'a rien fait lors de l'exécution de l'état git. N'oubliez pas de le faire par la suite. git add someFile git status
pec
72

Je trouve parfois déroutant d'utiliser les options --theirset --ourspour identifier la provenance du fichier. La plupart du temps, le mien sera dans la branche que je rebase à laquelle il est fait référence --theirs!

Vous pouvez aussi utiliser git checkout <tree-ish> -- src/MyFile.cs

Où le <tree-ish>peut être remplacé soit par le nom de la branche, soit par le commit-id qui contient le fichier que vous souhaitez conserver.

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs

Anas Alkhatib
la source
42

En faisant ...

git checkout --ours someFile

Il peut sembler que cela n'a rien fait lors de l'exécution de l'état git.

N'oubliez pas de le faire par la suite.

git add someFile
git status
À M
la source