¿Cómo puedo hacer lo siguiente en Git?
Mi sucursal actual es branch1 y he realizado algunos cambios locales. Sin embargo, ahora me doy cuenta de que realmente tenía la intención de aplicar estos cambios a branch2. ¿Hay alguna forma de aplicar / fusionar estos cambios para que se conviertan en cambios locales en branch2 sin comprometerlos en branch1?
Respuestas:
Dado que sus archivos aún no se han confirmado en
branch1
:o
Como se ha comentado por benjohn (ver
git stash
página del manual ):fuente
-u
, por lo que:git stash -u
.El ocultamiento, los compromisos temporales y el rebase pueden ser excesivos. Si aún no ha agregado los archivos modificados al índice, entonces puede simplemente retirar la otra rama.
Esto funcionará siempre que ningún archivo que esté editando sea diferente entre branch1 y branch2. Te dejará en branch2 con tus cambios de trabajo preservados. Si son diferentes, puede especificar que desea fusionar sus cambios locales con los cambios introducidos al cambiar de sucursal con la
-m
opción de pagar.Si ha agregado cambios al índice, primero querrá deshacer estos cambios con un reinicio. (Esto preservará su copia de trabajo, solo eliminará los cambios organizados).
fuente
checkout -m
no es "seguro" en alguna situación (tal vez causaría un conflicto de fusión), ¿el escondite proporcionaría alguna ventaja (por ejemplo, ¿puedes abrir un pop oculto?).orig
?Una alternativa más corta al enfoque de escondite mencionado anteriormente sería:
git stash
git stash branch new_branch_name
Luego justo
add
ycommit
los cambios a esta nueva rama.fuente
ADVERTENCIA: No para git novatos.
Esto surge lo suficiente en mi flujo de trabajo que casi he intentado escribir un nuevo comando git para él. El
git stash
flujo habitual es el camino a seguir, pero es un poco incómodo. Por lo general, primero hago una nueva confirmación ya que si he estado mirando los cambios, toda la información está fresca en mi mente y es mejor simplemente comenzar agit commit
encontrar lo que encontré (generalmente una corrección de error perteneciente al maestro que descubro mientras trabajo en un función de rama) de inmediato.Entonces, cómo logro esto es así:
git commit
los cambios de inmediato con un buen mensaje de compromiso.git reset HEAD~1
para deshacer la confirmación de la rama actual.A veces más tarde (asincrónicamente), o inmediatamente en otra ventana de terminal:
cd my-project-master
que es otro WD que comparte lo mismo.git
git reflog
para encontrar la corrección de errores que acabo de hacer.git cherry-pick SHA1
del compromiso.Opcionalmente (aún asíncrono), puede volver a crear una base de datos (o combinar) para obtener la corrección de errores, generalmente cuando está a punto de enviar un RP y ya ha limpiado su rama de características y WD:
cd my-project
cual es el WD principal en el que estoy trabajando.git rebase master
para obtener las correcciones de errores.De esta manera, puedo seguir trabajando en la función sin interrupciones y no tener que preocuparme de hacer
git stash
nada o tener que limpiar mi WD antes de ungit checkout
(y luego hacer que la verificación de la ramificación de la función vuelva a salir.) Y todavía tengo todas mis correcciones de errores enmaster
lugar de escondido en mi rama característica.OMI
git stash
ygit checkout
es un verdadero PIA cuando estás trabajando en una gran característica.fuente
my-project-master
intercambio de los mismos.git
hace que suene como él. ¿Por qué nogit checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard
, entonces más tarde (asíncrona), mientras que enmaster
,git cherry-pick <SHA1 of the commit(s) in bugfixABC
? (o incluso, para no tener que averiguar el SHA1,git rebase --onto master feature bugfixABC
, de donde la rama se encuentra actualmente en lo que significa que puede hacerlo directamente después de la.git reset
anterior, mientras que enfeature
.)checkout -m
es mejor.Si se tratara de cambios comprometidos, debería echar un vistazo a git-rebase, pero como lo señala VonC en un comentario, ya que está hablando de cambios locales, git-stash ciertamente sería la buena manera de hacerlo.
fuente
Las respuestas dadas hasta ahora no son ideales porque requieren mucho trabajo innecesario para resolver conflictos de fusión, o hacen suposiciones que frecuentemente son falsas. Así es como se hace perfectamente. El enlace es a mi propio sitio.
Cómo comprometerse con una rama diferente en git
Tiene cambios no confirmados en los
my_branch
que desea comprometersemaster
, sin comprometer todos los cambios demy_branch
.Ejemplo
Explicación
Comience fusionando
master
en su sucursal, ya que de todos modos tendrá que hacerlo eventualmente, y ahora es el mejor momento para resolver cualquier conflicto.La
-u
opción (aka--include-untracked
) engit stash -u
evita que pierdas archivos sin seguimiento cuando más tarde lo hagasgit clean -f -d
dentro demaster
.Después
git checkout master
es importante que NO lo hagasgit stash pop
, porque necesitarás este alijo más tarde. Si usted hace estallar el alijo creada enmy_branch
y luego hacesgit stash
enmaster
, va a provocar conflictos de fusión innecesarias cuando posteriormente se aplica ese escondite enmy_branch
.git reset
desestabiliza todo lo que resulta degit stash apply
. Por ejemplo, los archivos que se han modificado en el alijo pero que no existen enmaster
se organizan como conflictos "eliminados por nosotros".git checkout .
ygit clean -f -d
descarte todo lo que no está comprometido: todos los cambios en los archivos rastreados y todos los archivos y directorios no rastreados. Ya están guardados en el alijo y, si se dejanmaster
, causarían conflictos de fusión innecesarios al volver a cambiarmy_branch
.El último
git stash pop
se basará en el originalmy_branch
y, por lo tanto, no provocará ningún conflicto de fusión. Sin embargo, si su escondite contiene archivos no rastreados que se ha comprometido a dominar, git se quejará de que "No se pudieron restaurar los archivos no rastreados del escondite". Para resolver este conflicto, eliminar los archivos de su árbol de trabajo, a continuacióngit stash pop
,git add .
ygit reset
.fuente