Usando git hice algo como esto
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 (which does complete because there was some error due to the fact that I'm no more on master)
Debido a que me dijo que todavía puedo comprometerme cuando estoy en un estado de desapego, lo hice. Pero ahora quiero fusionar mi rama principal separada y mi rama maestra local, y luego empujar mi montón de cambios a origen / maestro.
Entonces mi pregunta es cómo podría fusionar la rama maestra con mi estado real (cabeza separada)
git
git-checkout
benzen
fuente
fuente
Respuestas:
Crea una rama donde estés, luego cambia a master y fusiona:
fuente
Podrías hacer algo como esto.
Aún más simple sería
pero esto tiene el pequeño peligro de que si comete un error puede ser un poco más difícil recuperar los compromisos cometidos en la cabeza desprendida.
fuente
git merge HEAD@{1}
es probable que debe asegurarse de que es el que desea utilizar mediante el usogit reflog
Esto es lo que hice:
Básicamente, piense en el
detached HEAD
como una nueva rama, sin nombre. Puede comprometerse en esta rama como cualquier otra rama. Una vez que haya terminado de comprometerse, desea llevarlo al control remoto.Entonces, lo primero que debes hacer es darle
detached HEAD
un nombre. Puedes hacerlo fácilmente, mientras estás en estodetached HEAD
:Ahora puede empujarlo al control remoto como cualquier otra rama.
En mi caso, también quería adelantar esta rama para dominarla junto con los commits que hice en el
detached HEAD
(ahorasome-new-branch
). Todo lo que hice fuegit pull # To make sure my local copy of master is up to date
git merge master // This added current state of master to my changes
Por supuesto, lo fusioné más tarde
master
.Eso es todo.
fuente
git checkout -b new-branch
trabajó para mi. Las otras sugerencias exigierongit branch new-branch
, pero eso me dejó aún en la cabeza separada y la nueva rama no recogió mis cambios.Solo puedes hacer
git merge <commit-number>
ogit cherry-pick <commit> <commit> ...
Según lo sugerido por Ryan Stewart, también puede crear una rama desde el HEAD actual:
O solo una etiqueta:
fuente
git rev-parse HEAD
En el caso de HEAD separado, las confirmaciones funcionan de manera normal, excepto que no se actualiza ninguna rama con nombre. Para actualizar la rama maestra con sus cambios confirmados, realice una rama temporal donde se encuentre (de esta manera la rama temporal tendrá todos los cambios confirmados que ha realizado en el HEAD separado), luego cambie a la rama maestra y combine la rama temporal con el maestro.
fuente
Una solución fácil es que acaba de crear una nueva rama para que cometen y la salida a la misma:
git checkout -b <branch-name> <commit-hash>
.De esta manera, todos los cambios que realizó se guardarán en esa rama. En caso de que necesite limpiar su rama maestra de las confirmaciones restantes, asegúrese de ejecutarla
git reset --hard master
.Con esto, volverá a escribir sus ramas, así que asegúrese de no molestar a nadie con estos cambios. Asegúrese de leer este artículo para obtener una mejor ilustración del estado HEAD separado .
fuente
Tal vez no sea la mejor solución (reescribirá el historial), pero también podría hacerlo
git reset --hard <hash of detached head commit>
.fuente