Teniendo en cuenta que hay varios comandos de git que no tienen ningún sentido en un repositorio desnudo (porque desnuda repositorios no utilizar los índices y no tiene un directorio de trabajo),

git reset --hard HEAD^ 

no es una solución a uncommit el último cambio en ese repositorio.

La búsqueda a través de Internet, todo lo que pude encontrar sobre el tema es este, en el que se me presenta tres formas de hacer esto:

1. «la actualización de la ref manualmente (lo que implica plomería)»;

2. «git push -f de un no-repositorio desnudo»;

3. «git branch -f this $that«.

La solución que hacer yo creo que es más apropiado o ¿qué otras maneras existen para ello? Por desgracia, la documentación que he encontrado acerca de git desnudo repositorios es bastante pobre.

  • Dobrovol no utilice el complicado las cosas a continuación. Estás tratando de mover la CABEZA a otro a cometer y que es lo que git reset está destinado, incluso en un desnudo de repo. Por mi respuesta a continuación, utilice: git reset –soft <commit> Con –suave, no trate de cambiar un árbol de trabajo y el índice que no existe, por lo git te permite hacer el reset ningún problema.

4 Comentarios

  1. 123

    Puede utilizar el git update-ref comando. Para eliminar el último commit, se debería utilizar:

    $ git update-ref HEAD HEAD^
    

    O si usted no está en la rama de la que usted no puede eliminar el último commit:

    $ git update-ref refs/heads/branch-name branch-name^
    

    Usted también podría pasar un sha1 si quieres:

    $ git update-ref refs/heads/branch-name a12d48e2
    

    Consulte la documentación de la git-actualización-ref comando.

    • ¿Cuál es la CABEZA sobre el desnudo repo no está en la rama derecha?
    • Dobrovolschi: bien, yo estaba desbalanceado familiarizado con la sintaxis exacta.
    • Puede especificar el <ref> en git update-ref <ref> <newvalue> a ser la rama derecha, como «refs/heads/master» en lugar de la CABEZA, por ejemplo. Espero que no me malinterprete su pregunta.
    • buena edición. @Lavinia-Gabriela Dobrovolschi gracias por las precisiones. Que es mucho más práctico (si usted tiene un acceso directo al servidor remoto, supongo).
    • Los ejemplos son engañosas con respecto a la branch-name argumento. Cuando se utiliza update-ref con una «rama» es absolutamente necesario especificar la rama completa del nombre de referencia (es decir, anteponer refs/heads/ a la normal de corto nombre de la sucursal). Si usted sólo tiene que utilizar el nombre corto que va a terminar la creación/actualización de $GIT_DIR/branch-name en lugar de $GIT_DIR/refs/heads/branch-name. La existencia de ambos branch-name y refs/heads/branch-name hará «nombre de referencia … es ambiguo» advertencias.
    • Johnsen: se ha actualizado el código. Gracias.
    • Esta respuesta es mucho más complicada, a continuación, lo que Zach propuesto. Y su solución funciona bien.

  2. 29

    Si utiliza la siguiente en un desnudo de repo:

    git reset --soft <commit>
    

    a continuación, que no se quede en los problemas que tiene el uso de --hard y --mixed opciones en un desnudo de repo ya no estás tratando de cambiar algo que el desnudo repo no tiene (es decir, árbol de trabajo y el índice). En su caso concreto que se desea utilizar (desde el desnudo repo):

    git reset --soft HEAD^
    

    A interruptor de ramas en el mando a distancia repo hacer:

    git symbolic-ref HEAD refs/heads/<branch_name>
    
    • ¿Cómo seleccionar la sucursal en la que desea mover? Tu ejemplo funciona bien en el maestro, pero git checkout other_branch no funciona en un vacío.
    • Hmmm… me pregunto que votaron por mí en esto. La pregunta no se pregunta cómo cambiar las ramas de un mando a distancia de repo, se preguntó cómo restablecer en un desnudo de repo. Para cambiar el valor predeterminado de la rama en un remoto repo, el uso de git simbólico-ref CABEZA refs/heads/<branch_name>.
  3. 7

    La git push -f debería funcionar bien:

    si usted clon que llevaban repo, quitar el último commit (git reset --hard HEAD^ como usted menciona, pero en un local no-desnudo repo) y empuje hacia atrás (-f):

    • no cambiar cualquier SHA1 para el otro comete anterior a la de quitar.
    • está seguro de que usted empuja el contenido exacto de la desnuda repo menos el extra commit (porque acaba de clonado primero).
    • VonC Hola Von, he visto que responder a un montón en Git, así que quería preguntarte… era curioso, ¿por qué no git reset --soft <sha1> como se muestra en mi respuesta a continuación, a la práctica recomendada para el movimiento de la CABEZA en un desnudo de repo?
    • Supongo que otra razón por la que pido es que el uso de soft reset para bare repos no es información que está disponible y muchos foros parecen tener innecesariamente complejas soluciones cuando parece que el soft reset es la mejor práctica, debido a la menor cantidad de escribir y menos posibilidad de error.
    • un reset --soft debe trabajar cuando se hace directamente en un desnudo de repo. Sospecho que esto rara vez se hace porque un desnudo de repo es generalmente un aguas arriba repo (es decir, un repo a los que están empujando a los datos), y la mayoría del tiempo, que no tiene un acceso local directo a ella. Pero si lo hace, entonces este es sin duda otro buen ejemplo de «reset --soft de uso » (como en stackoverflow.com/questions/5203535/… ) Así que +1 a su respuesta.
  4. 2

    También puede utilizar git refspec notación y hacer algo como esto:

    git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

    Esto obliga a la actualización de destino rama (como se indica mediante la ref) a la fuente de comprometerse como se indica mediante la +<object ref> parte.

    • excepto cuando hay una acl en la rama – que suele ser el caso si la «necesidad de hacerlo en la desnuda repo misma» …

Dejar respuesta

Please enter your comment!
Please enter your name here