Me comprometo a un repositorio git por primera vez; Luego lamento el compromiso y quiero revertirlo. lo intento
# git reset --hard HEAD~1
Recibo este mensaje:
fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
Este commit es el primer commit del repositorio. ¿Alguna idea de cómo deshacer la confirmación inicial de git?
git status
, y para mi sorpresa, ¡git dijofatal: Not a git repository (or any parent up to mount point ...)
!.gitignore
.git add .
,git commit -m "initial commit"
,git update-ref -D HEAD
, Cree una.gitignore
, el aviso de que git todavía está viendo los archivos que agregó anteriormente que deben ignorarse. En otras palabrasgit update-ref -d HEAD
, no me llevó de regreso al estado antes de la confirmación inicial.git reset --hard HEAD~1
eliminaría los archivos agregados para todos los otros commits. Claramente, la pregunta es cómo llegar al mismo estado en que ese comando funciona en todos los demás casos. Vea este resumen para probar que su solución no funciona gist.github.com/greggman/522fa69a21d6cfb3ff0bgit update-ref -d HEAD
no realmente revertir comprometen la inicial, pero mantiene todos los cambios previamente comprometidos añadido al índice. Si también desea eliminar esos cambios, simplemente ejecute lo siguientegit reset --hard
. Incluso si está incompleta, esta respuesta es la mejor, así que evite usarlarm -fr .git
(a menos que sepa lo que está haciendo).Puede eliminar el HEAD y restaurar su repositorio a un nuevo estado, donde puede crear una nueva confirmación inicial:
Después de crear una nueva confirmación, si ya ha empujado al control remoto, deberá forzarlo al control remoto para sobrescribir la confirmación inicial anterior:
fuente
Esta pregunta se vinculó desde esta publicación de blog y se propuso una solución alternativa para las versiones más nuevas de Git:
Esta solución supone que:
master
sucursalold_master
así que soy libre de usar ese nombre.Cambiará el nombre de la rama existente
old_master
y creará una nueva rama huérfanamaster
(como se crea para los nuevos repositorios) después de lo cual puede eliminar librementeold_master
... o no. Depende de usted.Nota: Mover o copiar una rama de git conserva su reflog (vea este código ) mientras elimina y luego crea una nueva rama la destruye. Dado que desea volver al estado original sin historial, es probable que desee eliminar la rama, pero otros pueden considerar esta pequeña nota.
fuente
En las condiciones estipuladas en la pregunta:
git init
,git add
operaciones,git commit
,Si se cumplen esas condiciones previas, la forma más sencilla de deshacer la confirmación inicial sería:
del directorio donde lo hiciste
git init
. Luego puede rehacergit init
para recrear el repositorio de Git y rehacer las adiciones con cualquier cambio que sea razonable que haya lamentado no haber hecho la primera vez, y rehacer la confirmación inicial.¡PELIGRO! Esto elimina el directorio del repositorio de Git.
Elimina el directorio del repositorio de Git de forma permanente e irrecuperable, a menos que tenga copias de seguridad en algún lugar. Bajo las condiciones previas, no tiene nada que desee mantener en el repositorio, por lo que no está perdiendo nada. Todos los archivos que agregó todavía están disponibles en los directorios de trabajo, suponiendo que aún no los haya modificado y no los haya eliminado, etc. Sin embargo, hacer esto es seguro solo si no tiene nada más en su repositorio. En las circunstancias descritas en la pregunta "confirmar repositorio por primera vez, luego arrepentirse", es seguro. Sin embargo, muy a menudo no es seguro.
También es seguro hacer esto para eliminar un repositorio clonado no deseado; no daña el repositorio del que fue clonado. Desecha todo lo que has hecho en tu copia, pero no afecta al repositorio original de lo contrario.
Tenga cuidado, pero es seguro y efectivo cuando se cumplen las condiciones previas.
Si ha hecho otras cosas con su repositorio que desea preservar, entonces esta no es la técnica adecuada: su repositorio ya no cumple con las condiciones previas para que esto sea apropiado.
fuente
No puedes Entonces:
fuente
git reset --hard
, entonces ¿por qué lo haríagit add -A
?Lanzaré lo que funcionó para mí al final. Necesitaba eliminar la confirmación inicial en un repositorio ya que los datos en cuarentena se habían extraviado, la confirmación ya se había enviado.
Asegúrese de estar actualmente en la rama correcta.
git checkout master
git update-ref -d HEAD
git commit -m "Initial commit
git push -u origin master
Esto fue capaz de resolver el problema.
Importante
Esto estaba en un repositorio interno que no era de acceso público, si su repositorio era de acceso público, suponga que cualquier cosa que necesite revertir ya ha sido eliminada por otra persona.
fuente
Me pregunto por qué "enmendar" no es una sugerencia y ha sido tachado por @damkrat, ya que enmendar me parece la forma correcta de resolver de la manera más eficiente el problema subyacente de arreglar el compromiso incorrecto, ya que no existe el propósito de no tener una inicial cometer. Como algunos destacaron, solo debe modificar la rama "pública" como maestra si nadie ha clonado su repositorio ...
fuente
git reset: realiza cambios duros, luego hazo
y entonces
--force reescribirá esa confirmación a la que se ha restablecido en el primer paso.No hagas esto, porque estás a punto de ir en contra de la idea de los sistemas VCS y git en particular. El único buen método es crear una nueva rama y eliminar ramas innecesarias. Ver
git help branch
para más información.fuente
Todo lo que tienes que hacer es revertir la confirmación.
Entonces empujalo
fuente