2010-11-24 26 views
32

Tengo que admitir que no he jugado con las características avanzadas de gits, pero en mi proyecto actual tenía que hacerlo.Convertir git master HEAD point en actual HEAD de la rama

La situación: Alguien trató de poner en práctica algunas de las características y los comitted al maestro, ahora me llamaron para hacer lo que esta otra persona trató de hacer (pero no), por lo tanto, lo primero que hice fue

git checkout -b clean_start HASH 

Hash es un hash SHA1 correcto de aproximadamente 20 confirmaciones antes del maestro actual y funcionó. Ahora hice algunos cambios en esta rama y ahora estoy en un punto en el que me gustaría cambiar la rama maestra actual del repositorio remoto (que tiene los cambios realizados por la otra persona) en mi sucursal local.

En otras palabras, me gustaría mover el jefe del master 20 commits hacia atrás y luego fusionar mi nueva rama limpia en él.

¿Es eso exactamente lo que tengo que hacer? Con revertir HEAD ~ 20 etc. o hay un comando que hace exactamente tal movimiento de cabeza?

Respuesta

28

usted puede hacer esto, si el repositorio remoto acepta empuja forzado:

git push --force origin clean_start:master 

Tenga en cuenta que si alguien tiene el repositorio clonado, un empujón de ellos potencialmente podría deshacer este. Si desea combinar su rama principal local y la rama principal remoto, pero mantener el árbol de archivos de su rama (descartando el árbol de archivos del maestro de origen), puede hacerlo de esta manera:

git merge -s ours --no-commit origin/master 
git commit # Separate step so that you can use your own commit message. 
git checkout master 
git merge clean_start # Fast-forward 
git push origin master 

Esto creará una combinación se compromete con ambas ramas (el maestro y el maestro de origen) como su padre, pero el árbol será idéntico a su sugerencia de rama actual. En otras palabras, creará una fusión simbólica donde no se produjo una fusión de código real.

Si no le molesta que se interrumpa a otras personas que trabajan en el repositorio, puede usar el primer enfoque. Pero si trabajas con otras personas que ya tienen estos commits, el segundo enfoque será más a prueba de tontos y mantendrá la historia.

+0

hicieron editar su mensaje para incluir "clean_start: maestro"? –

+0

Sí, olvidé que él se estaba desarrollando a partir de una segunda rama, no de maestro. Actualicé mi otra lista de comandos para compensar esta supervisión también. – cdhowie

24
  1. Puede apuntar específicamente amo a donde quiera que sea con:

    git update-ref refs/heads/master clean_start 
    

    (si realiza el seguimiento de los nuevos cambios en clean_start y quiere maestro a punto allí)

    Cuidado que cualquier maestro que esté apuntando (aproximadamente 20 commits worth) se "perderá".

    Usted tendrá que forzar el empuje del maestro debido a esto:

    git push origin master -f 
    
  2. Si quiere salir de su maestro local donde está en su lugar y empuje el lugar de clean_start al maestro remoto, simplemente hacer esto:

    git push origin clean_start: amo -f

    esperanza esto ayuda.

    PS. Ejecute primero el gitk --all & para que pueda ver lo que sucede visualmente mientras hace esto.

16

El comando git reset existe para cambiar a lo que HEAD apunta.

En su caso, usted puede hacer esto:

git checkout master    # switch to the master branch 
git reset --hard clean_start  # point HEAD to the clean_start branch 
git push -f origin master:master # force push the new HEAD to server 
+0

Esto funcionó para mí, gracias. –

+0

Este es un comando simple y funciona como un amuleto. – lastboy

+0

Funcionado, Gracias :) –

Cuestiones relacionadas