Magit a divisé le morceau en deux mecs

34

Il y a une question sur SO à propos de la division des mecs en utilisant magit, et les deux solutions proposées sont soit de mettre en scène la région (marquer une région, frapper la scène), soit de réduire / agrandir tous les mecs en utilisant +& -. Ce n'est pas ce que je recherche.

Dans le tampon d'état de magit, je veux diviser un morceau en deux morceaux, au point, ou au moins aux lignes autour du point.

Tourner cela (excusez mon mauvais formatage diff)

@@ blah blah blah
- foo
+ bar
+ baz
+

Dans

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

Lorsque le point est sur la barre.

Motivations:

  • bazétant une déclaration de débogage, je voudrais donc la supprimer de la validation de foo& barsans m'en débarrasser.

  • baret bazn'étant que partiellement liés, ce qui signifie que leurs modifications ne devraient pas être dans le même commit.

  • barest grand et bazpetit, ce qui facilite beaucoup la division du morceau plutôt que la sélectionbar

  • Semblable au dernier point, disons qu'un commit de 20 lignes contient une seule ligne au milieu qui ne doit pas être mise en scène. Il serait plus facile de diviser et de mettre en scène les deux mecs supérieurs et inférieurs en ignorant celui du milieu que d'utiliser la région.

  • Ce qui précède peut survenir parfois lorsque la présentation diff sépare l'avant et l'après de quelque chose qui a été modifié et a quelque chose de inutile au milieu. par exemple

@@ line
- old_foo
+ random stuff
+ new foo
Squidly
la source
Il n'y a rien dans magit qui puisse faire ça. C'est encore plus que cela: la conception de magit rend cela probablement impossible à coder sans une vaste refonte du statut de magit.
Rémi
4
Merci, c'est logique. Malheureusement, le mieux que je puisse penser serait une certaine automatisation autour de la sélection vers l'avant ou vers l'arrière à partir du point, puis la mise en scène. Il convient également de noter (pour les personnes qui n'ont jamais utilisé la fonctionnalité auparavant) que vous pouvez utiliser la région pour mettre en scène et sur scène. Par exemple, vous pouvez mettre en scène un gros morceau, puis basculer vers la section mise en scène et supprimer une ligne au milieu. Mais je suis d'accord avec @MrBones qu'une option de segment partagé serait plus facile que de jouer avec la sélection.
glucas
Intéressant, sélection de 2 régions distinctes non adjacentes. +1
Nsukami _
1
Personnellement, je mettrais en scène tout le morceau, puis décortiquais la déclaration de débogage. (Mon crochet de pré-validation attrape les déclarations de débogage par étapes, donc je ne risque pas d'en commettre une.)
phils
1
Je ne sais pas assez sur Magit pour vous aider, mais je veux juste souligner que le mode diff d'Emacs a la commande diff-split-hunkqui fait exactement cela. IOW votre demande est pour un moyen d'utiliser diff-split-hunk(ou quelque chose d'équivalent) à partir du tampon d'état magit.
Stefan

Réponses:

17

Comme mentionné dans les commentaires ci-dessus, Magit ne prend pas en charge la division d'un morceau en plusieurs morceaux au-delà de ce qui est possible en utilisant git diff -U<n>. C'est parce que Magit s'appuie sur cette commande Git pour créer les diffs. Cela ne va pas changer, Magit utilisera toujours les différences qu'il obtient de Git en l'état.

. ( En fait Magit décaper des en- têtes qui ne sont pas vraiment pertinents pour les humains, mais ne les restaure lors de l' application des modifications Mais le fractionnement d' un gros morceau plus loin que ce qui -U<n>soutient est une toute autre histoire, cela conduirait dans un trou de lapin - il y a une raison pour laquelle Git ne permet pas les "petits mecs", il ne pourrait pas les appliquer).

Bien que Magit ne prenne pas en charge l'affichage de petits morceaux comme demandé ici, il ne prend en charge que l'application de certaines parties d'un morceau. Lorsque la région est active pendant la mise en scène, seule cette partie du morceau est appliquée.

Cela n'aide pas beaucoup lorsque la partie qui ne doit pas être mise en scène est en plein milieu du texte qui doit être mis en scène. Comme d'autres l'ont suggéré, ce que vous devez faire dans ce cas est de mettre en scène l'intégralité du morceau, puis de mettre en scène la ligne que vous ne voulez pas engager dans une deuxième étape.

Cela pourrait bien sûr être automatisé. La seule façon dont je peux voir comment cela pourrait être automatisé est de «mettre en scène le morceau actuel, sauf pour la région. . Et je n'ai donc pas l'intention de le mettre en œuvre actuellement.

tarse
la source
47

Vous pouvez diviser des mecs avec Magit.

Au lieu de simplement laisser le curseur à l'intérieur du morceau, sélectionnez les lignes que vous souhaitez mettre en scène à partir du morceau et appuyez sur s . Seule la partie sélectionnée du morceau sera mise en scène, tandis que le reste du morceau se trouve toujours dans la zone non mise en scène.

De cette façon, vous l'avez divisé en deux. Je pense que vous pouvez utiliser le même mécanisme pour déplacer des pièces de mecs dans la cachette. Lorsque vous utilisez k, vous purgerez simplement une partie du morceau.

Sven Rieke
la source
3
OMI, cela devrait être la réponse acceptée, car elle répond à la demande (et j'ai trouvé cette réponse plusieurs fois en essayant de me rappeler comment faire).
chaseadamsio
2
Oui, cela devrait être accepté comme réponse!
copyninja
3

Si vous souhaitez supprimer des parties d'un morceau, sélectionnez les lignes du morceau que vous souhaitez supprimer et appuyez sur x .

NeilDurant
la source