Teniendo en cuenta que hay varios comandos de git que no tienen sentido en un repositorio simple (porque los repositorios simples no usan índices y no tienen un directorio de trabajo),
git reset --hard HEAD^
no es una solución para eliminar el último cambio en dicho repositorio.
Buscando a través de Internet, todo lo que pude encontrar relacionado con el tema es esto , en el que se me presentan tres formas de hacerlo:
1. "actualizar la referencia manualmente (lo que implica plomería)";
2. " git push -f
desde un repositorio no simple";
3. " git branch -f this $that
".
¿Qué solución crees que es más apropiada o qué otras formas existen para hacerlo? Desafortunadamente, la documentación que encontré sobre los repositorios desnudos de git es bastante pobre.
Respuestas:
Puede utilizar el
git update-ref
comando. Para eliminar la última confirmación, usaría:O si no está en la rama de la que no puede eliminar la última confirmación:
También puede pasar un sha1 si lo desea:
Consulte la documentación del comando git-update-ref .
fuente
git update-ref <ref> <newvalue>
para que sea la rama derecha, como "refs / heads / master" en lugar de HEAD, por ejemplo. Espero no haber entendido mal su pregunta.branch-name
argumento. Cuando se utilizaupdate-ref
con una "rama", es absolutamente necesario especificar el nombre de referencia completo de la rama (es decir, anteponerrefs/heads/
al nombre corto normal de la rama). Si solo usa el nombre corto, terminará creando / actualizando en$GIT_DIR/branch-name
lugar de$GIT_DIR/refs/heads/branch-name
. La existencia de ambosbranch-name
yrefs/heads/branch-name
provocará advertencias "refname ... is ambiguous".Si usa lo siguiente en un repositorio vacío:
entonces no se encuentra con los problemas que tiene al usar
--hard
y las--mixed
opciones en un repositorio simple ya que no está tratando de cambiar algo que el repositorio simple no tiene (es decir, árbol de trabajo e índice). En su caso, específicamente, querrá usar (desde el repositorio desnudo):Para cambiar de sucursal en el repositorio remoto, haga lo siguiente:
Para ver el uso actual de la rama seleccionada:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
fuente
git checkout other_branch
no funciona de forma desnuda.El
git push -f
debería funcionar bien:si clona ese repositorio desnudo, elimine la última confirmación (
git reset --hard HEAD^
como menciona, pero en un repositorio local no desnudo) y presione hacia atrás (-f
):fuente
git reset --soft <sha1>
como se muestra en mi respuesta a continuación, no sería la práctica recomendada para mover HEAD en un repositorio simple?reset --soft
debería funcionar cuando se hace directamente en un repositorio vacío. Sospecho que esto rara vez se hace porque un repositorio simple es generalmente un repositorio ascendente (es decir, un repositorio al que está enviando datos) y, la mayoría de las veces, no tiene acceso local directo a él. Pero si lo hace, entonces este es ciertamente otro buen ejemplo dereset --soft
uso " " (como en stackoverflow.com/questions/5203535/… ) Entonces , haga +1 a su respuesta.También puede usar la notación git refspec y hacer algo como esto:
git push -f origin +<commit you want to revert to>:<destination_head | branch_name>
Esto fuerza la actualización de la rama de destino (como se indica en la referencia) a la confirmación de origen como se indica en la
+<object ref>
parte.fuente