2011-02-07 26 views
29

Digamos que cometo un error en mi primer impulso a un repositorio remoto de Git. ¿Puedo revertir esto de alguna manera para que el repositorio vuelva a su estado inicial? No tengo acceso a la máquina remota, por lo que no es posible eliminar el directorio .git.¿Es posible vaciar por completo un repositorio remoto de Git?

El problema, hasta donde puedo ver es que no se puede "desarmar" la cabeza.

Esto es lo que (o en realidad un colega que le preguntó sobre esto) me (hago un local de cesión temporal "a distancia" aquí lo que cualquiera puede probar esto):

mkdir git-remote 
cd git-remote 
git init --bare 
cd .. 
mkdir git-local 
cd git-local 
git clone ../git-remote . 
touch a 
git add a 
git commit -m "initial" 
git push origin master 

Y en este punto se dio cuenta que empujó las cosas incorrectas al repositorio remoto.

La única idea que tenía todo lo que es el borrar de su cesión temporal & & git rm & empuje & git que todavía dejaría a la defectuosa cometen allí, pero los archivos no se molestaría un segundo empuje.

+0

http://stackoverflow.com/questions/588414/git-rolling-back-a-remote-repository – Christian

+0

Parece que es un caso en el que aún te queda por lo menos una confirmación. No quiero tener un solo compromiso allí. – Makis

Respuesta

51

que cree que puede tener un problema de XY. En realidad, no necesita volver a poner el repositorio remoto en su estado original para comenzar de nuevo; simplemente necesita comenzar de nuevo localmente, luego empujarlo hacia el control remoto.

# create a new repository that has the initial commit that you want 
mkdir foo; cd foo; git init; ...; git commit 

# set up a remote 
git remote add origin <url-of-remote> 
git branch --set-upstream master origin/master 

# push your new history 
git push -f 

# delete obsolete remote branches 
git push origin :deprecated-branch 

El repositorio remoto nunca se regresa a un estado sin confirmaciones, pero termina donde lo desee, y eso es todo lo que importa!

(Debajo del capó, los compromisos anteriores están en realidad todavía en el repositorio remoto, pero se dejan colgando, sin referencias apuntando a ellos).Se eliminarán automáticamente cuando se active git gc --auto presionando en algún momento.)

Si realmente desea vaciarlo por alguna razón, puede configurar receive.denyDeleteCurrent en el repositorio remoto y borrar todas las ramas , incluido el actual. Sin embargo, no veo por qué realmente necesitas hacerlo.

+0

OK, ¡esto realmente funciona! – Makis

+0

¿Por qué necesita la bandera '-f' en ese tercer comando? –

+2

@John: '-f' significa' --force'. Se requiere para empujes sin avance rápido (empujar en ramas que no tienen la posición previa de la rama como antepasado). – Cascabel

0

Puede git revert commits, p. git revert HEAD.

Tenga en cuenta que el contenido que ha cometido residirá en el directorio .git. (No puede hacer nada al respecto)

Es imposible en realidad eliminar una confirmación del historial sin tener acceso al directorio .git.

+0

Entonces la respuesta es "no", entonces. – Makis

+1

@Makis: Esta respuesta es incorrecta. Puede eliminar ramas en el control remoto y forzar a la bifurcación principal a su primera confirmación. Es cierto que no puedes abandonarlo sin ningún commit *, pero puedes reemplazar el commit de la raíz. * Los commits originales se dejarán colgando, y eventualmente se limpiarán con 'git gc --auto', que se ejecuta automáticamente ahora y entonces. – Cascabel

+0

Jonas, los comandos de git (incluido el empuje) funcionan accediendo y posiblemente modificando el contenido del directorio .git. * Usted * tiene acceso al directorio .git del control remoto a través de 'git push'. Es indirecto e incompleto, pero también es suficiente para esta tarea. – Cascabel

0

Cuando dices "primer empujón" ¿te refieres al primer empujón de la rama? Como no había ningún código en absoluto antes de empujarlo hacia allí. Si ese es el caso ...

Si querían empujar una rama local foo a una rama a distancia por primera vez, usted podría hacer esto:

git push origin foo:foo 

Para eliminar rama remota foo, le dice a Git para empujar "nada" a la misma:

git push origin :foo 

ya se puede empezar de nuevo con ella como usted quiera.

Para ser sincero, no estoy seguro de qué es lo que realmente queda físicamente en el servidor, pero en términos de restablecer por completo el historial de ramas, esto funcionará.

(fwiw, creo que esta interfaz es bastante ridículo)

+0

¿Cómo se hace eso a la rama principal cuando es la única rama allí? Agregué el flujo de trabajo a mi pregunta anterior. – Makis

+1

'git push origin: master' - porque es la única rama y la que ha revisado, esto generará algunos errores que explican cómo evitar el problema. (nuevamente, esto eliminará _everything_ en esa rama remota!) –

+0

(una solución fácil es 'git checkout -b master_tmp; git push origin: master') –

Cuestiones relacionadas