2011-08-19 9 views
172

Usando git hice algo como esto¿Qué hacer con commit hecho en una cabeza separada

git clone 
git checkout {a rev number tree rev before} (here i started to be in a detached head state) 
//hacking 
git commit 
//hacking 
git commit 
(some commit where made on origin/master) 
git pull (wich does complete because there was some error due to the fact that i'm no more on master) 

Debido git me dijo que todavía puedo cometer cuando se encuentra en un estado de cabeza separada, lo hice. Pero ahora quiero fusionar mi rama principal separada con mi rama principal local, y luego insertar mis cambios en el origen/maestro.

Así que mi pregunta es ¿cómo podría fusionar la rama principal con mi estado real (cabeza separada)

+0

posible duplicado de [Git: CABEZA ha desaparecido, quiere fusionar en maestra] (http://stackoverflow.com/questions/2519031/git-head-has-disappeared-want-to-merge- it-to-master) –

+0

Podría agregar una captura de pantalla de un árbol de commits en este estado (cómo se ve realmente una confirmación en un encabezado separado en gitk o SourceTree), que haría esta pregunta aún mejor. – florisla

+0

Desafortunadamente, en este momento no puedo, pero si puede continuar, estaré encantado de verlo aquí. Incluso si se trata de un sorteo, lo hará más claro – benzen

Respuesta

281

Crear una rama en la que está, a continuación, cambiar a dominar y fusionarla:

git branch my-temporary-work 
git checkout master 
git merge my-temporary-work 
+4

¿cómo se puede evitar la separación de las cabezas en el futuro? – ycomp

+0

Lo hice y me encontré por delante del origen en 5 commits. En ese caso ¿acabas de hacer git push origen? – Winnemucca

+0

@stevek Eso debería hacer el truco. – juil

12

Usted Sólo puede hacer git merge <commit-number> o git cherry-pick <commit> <commit> ...

según lo sugerido por Ryan Stewart también puede crear una rama desde HEAD:

git branch brand-name 

O simplemente una etiqueta:

git tag tag-name 
+0

Puede encontrar su número de confirmación en la cabeza separada por 'git rev-parse HEAD' – KOGI

55

que podría hacer algo como esto.

# Create temporary branch for your detached head 
git branch tmp 

# Go to master 
git checkout master 

# Merge in commits from previously detached head 
git merge tmp 

# Delete temproary branch 
git branch -d tmp 

aún más simple sería

git checkout master 
git merge [email protected]{1} 

pero esto tiene el ligero peligro de que si se comete un error, puede ser un poco más difícil de recuperar las confirmaciones hechas en la cabeza separada.

+1

Sé que esto es años después, pero gracias por esta respuesta. No consideré que había terminado la búsqueda con la respuesta aceptada aquí porque no quería salir de una sucursal temporal y esta respuesta tiene el comando para eliminarla. –

+7

Si decide usar el comando 'git merge HEAD @ {1}' probablemente debería asegurarse de que sea el que quiera usar usando 'git reflog' –

+2

Poder unir HEAD @ {1} me salvó la vida ya que ya había verificado master de manera preventiva. – juil

1

También he fundado un artículo donde se explica cómo procesar. Lo agrego porque es un poco diferente de lo que se propuso. pero creo que todo el asunto son válidos

http://edspencer.net/2009/10/git-what-to-do-if-you-commit-to-no-branch.html

Más tarde voy a aceptar la primera respuesta como la buena

+0

Si su respuesta fue la más útil, entonces debe aceptar su propia respuesta. –

+0

Entiendo, pero creo que la respuesta que acepté es más fácil, o al menos menos propensa a errores, ya que no es necesario utilizar un número de confirmación – benzen

7

Esto es lo que hice:

Básicamente, pensar en la detached HEAD como una nueva rama, sin nombre. Puede comprometerse en esta rama al igual que cualquier otra rama. Una vez que haya terminado de comprometerse, quiere empujarlo al control remoto.

Así que lo primero que debe hacer es darle un nombre a este detached HEAD. Fácilmente puede hacerlo como, siendo en este detached HEAD:

git checkout -b some-new-name 

Ahora usted puede empujarlo a distancia como cualquier otra rama.

En mi caso, también quería acelerar esta rama para dominar junto con las confirmaciones que hice en el detached HEAD (ahora some-new-branch).Todo lo que hice fue

git checkout master 

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch 

git merge master // This added current state of master to my changes

Por supuesto, la fusionó posteriormente a master.

Eso es todo.

0

Quizás no sea la mejor solución, (reescribirá el historial) pero también podría hacer git reset --hard <hash of detached head commit>.

2

En caso de HEAD desconectado, realiza el trabajo como siempre, excepto que no se actualiza ninguna rama con nombre. Para actualizar la rama maestra con los cambios comprometidos, crea una rama temporal donde te encuentras (de esta manera la rama temporal tendrá todos los cambios comprometidos que hayas hecho en la CABEZA separada), luego cambia a la rama principal y fusiona la rama temporal con el maestro.

git branch temp 
git checkout master 
git merge temp 
Cuestiones relacionadas