¿Hay alguna forma en que pueda esconder solo mis cambios por etapas? El escenario con el que estoy teniendo problemas es cuando he trabajado en varios errores en un momento dado y tengo varios cambios sin clasificar. Me gustaría poder organizar estos archivos individualmente, crear mis archivos .patch y guardarlos hasta que se apruebe el código. De esta manera, cuando se aprueba, puedo esconder toda mi sesión (actual), reventar ese error y presionar el código.
¿Voy por esto de la manera incorrecta? ¿Estoy malinterpretando cómo git puede funcionar de otras maneras para simplificar mi proceso?
Respuestas:
Sí, es posible con DOUBLE STASH
git stash --keep-index
. Este comando creará un alijo con TODOS sus cambios (en etapas y sin etapas ), pero dejará los cambios en etapas en su directorio de trabajo (todavía en estado).git stash push -m "good stash"
"good stash"
tiene archivos organizados .Ahora, si necesita archivos sin clasificar antes de la ocultación, simplemente aplique la primera ocultación ( la creada con
--keep-index
) y ahora puede eliminar los archivos que guardó"good stash"
.Disfrutar
fuente
-u
interruptor.git stash apply --index
opción de uso de cambios sin etapas . Esto intentará mantener su estado no (en etapas). Ahora es más fácil eliminar los cambios no deseados del árbol de trabajo.Con el último git puedes usar la
--patch
opciónY git le pedirá cada cambio en sus archivos para agregar o no al escondite.
Solo respondes
y
on
UPD
Alias para DOBLE STASH :
Ahora puede organizar sus archivos y luego ejecutarlos
git stash-staged
.Como resultado, sus archivos almacenados se guardarán en el alijo .
Si no desea mantener los archivos almacenados y desea moverlos a un alijo. Luego puede agregar otro alias y ejecutar
git move-staged
:fuente
-u|--include-untracked
opción degit-stash
Hice un guión que oculta solo lo que está escenificado actualmente y deja todo lo demás. Esto es increíble cuando empiezo a hacer muchos cambios no relacionados. Simplemente ponga en escena lo que no está relacionado con la confirmación deseada y oculte solo eso.
(Gracias a Bartłomiej por el punto de partida)
fuente
Aquí hay una línea simple:
Y para agregar un mensaje simplemente:
fuente
Para lograr lo mismo ...
git commit -m 'temp'
git add .
git stash
git reset HEAD~1
Auge. Los archivos que no quieres están guardados. Los archivos que desea están listos para usted.
fuente
En este escenario, prefiero crear nuevas sucursales para cada problema. Uso un prefijo temp /, así que sé que puedo eliminar estas ramas más tarde.
Organice los archivos que corrigen el bug1 y confírmelos.
Luego, puede seleccionar los commits de las ramas respectivas según sea necesario y enviar una solicitud de extracción.
fuente
¿Por qué no confirma el cambio para un error determinado y crea un parche a partir de ese compromiso y su predecesor?
Luego, para crear los parches apropiados, use
git format-patch
:Esto creará dos archivos:
0001-fix-bug-123.patch
y0002-fix-bug-321.patch
O puede crear ramas separadas para cada error, de modo que pueda fusionar o volver a crear correcciones de errores individualmente, o incluso eliminarlas, si no funcionan.
fuente
git stash --keep-index
es una buena solución ... excepto que no funcionó correctamente en las rutas que se han eliminado, lo que se ha solucionado en Git 2.23 (Q3 2019)Ver commit b932f6a (16 de julio de 2019) por Thomas Gummerer (
tgummerer
) .(Fusionada por Junio C Hamano -
gitster
- en commit f8aee85 , 25 jul 2019)fuente
Esconder solo el índice (cambios por etapas) en Git es más difícil de lo que debería ser. Encontré que la respuesta de @Joe funciona bien, y convertí una pequeña variación en este alias:
Empuja tanto la puesta en escena y cambios unstaged en un escondite temporal, dejando el cambio por etapas solos. Luego empuja los cambios por etapas en el alijo, que es el alijo que queremos mantener. Los argumentos pasados al alias, como
--message "whatever"
se agregarán a este comando de ocultación. Finalmente, muestra el alijo temporal para restaurar el estado original y elimina el alijo temporal, y luego finalmente "elimina" los cambios escondidos del directorio de trabajo a través de una aplicación de parche inverso.Para el problema opuesto de esconder solo los cambios no escalonados (alias
stash-working
), vea esta respuesta .fuente
¿Es absolutamente necesario trabajar en varios errores a la vez? Y por "a la vez", quiero decir "tener archivos editados para múltiples errores al mismo tiempo". Porque a menos que lo necesite absolutamente, solo trabajaría en un error a la vez en su entorno. De esa manera, puede usar sucursales locales y rebase, lo cual me parece mucho más fácil que administrar un alijo / escenario complejo.
Digamos que master está en commit B. Ahora trabaje en el bug # 1.
Ahora estás en la rama bug1. Realice algunos cambios, confirme, espere la revisión del código. Esto es local, por lo que no está afectando a nadie más, y debería ser bastante fácil hacer un parche de git diffs.
Ahora estás trabajando en bug2. Ir volver a principal con
git checkout master
. Hacer una nueva rama,git checkout -b bug2
. Haga cambios, comprométase, espere la revisión del código.Supongamos que otra persona comete E&F en master mientras espera la revisión.
Cuando se aprueba su código, puede volverlo a crear en master con los siguientes pasos:
Esto resultará en lo siguiente:
Luego puede presionar, eliminar su rama local bug1, y listo. Un error a la vez en su espacio de trabajo, pero con el uso de ramas locales, su repositorio puede manejar múltiples errores. Y esto evita una etapa complicada de baile.
Responda a la pregunta de ctote en los comentarios:
Bueno, puedes volver a esconder cada error y solo trabajar con un error a la vez. Al menos eso te ahorra el problema de la puesta en escena. Pero después de haber intentado esto, personalmente lo encuentro problemático. Los escondites son un poco desordenados en un gráfico de registro de git. Y lo más importante, si arruinas algo, no puedes revertirlo. Si tiene un directorio de trabajo sucio y hace estallar un alijo, no puede "deshacer" ese pop. Es mucho más difícil arruinar los compromisos ya existentes.
Por lo tanto
git rebase -i
.Cuando vuelve a crear una rama en otra, puede hacerlo de forma interactiva (el indicador -i). Cuando haces esto, tienes la opción de elegir lo que quieres hacer con cada confirmación. Pro Git es un libro increíble que también está en línea en formato HTML, y tiene una buena sección sobre rebase y aplastamiento:
http://git-scm.com/book/ch6-4.html
Robaré su ejemplo literalmente por conveniencia. Suponga que tiene el siguiente historial de confirmaciones y desea volver a crear y aplastar bug1 en master:
Esto es lo que verá cuando escriba
git rebase -i master bug1
Para aplastar todos los commits de una rama en un solo commit, mantenga el primer commit como "pick" y reemplace todas las entradas posteriores "pick" con "squash" o simplemente "s". También tendrá la oportunidad de cambiar el mensaje de confirmación.
Así que sí, aplastar es un poco molesto, pero aún así lo recomendaría sobre el uso intensivo de los escondites.
fuente
git checkout master; git checkout -b bug2
se puede acortar agit checkout -b bug2 master
. Lo mismo se aplica agit checkout bug1; git rebase master; git checkout master; git merge bug1
, que es idéntico agit rebase master bug1; git push . bug1:master
(concedido, elpush
truco no es obvio)De sus comentarios a la respuesta de Mike Monkiewicz, sugiero usar un modelo más simple: use ramas de desarrollo regulares, pero use la opción de squash de la combinación para obtener una confirmación única en su rama maestra:
La ventaja de este procedimiento es que puede usar el flujo de trabajo normal de git.
fuente
Después de crear un alias:
Aquí
git diff
devuelve la lista de--staged
archivos--name-only
Y luego pasamos esta lista
pathspec
agit stash
commad.De
man git stash
:fuente
Para podar un cambio accidental, especialmente la eliminación de varios archivos, haga lo siguiente:
en otras palabras, esconde la basura y tírala con el alijo por completo.
Probado en git versión 2.17.1
fuente