Magit divide el trozo en dos trozos

34

Hay una pregunta sobre SO sobre la división de trozos usando magit, y las dos soluciones dadas son organizar la región (marcar una región, golpear la etapa) o reducir / hacer crecer todos los trozos usando +& -. Eso no es lo que busco.

En el búfer de estado de magit, quiero dividir un trozo en dos trozos, en el punto, o al menos en las líneas alrededor del punto.

Girando esto (disculpe mi mal formato de diferencia)

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

Dentro

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

Cuando el punto está en la barra.

Motivaciones:

  • bazsiendo una declaración de depuración, por lo que me gustaría eliminarla de la confirmación de foo& barsin deshacerme de ella.

  • bary bazestar solo parcialmente relacionado, lo que significa que sus cambios no deberían estar en la misma confirmación.

  • bares grande y bazpequeño, lo que hace que sea mucho más fácil dividir el trozo que seleccionarbar

  • Similar al último punto, digamos que una confirmación de 20 líneas contiene una sola línea en el medio que no debe ser puesta en escena. Sería más fácil dividir y colocar los dos trozos superiores e inferiores ignorando el del medio que usar la región.

  • Lo anterior puede surgir a veces cuando la presentación de diferencias separará el antes y el después de algo que ha sido modificado, y tendrá algo inútil en el medio. p.ej

@@ line
- old_foo
+ random stuff
+ new foo
Calamares
fuente
No hay nada en magit que pueda hacer esto. Incluso más que eso: el diseño de magit hace que esto sea probablemente imposible de codificar sin un gran rediseño del estado de magit.
Rémi
44
Gracias, tiene sentido. Desafortunadamente, lo mejor que se me ocurrió sería un poco de automatización para seleccionar hacia adelante o hacia atrás desde el punto y luego la puesta en escena. También vale la pena señalar (para las personas que no han usado la función antes) que puede usar la región tanto en el escenario como en el escenario. Por ejemplo, puede organizar un gran trozo, luego cambiar a la sección preparada y destrabar una línea en el medio. Pero coincidió con @MrBones en que una opción de trozo dividido sería más fácil que jugar con la selección.
glucas
Interesante, seleccionando 2 regiones distintas no adyacentes. +1
Nsukami _
1
Personalmente, pondría en escena todo el trozo y luego desestabilizaría la declaración de depuración. (Mi pre-commit gancho encaje realizaron instrucciones de depuración, por lo que no hay peligro de mí cometer uno.)
PHILS
1
No sé lo suficiente sobre Magit para ayudar, pero solo quiero señalar que el modo diff de Emacs tiene el comando diff-split-hunkque hace exactamente eso. IOW su solicitud es una forma de usar diff-split-hunk(o algo equivalente) desde el búfer de estado magit.
Stefan

Respuestas:

17

Como se menciona en los comentarios anteriores, Magit no admite dividir un trozo en múltiples trozos más allá de lo que es posible mediante el uso git diff -U<n>. Esto se debe a que Magit se basa en ese comando Git para crear las diferencias. Eso no va a cambiar, Magit siempre usará las diferencias que obtiene de Git tal como está.

(En realidad, Magit elimina algunos encabezados que no son realmente relevantes para los humanos, pero los restaura al aplicar los cambios. Pero dividir un trozo más allá de lo que -U<n>apoya es una historia completamente diferente, conduciría a un agujero de conejo: hay una razón por la cual Git no permite "trozos más pequeños", no podría aplicarlos).

Si bien Magit no admite la visualización de trozos más pequeños como se solicitó aquí, sí admite la aplicación de solo partes de un trozo. Cuando la región está activa durante la preparación, solo se aplica esa parte del trozo.

Eso no ayuda mucho cuando la parte que no debe ser puesta en escena está justo en el medio del texto que debe ser puesta en escena. Como otros han sugerido, lo que debe hacer en este caso es poner en escena todo el trozo y luego quitar el escenario de la línea que no desea comprometer en un segundo paso.

Eso, por supuesto, podría ser automatizado. La única forma en que puedo ver en qué se podría automatizar esto es "organizar el trozo actual, excepto en la región. Pero tengo algunas dudas sobre con qué frecuencia eso sería realmente útil y temo que no sería fácil implementarlo de manera robusta Por lo tanto, actualmente no tengo la intención de implementar esto.

tarsius
fuente
47

Puedes dividir trozos con Magit.

En lugar de dejar el cursor dentro del trozo, seleccione las líneas que desea poner en escena desde el trozo y presione s . Solo la parte seleccionada del trozo se organizará, mientras que el resto del trozo todavía se encuentra en el área no preparada.

De esa manera lo dividiste en dos. Creo que puedes usar el mismo mecanismo para mover partes de trozos al escondite. Al usar k simplemente purgarás parte del trozo.

Sven Rieke
fuente
3
En mi opinión, esta debería ser la respuesta aceptada, ya que satisface la solicitud (y he encontrado esta respuesta varias veces al intentar recordar cómo hacer esto).
chaseadamsio
2
Sí, esto debería ser aceptado como respuesta!
copyninja
3

Si desea descartar partes de un trozo, seleccione las líneas dentro del trozo que desea descartar y presione x .

NeilDurant
fuente