¿Cuáles son algunas acciones en Git que son difíciles / imposibles de deshacer?

Una de las ventajas de Git es que, debido a que funciona con pointers, es relativamente fácil deshacer una gran variedad de tareas, como eliminar un compromiso o confirmaciones o crear y eliminar sucursales remotas . En muchos casos, todo lo que tiene que hacer es restablecer correctamente el puntero HEAD de la twig actual a la location deseada y listo, paso deshecho. Esto abarca una amplia gama de casos.

Además de eliminar un repository completo o una mala inserción, ¿cuál es la acción más no trivial que no se puede deshacer o que es extremadamente difícil de deshacer en un repository estándar de Git?

  • git clean borra files sin seguimiento. No se pueden restaurar con git.

  • Combinarse con un tree de trabajo sucio puede resultar en algo difícil de restaurar.

En resumen, Git no puede restaurar las cosas que Git no rastrea. Todo lo demás es restaurable.

Un ejemplo de una acción difícil de deshacer sería:

 git branch -D some-unmerged-branch-such-as-master git gc --prune=now --aggressive 

El primero elimina la reference a algunos commits. El segundo borra todas las confirmaciones sin references.

Espero que esta pregunta sea solo una cuestión de curiosidad ociosa, en lugar de querer destruir el repository de alguien, pero debido a la networkingundancia inherente al control de versiones distribuidas, no estoy demasiado preocupado.

Por mucho, el error "difícil de deshacer" más común que encuentro entre los nuevos en git son los abusos de git stash , porque git stash pop no siempre es reversible con git stash . Considerar:

 git init /tmp/trash && cd /tmp/trash # make a new repo echo A > A # create a file git add A git commit -m "Initial commit" # add and commit it echo B > A # ... now change it git stash # ... and stash it echo C > A # and change it and commit it again git add A git commit -m "Another commit" git stash pop # now pop the stash 

El pop intentará automatizar A y lanzará un conflicto, pero no puedes retroceder del pop al presionar git stash nuevamente. Este es un ejemplo bastante trivial, pero es fácil entrar en un lugar desagradable si escondes grandes sets de cambios a menudo, y cambias las twigs divergentes con frecuencia, apareciendo en el path. Creo que git stash drop también es permanente, es decir, no hay networking de security si se deja caer el alijo incorrecto.

En general, use el stash para lo que fue diseñado: colocar un índice de trabajo sucio para pasar a otra twig, corregir un error, confirmar, enviar y volver a su estado original. Si intenta usarlo para administrar muchos cambios en muchas twigs, inevitablemente lo morderá sin mucha atención.

En mi experiencia, la acción irreversible más común que realizan las personas es git reset --hard . Cuando muchas personas escriben " git reset , " --hard parece venir con demasiada naturalidad cuando realmente solo necesitaban un reset , quizás con --keep .