¿Cómo borrar definitivamente un commit en git? – git

Pregunta:


Creo un repositorio con dos commits :

~/ttt$ echo 1 > a
~/ttt$ git init
Initialized empty Git repository in /home/jose/ttt/.git/
~/ttt$ git add .
~/ttt$ git commit -m "Primer"
[master (root-commit) fdcbd32] Primer
 1 file changed, 1 insertion(+)
 create mode 100644 a
~/ttt$ git branch inicio
~/ttt$ echo 22 >> a
~/ttt$ git add .
~/ttt$ git commit -m "Segundo"
[master 36cbf1c] Segundo
 1 file changed, 1 insertion(+)

Pero cambio de idea y decido que ya no quiero el segundo commit. Me quedo con el primero solo.

~/ttt$ git checkout inicio
Switched to branch 'inicio'
~/ttt$ git branch -D master
Deleted branch master (was 36cbf1c).
~/ttt$ git checkout master
error: pathspec 'master' did not match any file(s) known to git.

Bien, ya me he cargado ese segundo commit. Su rama master no existe y no puedo acceder a el….
Error. El commit aún está ahí, y se puede llegar con el hash.

~/ttt$ git checkout 36cbf1c
Note: checking out '36cbf1c'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 36cbf1c... Segundo
~/ttt$ cat a
1
22

¿Cómo me lo cargo del todo?
rm -rf .git no es una respuesta válida, quiero conservar el otro commit.

Preguntado por: Jose Antonio Dura Olmos

amenadiel

Es un poco brusco borrar la rama master para eliminar un solo commit, pero supongo que era para darle énfasis al ejemplo.

Los commits huérfanos se los lleva el garbage collector eventualmente, en la medida que ya no queden ramas ni tags que lo referencien.

Si quieres gatillar esa limpieza manualmente puedes hacer

git gc --prune=now

Hay un flag que puedes darle que es más radical, y según Linus Torvalds (que además de Linux inventó Git) puede dañar seriamente un repo dependiendo de la profundidad de sus deltas:

git gc --prune=now --aggressive

PD: Encontré el hilo que leí una vez, y menciona

Date: Wed, 5 Dec 2007 22:09:12 -0800 (PST) From: Linus Torvalds
Subject: Re: Git and GCC

Absolutely. git –aggressive is mostly dumb. It’s really only useful
for the case of “I know I have a really bad pack, and I want to
throw away all the bad packing decisions I have done”.

Si lo que quieres es borrar el commit “Segundo”. El branch que debiste borrar era “inicio” y no master.

Al poner git branch -D master estás borrando master, no “inicio”.

Por otro lado, lo importante aquí es entender que los commits no son como files separados, sino que son momentos en la historia de versiones de tu aplicación. Por lo que “borrar un commit” no tiene mucho sentido, pues es muy distinto borrar el último commit, que borrar el commit número 34 de 100.

Lo que uno puede hacer con un commit es borrar los cambios que se hicieron en él. Entonces, por ejemplo, es como si rebobinaras todos los cambios que se hicieron en ese lapso de tiempo (entre el commit anterior y el commit siguiente).

La mejor explicación que he visto en español hasta el momento está aquí mismo:

¿Cómo puedo deshacer el último commit en Git?

Fuente

Related Posts:

Consulta sobre git – git github
Pregunta: Tengo un repositorio remoto https://github.com/xxxx/yyy.git En el mismo host donde estoy ubicado habia creado la repo y pusheado , me pidio el nick y password ...
Los repositorios de GIT muestran una modificación en una rama en la rama padre – git
Pregunta: Usando GIT para manejar mis proyectos, noté una serie de errores. Por ejemplo, al crear una rama (git checkout -b nueva_rama), ésta se crea normalmente, ...
¿Cómo eliminar un tag en Git? – git
Pregunta: Trabajando en una rama, accidentalmente se creo y subió al servidor un 'tag' con un nombre erróneo para la línea de versionado de las ...
Permitir que el archivo .gitignore deje subir una carpeta con los archivos que tiene dentro – git
Pregunta: Las rutas son /storage/app/public/employees y /storage/app/public/projects, en /storage/app/public tengo el archivo .gitignore. ¿Como puedo hacer para que ignore todo excepto esas dos carpetas? ...
Nuevo repositorio Git a partir de otro – git commit
Pregunta: Tengo un repositorio Git 'git1' que tiene cerca de 35.000 commits. Necesito crear un nuevo repositorio 'git2' que contenga los últimos 1.000 commits de ...
c++ – Preprocesador – Duda existencial – c++ c git
Pregunta: realmente tengo una duda existencia, y a medida que avanzo me hace mas ruido y realmente no sé si estoy haciendo las cosas bien. ...
Forma más simple de listar en git los archivos conflictivos – git conflictos
Pregunta: Sólo necesito la lista de los archivos conflictivos. Existe algo más simple que: git ls-files -u | cut -f 2 | sort -u o git ls-files -u ...
¿Es útil Git para trabajar individualmente? – git
Pregunta: No soy usuario de Git, he leído sobre él y me parece interesante, pero por lo que he leído sus ventajas (o su utilidad) ...
Error en comparacion en Eclipse, dice que todo es distinto cuando no es así – eclipse git comparaciones
Pregunta: Buenos días, Quería preguntar por qué mi Eclipse me dice que dos archivos son completamente distintos cuando no es así, he intentado ...
Problema nombre autor en repositorio remoto – git bitbucket
Pregunta: Estoy trabajando con Git en MAC, desde terminal y me aparece un nombre de autor diferente al esperado en el repositorio remoto cuando hago ...
¿Qué significa “-m” en “git commit -m”? – git git-commit
Pregunta: Estoy aprendiendo a usar Git y para dejar un commit, usan el comando git commit -m. Entiendo lo primero, pero no sé que significa ...
¿Como ignoro un directorio para pull? – git
Pregunta: se me presenta la siguiente situacion: Yo tengo un sistema que funciona con apache y php, uso hojas de estilo en less, para simplificar tengo ...
Volver al estado anterior a git stash – git
Pregunta: Recientemente he descubierto que git stash pop no funciona como yo espero/deseo. git stash pop hace un merge entre el estado actual y lo ...
¿Cómo puedo utilizar Sublime Text mediante Git Bash? – git bash sublimetext3
Pregunta: Intenta corrigiendo la ruta echo 'alias subl="'C:Program FilesSublime Text 3sublime_text.exe' "' >> ~/.bashrc Luego escribí el comando siguiente para probarlo: source ~/.bashrc Y con esto ya podía abrir ...
git reset –merge y reset –keep – git
Pregunta: Tratando de profundizar mas en git me encontre con un par de opciones en git sin embargo tras leer la documentación e investigar por ...
Tags:

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *