2011-01-19 12 views
167

Así que he hecho algo de trabajo en el repositorio y cuando estoy por comprometerme me doy cuenta de que no estoy actualmente en ninguna rama.Git: "Actualmente no está en ninguna rama". ¿Hay una forma fácil de volver a una sucursal, mientras se mantienen los cambios?

Esto sucede mucho cuando se trabaja 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?

Respuesta

168

Si usted no ha cometido:

git stash 
git checkout some-branch 
git stash pop 

Si ha cometido 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 ha cometido y luego hacer 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 
+16

Éste no ayuda si ya te has comprometido. Sin embargo, no se votó porque no se especificó en la pregunta. –

+24

si ya se ha cometido: tenga en cuenta el hash de la confirmación que ha realizado (use 'git show' o' git rev-parse HEAD'), cambie a la rama y luego 'git cherry-pick' seguido del commit hash. – araqnid

+7

Si está confirmado, obtenga el hash de la última confirmación. Verifique la sucursal en la que desea estar, y 'git merge _hash_' – Daniel

9

Como alternativa, puede configurar sus submódulos para que en lugar de estar en su hea separado por defecto d declara que echa un vistazo a una sucursal.

Editado para agregar:

Una forma es a la caja de una rama particular del submódulo cuando se agrega con la bandera -b:

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

Otra forma es simplemente entrar en el directorio submódulo y sólo echa un vistazo

git checkout master 
+1

¿Podría decirme cómo hacerlo? –

+0

¿hay alguna manera de actualizar un submódulo existente en este modo de bifurcación predeterminado? actualizar 'gitmodules' tal vez? –

+0

@HertzelGuinness No realmente. El submódulo se revisa en un sha de confirmación 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 desprotegido. Comprobar una rama es solo una ventaja si está realizando cambios en el submódulo. – Abizern

11

Dejando otra manera aquí

git branch newbranch 
git checkout master 
git merge newbranch 
+1

¿Por qué crees que tiene 31 votos ascendentes y es la respuesta aceptada si no funciona? Por supuesto que funciona ¿Lo intentaste? –

+3

@ErikB Es posible que haya realizado varias confirmaciones. En ese caso, vea la respuesta de Babay. –

+0

@BenjaminOakes Eso puede ser cierto, pero estos comandos de git ni siquiera son válidos. –

146

esto me ayudó a

git checkout -b newbranch 
git checkout master 
git merge newbranch 
git branch -d newbranch 
+25

Si ya ha realizado varias confirmaciones, esto es lo que debe hacer. –

+0

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. –

+44

Estaría sorprendido. – Eric

4

poco me encontré con este problema de nuevo. 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 basta con echar un vistazo a la rama en la que desea comprometerse. Git mantendrá el árbol de trabajo incluso si no lo escondes.

git checkout existing_branch_name 

Si quieres trabajar en una nueva rama esto debería funcionar para usted:

git checkout -b new_branch_name 

la caja fallará si tiene conflictos en el árbol de trabajo, sino que debe ser bastante inusual y si sucede, puedes esconderlo, abrirlo 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 reciba milagrosamente más votos ascendentes (o al menos cercanos) que la respuesta actualmente aceptada.

22
git checkout master 

Eso es resultado de 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 

Por lo tanto, vamos a hacerlo:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e 
+0

No lo probé, pero parece que funcionaría bien. Supongo que si ejecutaras 'git gc' entre ejecutar esos dos comandos, perderías esos commits, pero a menos que estés ejecutando' git gc' automáticamente esto debería ser un enfoque bastante libre de riesgos. Todavía seguiría con la respuesta de Babay, pero si quieres salvarte de escribir dos comandos adicionales, creo que este es el camino a seguir. –

+0

Había dejado la rama principal en algún momento, que no estoy del todo seguro. Hice mis cambios, no hubo cambios en el maestro. Estas instrucciones trajeron mis cambios a la rama principal y todo fue bueno. –

+0

+1 Estaba nerviosa por ver otra sucursal y dejar mis compromisos atrás, ver este mensaje aumentó la confianza para conseguirlo. –

0

Sé que dije babay en 2012 que pensé que era poco probable que alguien wouldn' me doy cuenta de que no estaban en una sucursal y se comprometieron. Esto me pasó a mí, así que supongo que tengo que admitir que estaba equivocado, pero teniendo en cuenta que me llevó hasta 2016 que esto me pasara, podrías argumentar que, de hecho, es poco probable.

De todos modos, la creación de una nueva sucursal es excesiva en mi opinión. Todo lo que tiene que hacer es:

git checkout some-branch 
git merge commit-sha 

Si no copió el commit-SHA antes de pasar por la otra rama, se puede encontrar fácilmente ejecutando:

git reflog 
+0

es un problema raro (poco probable) para un hombre. No me pasó desde 2012. Pero si multiplicas la posibilidad de que la cantidad de usuarios de git ... Es muy probable. Puede suceder todos los días a alguien. :) – babay

1

El siguiente método puede trabajo:

git rebase HEAD master 
git checkout master 

Esto rebase sus cambios de CABEZA actuales sobre el maestro. Entonces puedes cambiar la rama.


Una forma alternativa es a la caja de la rama primera:

git checkout master 

Entonces Git debe mostrar SHA1 de sus confirmaciones independientes, entonces se puede recoger la cereza ellas, por ejemplo,

git cherry-pick YOURSHA1 

O también se puede combinar la más reciente:

git merge YOURSHA1 

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

Cuestiones relacionadas