2009-04-21 23 views
30

Hace poco eché a perder mi git repo y me gustaría saber si hay algún remedio para ello.Crear git branch, y revertir el original al estado upstream

Mi configuración es la siguiente:

Central repo on github. 
Personal repo on github (which is a fork of Central) 
    +Central is setup as remote (upstream/master) 
    +Master branch (origin/master) 
    +Feature branch (origin/feature) 

Mi flujo de trabajo fue la siguiente:

Need to fix something in Central: 
    1. checkout Master 
    2. Make changes 
    3. Pull from upstream/master and merge 
    3. Commit, push to upstream/master 

Need to work on a New Feature: 
    1. Checkout/Create Feature branch 
    2. Work work work 
    3. Pull from upstream/master and merge 
    4. Commit, push to upstream/master 

De esta manera siempre he tenido un estado prístino de la central en mi rama principal.

Ahora lo que hice fue empezar a trabajar en la rama Master en su lugar. Así que hice cambios en mi maestro y ya no puedo ramificarme de él para obtener una copia de Central. Cada vez que tengo que hacer y enviar algunas correcciones a Central, tengo que clonar Central en otro directorio y trabajar desde allí.

Mi pregunta: ¿Hay alguna manera de "revertir" que mi maestro sea una copia idéntica de la Central, mientras cambio todos los cambios que he hecho en mi Maestro a otra rama (digamos Función)?

Sé que es confuso, y agradecería cualquier ayuda. Aclararé si algo no está claro.

Respuesta

47

Bueno, la solución era muy simple, insinuado por Pat Notz y Bombe.

#Make sure we're on the master branch 
$ git checkout master 

# Make a new branch to hold the work I've done 
$ git branch old_master 
# Save this branch on my remote repo (for backup) 
$ git checkout old_master 
$ git push origin old_master 

# Reset my local master back to match the commit just before I started 
# working on my new feature 
$ git checkout master 
$ git reset --hard 2aa93842342342 
# Get it to be the same as my Central 
$ git pull upstream master 

# Now DELETE my master on my remote repo 
$ git push origin :master 
# And recreate it 
$ git push origin master 

# Branch created! 
#* [new branch]  master -> master 

# 

Ahora tengo dos buenas ramas: master y old_master. ¡Con master es una copia de mi Central, para reparaciones de producción, y old_master mantiene todo el trabajo que hice anteriormente!

Gracias!

+1

Gracias por dar seguimiento a su solución. Solo estaba tratando de resolver tu situación, me alegro de que lo hayas descifrado. –

+5

Creo que en lugar de su 4º comando allí, "git push old_master origen old_master", ¿debería tener "git push origin old_master"? Espero que sea correcto, porque eso es lo que pareció funcionar para mí. De lo contrario, recibí un mensaje de error: "fatal: 'old_master' no parece ser un repositorio git" –

+4

No pude "git push origin: master". Esta publicación explica una forma de lidiar con eso. http://matthew-brett.github.com/pydagogue/gh_delete_master.html La clave es, asegúrese de que master no sea la rama predeterminada en github. Una buena política si está trabajando en un repositorio bifurcado. – pduey

3

¿Qué quiere usted decir exactamente por

metí [a] mi amo y ya no puede rama de ella.

Siempre puede crear una nueva bifurcación a partir de cualquier confirmación en su repositorio, sin importar cuán "desordenada" pueda ser, lo que por cierto es algo de lo que Git no tiene ni idea.

Básicamente puede revertir su repositorio a cualquier estado que tenía anteriormente porque Git no eliminará explícitamente ningún objeto, solo recogerá objetos no referenciados (colgando) de vez en cuando. Entonces solo necesitas saber cómo era tu repositorio. gitk o git log pueden ayudarlo allí.

Después de que haya restaurado su repositorio local al estado que desea, simplemente puede volver a enviarlo a su depósito público central. Si eso da como resultado un impulso de avance rápido, es posible que deba especificar el indicador --force al presionar.

+0

Hola, quise decir que ya no puedo ramificarme de él para obtener una copia del repositorio central, por lo que puedo empezar a trabajar en una nueva característica. En cuanto a su sugerencia, pensé en eso, pero eso me hará perder todo mi trabajo que hice en mi maestro. ¿No es así? Gracias. – drozzy

16
# Make sure we're on the master branch 
$ git checkout master 

# Make a new branch to hold the work I've done 
$ git branch old_master 

# Reset my local master back to match origin/master 
$ git reset --hard origin/master 

Ahora usted puede pagar el pedido old_master y utilizarlo igual que lo hizo su feature rama

+0

Origin/master se refiere al repositorio remoto de mi Master. Pero ya PUSHED mis cambios a mi repo github. Lo que necesito es restablecerlo a la corriente ascendente/maestra donde está mi repo Central. ¿Hay alguna forma de hacer eso? – drozzy

+0

Como era de esperar, 'git reset --hard upstream/master' parece funcionar bien (si ha configurado el flujo ascendente para apuntar al repositorio correcto). – starwed

Cuestiones relacionadas