web-dev-qa-db-fra.com

Comment forcer une fusion pour réussir quand il y a des conflits?

J'essaie de fusionner une demande d'extraction comportant un conflit dans un fichier (voir ci-dessous). Les instructions pour fusionner la demande d'extraction sont fournies par github sont les suivantes. Il est important d’effectuer cette fusion pour que la personne qui soumet le pr en soit créditée.

# Step 1: From your project repository, check out a new branch and test the changes.
git checkout -b droark-master master
git pull https://github.com/droark/cryptopp.git master

# Step 2: Merge the changes and update on GitHub.
git checkout master
git merge --no-ff droark-master
git Push Origin master

Je sais comment réparer la ligne dans le fichier en conflit. Ce que je ne sais pas faire, c'est que Git effectue la fusion et cesse de se plaindre des fichiers d'index cassés.

Comment faire en sorte que Git effectue la fusion, que la personne à l'origine de la demande de tirage en ait le crédit et qu'elle arrête de casser les fichiers d'index?


J'ai essayé de réparer la fusion avec erreurs de fusion Git . Un ensemble d'erreurs se transforme en un autre ensemble d'erreurs, à l'infini . J'ai également essayé de réinitialiser le fichier posant problème suivant Ignorer les fichiers lors de la fusion avec l'intention de copier/coller la seule ligne nécessaire, mais l'index cassé persiste.

Cela s'est transformé en une perte de temps totale, et je ne suis plus intéressé à essayer de le faire à la manière de Git, car cela lui fait perdre beaucoup de temps. Maintenant, je veux simplement que Git effectue la fusion et arrête de casser les fichiers d'index.


Voici la sortie produite lors de la fusion en utilisant les instructions de github:

$ git pull https://github.com/droark/cryptopp.git master
From https://github.com/droark/cryptopp
 * branch            master     -> FETCH_HEAD
Auto-merging validate.h
Auto-merging validat2.cpp
Auto-merging validat1.cpp
Auto-merging test.cpp
CONFLICT (content): Merge conflict in test.cpp
Auto-merging pubkey.h
Automatic merge failed; fix conflicts and then commit the result.
16
jww

Il n'y a aucun moyen de fusionner sans résoudre les conflits. Sinon, comment git pourrait-il savoir quoi fusionner? Vous pouvez toutefois extraire la version de l'une des branches que vous fusionnez à l'aide de git checkout --ours <filepath> ou git checkout --theirs <filepath>. Voici un exemple:

Supposons que vous soyez sur la branche principale fusionnée dans la mise en scène:

git checkout master
git merge staging

Et git montre un tas de conflits:

...
CONFLICT: Readme.md
...

Si vous voulez conserver la version de Readme.md c'est sur maître, alors vous courriez:

git checkout --ours Readme.md

Notez que puisque vous êtes sur maître --ours fait référence à "cette" branche, c’est-à-dire maître.

Maintenant, vous pouvez simplement l'ajouter à l'index pour le marquer comme résolu:

git add Readme.md

Cela ignore effectivement les modifications apportées à Readme.md sur la branche staging.

Vous pouvez répéter cette procédure pour chaque fichier que vous souhaitez exclure de la fusion. Lorsque vous avez terminé, commettez comme vous le feriez normalement:

git commit -m "whatever..."

Afin de le répéter pour tous les fichiers avec des conflits, vous pouvez le faire

for f in $(git diff --name-only --diff-filter=U | cat); do
   echo "Resolve conflict in $f ..."
   git checkout --theirs $f
done
21
Anthony E

Il n’ya aucun moyen de résoudre les conflits, c’est comme ça que le contrôle de révision fonctionne (si Alice dit "a" et Bob dit "b", comment Git devrait-il savoir laquelle est correcte à moins que vous le dire?). Tout ce que vous pouvez faire est de demander à git de les résoudre eux-mêmes lors de la fusion de l'une des plusieurs façons possibles , par exemple.

git merge -s recursive -X theirs <branch>

(-s recursive est la valeur par défaut lorsqu'il n'y a qu'un seul <branch> afin que vous puissiez l'omettre ici)

Maintenant que vous avez déjà un conflit dans votre arbre, vous pouvez soit

  • suivez le voie de résolution manuelle
    • éditez le fichier à votre guise
    • git add it (add dans Git sert également à marquer un fichier comme résolu)
    • git commit pour compléter la fusion; ou
  • restaurer l'état de pré-fusion avec git merge --abort et recommencez la fusion avec les options de résolution automatique susmentionnées
13
ivan_pozdeev

Résoudre un conflit revient à traiter avec tout autre travail en cours. Tous les changements doivent être organisés (git add) et ensuite commis. Les fichiers ayant été fusionnés avec succès sont déjà mis en scène. Les fichiers en conflit ne sont pas.

Éditez les fichiers en conflit à votre satisfaction, mettez-les en scène (git add), et quand tout est fini, git commit.

Dans votre cas en particulier ...

  • Modifier test.cpp pour résoudre les conflits (ils ont <<<< Marqueurs)
  • git add test.cpp
  • Exécutez vos tests pour vous assurer que tout va bien.
  • git commit
4
Schwern

Pousser le développement en master

git Push --force Origin branchA:branchB

Cela forcera une fusion puis Push

3
ShadowCore