Git: "Actualmente no en ninguna rama". ¿Hay alguna manera fácil de volver a una sucursal, manteniendo los cambios?

202

Así que he trabajado en el repositorio y, cuando estoy a punto de comprometerme, me doy cuenta de que actualmente no estoy en ninguna rama.

Esto sucede mucho cuando trabajo con submódulos y puedo resolverlo, pero el proceso es tedioso y he estado pensando que debe haber una manera más fácil de hacerlo.

¿Hay una manera fácil de volver a una sucursal, manteniendo los cambios?

Erik B
fuente

Respuestas:

214

Si no te has comprometido:

git stash
git checkout some-branch
git stash pop

Si se ha comprometido y no ha cambiado nada desde:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Si te has comprometido y luego has hecho un trabajo extra:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop
araqnid
fuente
16
Este no ayuda si ya te has comprometido. Sin embargo, no hay voto negativo ya que eso no se especificó en la pregunta.
Dean Rather
24
si ya se ha comprometido: tenga en cuenta el hash de la confirmación que realizó (use git showo git rev-parse HEAD), cambie a la rama y luego git cherry-picksiga el hash de confirmación.
araqnid
77
Si está comprometido, obtenga el hash de la última confirmación. Echa un vistazo a la sucursal en la que deseas estar, ygit merge _hash_
Daniel
Ten mucho cuidado. SI HA COMPROMETIDO EL CAMBIO y sigue estos pasos ... Verá el mensaje ... "Su sucursal y origen / maestro han divergido".
thinkanotherone
1
@thinkanotherone Si ya ha comprometido sus cambios, no habría nada que esconder y verificar una sucursal diferente no es el fin del mundo. El compromiso que acaba de hacer todavía está allí y puede combinarlo con esa rama mediante el uso git merge <hash-of-the-commit-you-just-made>.
Erik B
160

esto me ayudó

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
babay
fuente
25
Si ya ha realizado varias confirmaciones, esto es lo que debe hacer.
Benjamin Oakes
No lo he probado, pero parece que funcionaría. Sin embargo, creo que es un escenario poco probable. Creo que la mayoría de las personas se darán cuenta de que no están en ninguna rama antes de comprometerse y usarán la respuesta aceptada para solucionarlo.
Erik B
49
Te sorprenderías.
Eric
@ ErikB Ni siquiera sabía que había tal cosa como no estar en una sucursal. Esta respuesta fue muy útil para mí.
Konstantin Schubert
2
respuesta encantadora, en realidad solo lo escribí y funcionó, a diferencia de casi todo lo demás encontrado como un principiante de GIT; es posible que desee señalar que newbranch es un nombre arbitrario y no está destinado a ser reemplazado por un hash de confirmación
Toni Leigh,
22
git checkout master

Ese resultado es algo como esto:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Hagamoslo:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e
m_messiah
fuente
No lo intenté, pero parece que funcionaría bien. Supongo que si corrieras git gcentre ejecutar esos dos comandos, perderías esas confirmaciones, pero a menos que estés ejecutando git gcautomáticamente, este debería ser un enfoque bastante libre de riesgos. Todavía iría con la respuesta de babay, pero si quieres evitar escribir dos comandos adicionales, supongo que este es el camino a seguir.
Erik B
Había dejado la rama maestra en algún momento, que no estoy totalmente seguro. Había cometido mis cambios, no hubo cambios en el maestro. Estas instrucciones trajeron mis cambios a la rama maestra y todo está bien.
Matti Jokipii
+1 Estaba nervioso por comprobar otra rama mientras dejaba atrás las confirmaciones, al ver que este mensaje agregaba confianza para hacerlo.
J-Dizzle
11

Dejando otro camino aquí

git branch newbranch
git checkout master 
git merge newbranch 
Observador
fuente
3
@ErikB Es posible que haya realizado varias confirmaciones. En ese caso, vea la respuesta de babay.
Benjamin Oakes
@BenjaminOakes Puede ser así, pero estos comandos git ni siquiera son válidos.
Erik B
@ErikB Definitivamente cierto. :) La respuesta de Babay es la forma válida de lo que Alex parece haber estado tratando de hacer.
Benjamin Oakes
9

Alternativamente, puede configurar sus submódulos para que, en lugar de estar en su estado de cabeza separada predeterminada, revise una rama.

Editado para agregar:

Una forma es pagar una rama particular del submódulo cuando la agrega con el indicador -b:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Otra forma es ir al directorio de submódulos y echarle un vistazo

git checkout master
Abizern
fuente
1
¿Podrías decirme cómo hacer eso?
Erik B
¿Hay alguna manera de actualizar un submódulo existente en este modo de rama predeterminado? actualizar gitmodulestal vez?
Hertzel Guinness
@HertzelGuinness No realmente. El submódulo se extrae en un commit sha particular. Una rama es solo un puntero al sha y el sha al que apunta puede cambiar. Esto no es útil porque no congela el estado del submódulo extraído. Revisar una rama es solo una conveniencia si está haciendo cambios en el submódulo.
Abizern
5

Una forma de terminar en esta situación es después de hacer un rebase desde una rama remota. En este caso, los nuevos commits son señalados por ellos, HEADpero masterno apuntan a ellos, sino que apuntan a donde sea que estuvieras antes de cambiar la base de la otra rama.

Puede hacer que esto confirme su nuevo masterhaciendo:

git branch -f master HEAD
git checkout master

Esto se actualiza mastera la fuerza para señalar HEAD(sin ponerlo master) y luego cambia a master.

Ian
fuente
Funcionó perfectamente según lo requerido. Ya había preparado los archivos y me comprometí, pero no pude presionar debido al error anterior. Por encima de dos líneas de código funcionó perfectamente bien y empujó mi código como se esperaba.
invinciblemuffi
4

Recientemente me encontré con este problema nuevamente. Ha pasado un tiempo desde la última vez que trabajé con submódulos y después de haber aprendido más sobre git, me di cuenta de que simplemente verificar la rama en la que desea comprometerse es suficiente. Git mantendrá el árbol de trabajo incluso si no lo escondes.

git checkout existing_branch_name

Si desea trabajar en una nueva sucursal, esto debería funcionar para usted:

git checkout -b new_branch_name

El proceso de pago fallará si tiene conflictos en el árbol de trabajo, pero eso debería ser bastante inusual y si sucede, puede esconderlo, reventarlo y resolver el conflicto.

En comparación con la respuesta aceptada, esta respuesta le ahorrará la ejecución de dos comandos, que en realidad no tardan tanto en ejecutarse. Por lo tanto, no aceptaré esta respuesta, a menos que milagrosamente obtenga más votos positivos (o al menos cercanos) que la respuesta actualmente aceptada.

Erik B
fuente
2

El siguiente método puede funcionar:

git rebase HEAD master
git checkout master

Esto cambiará los cambios actuales de HEAD encima del maestro. Entonces puedes cambiar la rama.


La forma alternativa es verificar primero la sucursal:

git checkout master

Luego, Git debería mostrar SHA1 de sus confirmaciones separadas, luego puede elegirlas, por ejemplo

git cherry-pick YOURSHA1

O también puedes fusionar la última:

git merge YOURSHA1

Para ver todas las confirmaciones de diferentes ramas (para asegurarse de que los haya), ejecute: git reflog.

kenorb
fuente
0

Sé que le dije a babay en 2012 que pensaba que era poco probable que alguien no se diera cuenta de que no estaba en una sucursal y se comprometiera. Esto me sucedió a mí, así que supongo que tengo que admitir que me equivoqué, pero teniendo en cuenta que me tomó hasta 2016 para que esto me sucediera, podría argumentar que, de hecho, es poco probable.

De todos modos, crear una nueva sucursal es excesivo en mi opinión. Todo lo que tienes que hacer es:

git checkout some-branch
git merge commit-sha

Si no copió el commit-sha antes de verificar la otra rama, puede encontrarlo fácilmente ejecutando:

git reflog
Erik B
fuente
Es un problema raro (poco probable) para un hombre. No me ha sucedido desde 2012. Pero si multiplicas la posibilidad de la cantidad de usuarios de git ... será muy probable. Puede pasarle todos los días a alguien. :)
babay