Comprometerse con una twig alternativa en git (dejando la copy de trabajo sin modificar)

Estoy trabajando en un topic sucursal. attempt1 algunos cambios que deseo confirmar en un attempt1 twig attempt1 . Después de confirmar estos cambios, deseo continuar trabajando en el topic , desde mi estado actual (en lugar de volver al último compromiso sobre el topic ).

La razón para hacer esto es que necesito trabajar un poco más antes de que los cambios sean lo suficientemente buenos para ingresar a una twig publicada (presiono el topic regularmente), pero quiero save una copy del estado actual en caso de que estropee la repetición . No quiero cambiar mi copy de trabajo mientras estoy haciendo esto. Espero terminar con un índice vacío.

Tenga en count que quiero mantener el attempt1 durante un time; esto no es solo un compromiso muy temporal que voy a restar unos minutos más tarde. A veces decido cambiar mi enfoque sobre el topic , y en paralelo search un enfoque alternativo en el attempt1 . Quiero crear una twig, no solo esconder una confirmación.

Además, busco algo sólido, por lo que el rebase interactivo está fuera. Apuntar temporalmente al topic luego mover la confirmación a una nueva twig estaría bien, siempre que pueda hacerlo sin modificar la copy de trabajo.

En términos charts, estoy en el estado

 HEAD | v A topic 

con cambios no confirmados, y quiero llegar a

 HEAD | v A topic \ B attempt1 

con una copy de trabajo sin cambios que es idéntica a B.

Podría hacer git checkout -b attempt1 luego ( git add nuevos files y luego eliminar files borrados) git commit -a . Pero ¿cómo volvería al topic sin modificar el tree de trabajo?

Básicamente, ¿cómo lo hago?

 git commit --to-alternate-branch=attempt1 

o (después de crear y comprometerse a attempt1 )

 git checkout --do-not-modify-working-tree topic 

o git stash --no-revert (seguido de git branch attempt1 [email protected]{0} ), o lo que sea? Todas las combinaciones que puedo pensar estropean mi copy de trabajo en algún momento.

Dada tu descripción de "por qué", puedo decirte que hay una manera más simple. Si decides que realmente quieres usar una twig temporal, por supuesto que podrías.

Ahora, el método sugerido por AnoE a menudo funcionará, pero puede no reflejar las eliminaciones correctamente. Hay varias forms de ajustar el procedimiento para eso, pero odio tratar de hacer un seguimiento de ellos; así que en su lugar podrías usar escondites.

 git stash git checkout -b attempt1 git stash apply git commit git checkout topic git stash pop 

Pero como dije, todo esto realmente está reinventando la rueda. No necesita una sucursal para almacenar un estado al que pueda volver. Solo necesitas un compromiso

 git commit 

Y argumentarías que nunca deseas presionar el compromiso; esto no es problema Si terminas tu trabajo y está bien,

 git rebase -i 

Verá una list de confirmaciones, cada pick marcada; esta es una list de TODO para git rebase . Encuentra las confirmaciones que no deseas y cambia el command de la próxima confirmación para squash . Entonces, por ejemplo, la list TODO aparece como

 pick 00000001 first attempt pick 00000002 here's a commit I want to push 

lo cambias a

 pick 00000001 first attempt - don't push this squash 00000002 but here's a commit I want to push 

y la confirmación "temporal" se eliminará del historial de su sucursal. Sí, es una reescritura de la historia, pero lo estás haciendo antes de compartir la twig (ese es el punto), así que está bien.

Usando git

Cree su nuevo attempt1 sucursal1 de la manera que describió en su pregunta (es decir, como siempre). Entonces:

 git checkout topic git checkout attempt1 . 

git help checkout muestra exactamente qué hace esta variante. Esto hará que su nuevo índice sea como el attempt1 , pero puede fácilmente abandonar el escenario si lo desea.

Tenga en count que si su estado original contiene cambios tanto en etapas como sin escenario, esta distinción se perderá.

Sin usar git

Suponiendo que su directory de trabajo se llama src

 cd .. cp -r src src2 cd src2 git branch attempt1 git add ... git commit git push origin attempt1 cd .. rm -rf src2 

Tipo de martillo, pero hace lo que pediste.

Si no tiene un origin o no desea presionar allí, en lugar del impulso:

 cd ../src git remote add tmp PATHTOSRC2 git fetch tmp git branch attempt1 tmp/attempt1 git remote del tmp rm -rf ../src2 

Asegúrese de que se hayan agregado nuevos files con git add y que los files eliminados se hayan declarado con git rm . Entonces:

 git commit -a git branch attempt1 git reset HEAD^ 

Esto crea una confirmación en la twig actual, luego deshace esa confirmación (un restablecimiento mixto cambia a donde apunta la sucursal actual, pero no modifica la copy de trabajo). Mientras tanto, crea una nueva twig cuya sugerencia es esa confirmación, sin cambiar a esa twig.

El índice termina vacío. Si desea tener los cambios en el índice, use un reinicio por software ( git reset --soft HEAD^ ).