92 votes

git add --interactive "Votre morceau modifié ne s'applique pas"

Je suis en train d'utiliser la commande git add --interactive pour sélectivement ajouter quelques modifications à mon index, mais je ne cesse de recevoir de la "éditée beau gosse ne s'applique pas. Éditer à nouveau..." message. Je reçois ce message même si je choisis le [e]dit option, et immédiatement enregistrer/fermer mon éditeur. En d'autres termes, sans modifier le beau gosse à tous, le patch ne s'applique pas.

Ici exactement l'exemple que j'utilise (je suis en train de mettre en place un petit démo):

Fichier d'origine:

first change
second change
third change
fourth change

Nouveau fichier:

Change supporting feature 1
first change
second change
third change
fourth change
bug fix 1
change supporting feature 1

J'essaie de montrer comment utiliser la commande git add --interactive de n'ajouter que le "bug fix 1" ligne à l'index. L'exécution interactive ajouter sur le fichier, je choisis le mode patch. Il présente avec moi

diff --git a/newfile b/newfile
index 6d501a3..8b81ae9 100644
--- a/newfile
+++ b/newfile
@@ -1,6 +1,9 @@
+Change supporting feature 1
 first change
 second change off branch
 third change off branch
 second change
 third change
 fourth change
+bug fix 1
+change supporting feature 1

- Je répondre à split, suivi par "non" à appliquer le premier morceau. Le deuxième morceau, j'essaie de modifier. J'ai d'abord essayé de la suppression de la ligne de fond - qui n'ont pas de travail. Laissant le beau gosse complètement seul ne fonctionne pas non plus, et je ne peux pas comprendre pourquoi.

Merci pour l'aide.

Josh

114voto

VonC Points 414372

Est-ce comme dans cette git-ajouter un post?

Éditer manuellement le beau gosse est très puissant, mais également un peu compliqué si vous ne l'avez jamais fait avant.
La chose la plus importante à garder à l'esprit: La diff est toujours en retrait avec un caractère en outre à ce que d'autres indentation est là.
Le personnage peut être soit:

  • un espace (indique que le changement de ligne),
  • un - indiquant que la ligne a été supprimée,
  • ou un + , indiquant que la ligne a été ajoutée.

Rien d'autre. Il doit être un espace, un - ou un +. Rien d'autre, et vous obtiendrez des erreurs
(il n'y a pas de personnage pour un changement de ligne, car ceux-ci sont gérées par la suppression de l'ancienne ligne, et l'ajout de la modification de l'un comme de nouvelles).

Puisque vous avez la diff ouvrir dans votre éditeur de texte favori (vous n'avez configurer Git pour utiliser votre éditeur de texte préféré, non?), vous pouvez faire ce que vous voulez, tant que vous vous assurez que le résultant diff s'applique proprement.

Et c'est là que réside l'astuce. Si vous n'avez jamais fait cela avant, Git va vous dire "Votre édité beau gosse ne s'applique pas. Éditer à nouveau?" très souvent, vous allez commencer à vous détester pour votre incapacité à comprendre cela, même si cela semble si facile (ou Git car il ne peut pas comprendre ce que vous voulez).

Une chose qui a déclenché moi assez souvent est que j'ai oublié l'un caractère tiret.
J'avais tracez une ligne avec un à être supprimé, mais dans la plupart des éditeurs de texte qui insère un -, il n'est pas remplacer l'espace qui était là avant. Cela signifie que vous êtes en train d'ajouter un espace supplémentaire pour l'ensemble de la ligne, qui à son tour signifie que l'algorithme de comparaison ne peut pas trouver/correspondre à la ligne dans le fichier d'origine, ce qui signifie Git va hurler à vous.

L'autre chose est que la diff a encore du sens. "Sens" signifie qu'elle peut être appliquée correctement. Exactement comment vous créer un bon diff semble un peu sombre de l'art (au moins pour moi), mais vous devez toujours garder à l'esprit la façon dont le fichier d'origine ressemblait, et ensuite planifier votre -s +et s en conséquence. Si vous modifiez vos mecs assez souvent vous finirez par obtenir le blocage de celui-ci.

53voto

Niels Ganser Points 341

Bien sûr, je suis en retard pour cela, mais néanmoins je voulais mentionner pour mémoire que ce problème a été discuté l'année dernière sur le git liste de diffusion et il semble que pas beaucoup de choses ont changé depuis.

L'analyse posté par Jeff King, de le problème sous-jacent est essentiellement:

Hm. OK, je vois. Le "est-ce le diff appliquer" vérifier alimente les deux parties de le split patch git-appliquer. Mais bien sûr, la deuxième partie ne sera jamais appliquer correctement, parce que son contexte chevauche la première partie, mais ne pas le prendre en compte.

Faire le chèque avec juste édité le patch serait le travail. Mais que ne pas prendre en compte le fait que votre édité patch sera potentiellement échouer à appliquer sur le long terme, en fonction de si oui ou non vous acceptez l' l'autre moitié de la scission de patch. Et nous ne savons pas encore, parce que le l'utilisateur ne peut pas nous ont dit (ils pourraient avoir sauté de la première moitié, et puis y revenir plus tard, après l'étape edition).

Jeff conclut son poste avec une très pragmatique solution de contournement qui réussit toujours, et est donc fortement recommandé:

Donc, en général, je pense que le fractionnement et l'édition du même morceau est intrinsèquement dangereux et va conduire à ces sortes de problèmes. Et parce que l'édition offre un sur-ensemble de la fonctionnalité, je pense que vous devriez il suffit d'éditer et de laisser la première partie du morceau à appliquer ou pas selon votre préférence.

37voto

William Pursell Points 56211

Pour cet exemple particulier, vous devez modifier les numéros de ligne dans le morceau. Changer la ligne:

@@ -1,6 +2,8 @@

de sorte qu'il se lise à la place:

@@ -2,7 +2,8 @@

19voto

Rose Perrone Points 14478

Lorsque vous ne souhaitez pas supprimer une ligne dont la suppression a été planifiée, comme dans

  first line
-second line
 third line
 

Si vous souhaitez conserver la deuxième ligne, veillez à remplacer le - par un espace plutôt que de supprimer la ligne entière (comme vous le feriez pour vous débarrasser d'une ligne ajoutée). Git utilisera la ligne pour le contexte.

17voto

Sedrik Points 659

J'ai récemment compris à la lecture de ce fil comment travailler le manuel de montage.

L'astuce que j'ai utilisé était que si j'ai un diff de ce genre.

+ Line to add
+ Line to add
+ Line I dont want to include
+ Line I dont want to include

L'astuce consiste à supprimer les deux lignes, je ne veux pas complètement que la diff à la recherche de ce genre.

+ Line to add
+ Line to add

Bien que cela soit plus likley évident pour la plupart des gens, il n'était pas pour moi jusqu'à aujourd'hui et j'ai pensé que je devrais juste partager mon expérience. S'il vous plaît dites-moi si il y a danger de cette méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X