Recientemente descubrí la patch
opción de git para el add
comando, y debo decir que realmente es una característica fantástica. También descubrí que un trozo grande podría dividirse en trozos más pequeños spresionando la tecla, lo que se suma a la precisión de la confirmación. Pero, ¿qué pasa si quiero aún más precisión, si el trozo dividido no es lo suficientemente pequeño?
Por ejemplo, considere este trozo ya dividido:
@@ -34,12 +34,7 @@
width: 440px;
}
-/*#field_teacher_id {
- display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
width: 300px;
}
¿Cómo puedo agregar la eliminación de comentarios CSS solo a la próxima confirmación? ¡La s
opción ya no está disponible!
-
caracteres, y Git se quejó de que mi parche no se aplicaba.git add -p
y editando un trozo cone
eso solo debería afectar lo que se organizó, no su árbol de trabajo.Digamos que se
example.css
ve así:Ahora cambiemos los selectores de estilo en el bloque del medio, y mientras lo hacemos, eliminemos un estilo antiguo comentado que ya no necesitamos.
Eso fue fácil, ahora comprometámonos. Pero espere, quiero mantener una separación lógica de los cambios en el control de versiones para una simple revisión de código paso a paso, y para que mi equipo y yo podamos buscar fácilmente en el historial de confirmaciones detalles.
Eliminar el código antiguo está lógicamente separado del otro cambio de selector de estilo. Vamos a necesitar dos confirmaciones distintas, así que agreguemos trozos para un parche.
Vaya, parece que los cambios están demasiado cerca, por lo que git los ha juntado.
Incluso tratar de dividirlo presionando stiene el mismo resultado porque la división no es lo suficientemente granular para nuestros cambios de precisión. Se requieren líneas sin cambios entre las líneas cambiadas para que git pueda dividir automáticamente el parche.
Por lo tanto, vamos a manualmente editar pulsandoe
git abrirá el parche en nuestro editor de elección.
Repasemos el objetivo:
Queremos dividir esto en dos commits:
La primera confirmación implica eliminar algunas líneas (eliminación de comentarios).
Para eliminar las líneas comentadas, solo déjelas en paz, ya están marcadas para rastrear las eliminaciones en el control de versiones tal como lo deseamos.
-/*#field_teacher_id {
- display: block;
-} */
La segunda confirmación es un cambio, que se rastrea registrando eliminaciones y adiciones:
Eliminaciones (se eliminaron las líneas de selección antiguas)
Para mantener las líneas de selección antiguas (no las elimine durante esta confirmación), queremos ...
... que literalmente significa reemplazar los
-
signos menos con uncarácter de espacio .
Entonces estas tres líneas ...
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
... se convertirá ( observe el espacio único en la primera de las 3 líneas):
form.table-form #field_teacher + label,
form.table-form #field_producer_distributor + label {
Adiciones (nueva línea de selector agregada)
Para no prestar atención a la nueva línea de selector agregada durante esta confirmación, queremos ...
... que literalmente significa eliminar toda la línea:
+#user-register form.table-form .field-type-checkbox label {
(Bonificación: si está utilizando vim como su editor, presione ddpara eliminar una línea. Los usuarios de Nano presionan Ctrl+ K)
Su editor debería verse así cuando guarde:
Ahora comprometámonos.
Y solo para asegurarnos, veamos los cambios desde la última confirmación.
Perfecto: puede ver que solo las eliminaciones se incluyeron en esa confirmación atómica. Ahora terminemos el trabajo y comencemos el resto.
Finalmente, puede ver que la última confirmación solo incluye los cambios del selector.
fuente
+
por#
. El resultado es el mismo, pero tal vez te sientas incómodo con la eliminación (y no puedas revertirlo) o quieras experimentar antes de guardar.r
#
acabó el plus xDSi puede usar git gui, le permite organizar los cambios línea por línea. Desafortunadamente, no sé cómo hacerlo desde la línea de comandos, o incluso si es posible.
Otra opción que he usado en el pasado es deshacer parte del cambio (mantener el editor abierto), confirmar los bits que quiero, deshacer y volver a guardar desde el editor. No es muy elegante, pero hace el trabajo. :)
EDITAR (uso de git-gui):
No estoy seguro de si el git-gui es el mismo en las versiones de msysgit y linux, solo he usado el msysgit. Pero suponiendo que sea lo mismo, cuando lo ejecuta, hay cuatro paneles: el panel superior izquierdo es su directorio de trabajo cambia, el inferior izquierdo es su etapa de cambios, arriba a la derecha es la diferencia para el archivo seleccionado (ya sea el directorio de trabajo o por etapas), y la parte inferior derecha es para la descripción de la confirmación (sospecho que no la necesitará). Cuando haces clic en un archivo en la esquina superior derecha, verás la diferencia. Si hace clic derecho en una línea de diferencia, verá un menú contextual. Las dos opciones a tener en cuenta son "stage hunk for commit" y "stage line for commit". Sigue seleccionando "línea de escenario para confirmar" en las líneas que desea confirmar, y ya está. Incluso puede seleccionar varias líneas y ponerlas en escena si lo desea.
En cuanto a la confirmación, puede usar la herramienta GUI o la línea de comando.
fuente
git-gui
pero no tengo idea de cómo lograr lo que estás describiendo.Una forma de hacerlo es omitir el fragmento,
git add
lo que sea que necesite, y luego ejecutargit add
volver a . Si este es el único fragmento, podrás dividirlo.Si le preocupa el orden de las confirmaciones, simplemente utilícelas
git rebase -i
.fuente
git add -p
nuevo, pero no puedo dividirlo. Entiendo esto:Stage this hunk [y,n,q,a,d,/,e,?]?
y luego presionar 's' imprime la ayuda. Por cierto, ¿querías decir queadd patch
nopatch add
? ¿O hay ungit patch
complemento que debo instalar?git rebase -i
. Cuál es más flexible quecommit --amend