git - conflit de fusion lorsque local est supprimé mais que le fichier existe dans distant

116

Je suis très nouveau dans git et je me suis demandé comment je devrais procéder à une fusion où, dans le dépôt local, j'ai supprimé plusieurs fichiers sur la branche master mais ces fichiers existent dans la branche master distante.

Après avoir fait git-merge, il montre les conflits qui se sont produits.

En utilisant git gui, cela montre que le fichier local est supprimé, tandis que le fichier de branche distante a son contenu.

Comment empêcher ces fichiers d'être en conflit? Existe-t-il un moyen simple d'utiliser git gui?

Merci beaucoup

créations binaires
la source
Dans le passé, une chose que j'ai faite est de laisser les fichiers "supprimés" dans le contrôle de code source, mais de les exclure du projet / makefile / peu importe. C'est une solution de contournement temporaire correcte pour les conflits de fusion, au moins.
Mark Rushakoff
2
Vous le corrigez de la même manière que vous corrigez tout conflit de fusion: ajoutez la version souhaitée (soit le fichier, soit l'absence de fichier) à l'index, puis validez. Lequel veut-tu?
Cascabel
@MarkRushakoff Je reformulerais votre conseil comme suit: "quand je rencontre une situation où j'ai besoin de résoudre le conflit, je ne résous tout simplement pas ceux-ci pour de vrai, masque-les simplement pour qu'ils mordent quelqu'un (probablement pas moi) à l'avenir". C'est vraiment un bon conseil pour quelqu'un qui voudrait apporter plus de problèmes dans le projet.
Victor Yarema

Réponses:

155

Vous devez résoudre les conflits comme bon vous semble. Si le fichier est vraiment censé être supprimé et que vous publiez ce changement d'origine, supprimez-le à nouveau:

git rm path/to/file

Si le fichier doit en fait encore être suivi, ajoutez-le (la version dans l'arborescence de travail sera la version d'origine):

git add path/to/file

Après avoir effectué l'une de ces opérations pour résoudre le conflit, validez la fusion.

Cascabel
la source
J'avais plusieurs fichiers, tous dans le même répertoire et tous avec le même suffixe. Existe-t-il un raccourci pour les supprimer tous à la fois tout en préservant le reste des fichiers dans le répertoire?
chiborg
@chiborg: C'est juste une question shell. cddans le répertoire, et git rm *.ext. Votre shell (pas Git) s'étend *.extà tous les noms de fichiers correspondants.
Cascabel
Et si je veux conserver certains des fichiers? git rmn'a pas de -idrapeau.
chiborg
@chiborg: Vous avez dit que vous vouliez tout supprimer avec un suffixe donné et laisser tout le reste intact. C'est exactement ce que je vous ai dit comment faire. Ou vouliez-vous dire git rm *-suffix.ext? Même différence. Si vous rencontrez un problème pour comprendre comment utiliser les caractères génériques du shell, demandez sur unix.stackexchange.com. Si vous savez pertinemment que ce que vous voulez ne peut pas être fait avec le globbing, utilisez rm -iet suivez avec git add -upour récupérer les suppressions.
Cascabel
2
@Jefromi, si je précise -s recursive -X ours, pourquoi est-il encore nécessaire de git rmet git add?
Noel Yap
27

Comme astuce supplémentaire en plus de la réponse acceptée, dans un "supprimé par nous" , si vous souhaitez voir les modifications qui ont été apportées au fichier supprimé afin que vous puissiez appliquer ces modifications ailleurs, vous pouvez utiliser:

git diff ...origin/master -- path/to/file

S'il s'agit d'un scénario «supprimé par eux» et que vous souhaitez voir les modifications afin de pouvoir les appliquer ailleurs, vous pouvez utiliser:

git diff origin/master... -- path/to/file
Joseph Ravenwolfe
la source
6
Oui! Ceci est crucial si vous ne voulez pas simplement supprimer les modifications que vous fusionnez, comme quand un fichier vient d'être renommé ou que son contenu a été déplacé avant la suppression du fichier.
Edward Anderson
8
Pour rappel: cela ne fonctionne pas lorsque le conflit se produit lors du rebasage . Besoin d'être explicite commegit diff mybranch@{1}...origin/master -- path/to/file
nschum
@nschum Merci! C'est précisément ce que je recherchais.
Chuim le
2
Vous pouvez également utiliser git diff --base(voir mon autre réponse).
Dorian Marchal
Salut Joseph, je suis toujours coincé même si cette réponse semble prometteuse. Si vous avez un moment, j'aimerais que vous répondiez ici: stackoverflow.com/q/63044843/470749 Merci!
Ryan
9

Dans Git GUI, vous sélectionnez le fichier en conflit, puis cliquez avec le bouton droit sur la zone de texte principale où le texte en conflit est affiché.

Dans le menu contextuel qui apparaît, vous pouvez choisir d'aller avec "Remote" ou aller avec "Local". Ainsi, si un fichier est supprimé à distance, vous pouvez choisir «Distant» pour propager la suppression localement, et vice versa.

Il m'a fallu un mois pour le comprendre ... ce serait bien si l'interface graphique Git avait réellement de la documentation ...

Joël Freeman
la source
4

La réponse la mieux notée se concentre sur la manière de résoudre le conflit.

Avant cela, vous voulez probablement savoir ce que la télécommande a changé dans les fichiers supprimés localement.

Pour ce faire, vous pouvez voir les changements avec:

git diff --base

Depuis https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

Comparez l'arbre de travail avec la version "de base" [...]. L'index contient ces étapes uniquement pour les entrées non fusionnées, c'est-à-dire lors de la résolution des conflits.

Dorian Marchal
la source
Voici une bonne explication de git diff --base stackoverflow.com/a/60484874/470749
Ryan le
0

Dans EGit j'ai également trouvé des problèmes. Ma solution était:

  • Utilisé la vue Git Staging.
  • Double-cliqué sur chaque fichier affiché sur les modifications non mises en scène pour ouvrir le comparateur
  • Cliquez sur l'icône "Tout copier de gauche à droite"
  • Enregistrer le fichier (il disparaîtra de la liste non mise en scène)
Borjab
la source
0

Comme indiqué dans cette réponse utile à une question connexe , vous pouvez utiliser git mergetoolpour ouvrir une boîte de dialogue dans laquelle vous pouvez choisir si vous souhaitez prendre la version modifiée ou supprimée du ou des fichiers.

Amos Egel
la source