2012-06-06 30 views
72

Tengo curiosidad acerca de cómo eliminar la primera confirmación en git.¿Cómo eliminar el primer commit en git?

¿Qué es la revisión antes de cometer algo? ¿Esta revisión tiene un nombre o etiqueta?

+2

Para empezar con git, usted debe saber que la revisión no tiene sentido. Puedes hablar de commits o sus SHA relativos. Además, ¿por qué querrías hacer esto? El primer commit es en lo que se basa todo. Podrías aplastar algunos commits juntos, incluyendo el primer commit, que se convierte en el nuevo primer commit, pero ¿qué significa hasta eliminar el primer commit (o eliminar alguno excepto el último commit)? – Shahbaz

+0

@Shahbaz, sí, esa es la mejor manera, mira aquí, por ejemplo: http://ariejan.net/2011/07/05/git-squash-y-la-compila-comillas-en-una- – timaschew

+4

Puedes usar 'git rebase- yo - raíz'. Consulte la siguiente respuesta de SO para obtener más detalles: http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git – MKroehnert

Respuesta

122

Para mí, la forma más segura es utilizar el comando update-ref:

git update-ref -d HEAD 

se eliminará la referencia con nombre HEAD, por lo que se reinicio (en voz baja, no perderá su trabajo) toda su confirma su rama actual.

Si lo que desea es combinar la primera comprometerse con el segundo, puede utilizar el comando rebase:

git rebase -i --root 

Una última forma podría ser la creación de una rama de huérfana, una rama con el mismo contenido pero sin cometer historia, y confirme sus nuevos contenidos en él:

git checkout --orphan <new-branch-name> 
+2

Es una lástima que esta no sea la respuesta aceptada. También es malo que la mayoría de los hits en google digan más o menos "no se puede deshacer el primer commit". Esto hizo el truco para mí. ¡Gracias! – danielpops

+1

¡Gracias @danielpops por su apoyo! Es bueno notar que respondí a esta pregunta 3 años después. Git ha evocado mientras tanto. – tzi

+0

La rama huérfana hizo el truco. ¡Gracias! – fanaugen

36

No hay nada antes de la primera confirmación, ya que cada confirmación se refiere a una confirmación principal. Esto hace que el primer compromiso sea especial (una confirmación huérfana), por lo que no hay forma de referirse a un "estado" anterior.

Así que si quiere corregir la confirmación, puede simplemente git commit --amend: esto modificará la confirmación sin crear otra.

Si lo que desea es empezar de nuevo, elimine el repositorio .git, y crea otro con git init

+1

Esta respuesta es incorrecta: HAY una forma de volver al estado anterior al primer compromiso Ver [respuesta de tzi] (http://stackoverflow.com/a/32765827/46783) a continuación. –

2

Si desea mantener otras ramas, pero por ejemplo hacen que la rama principal empezar de nuevo sin historia común a otra ramas, una forma segura de lograr esto es crear un nuevo repositorio, y hacer que los contenidos de que, en su viejo:

cd .. 
git init newrepo 
cd newrepo 
# make some initial commits 
git push ../oldrepo master:newmaster 

esto crea rama "Newmaster" en el antiguo repositorio, con la historia que no es común con cualquiera de las otras ramas. Por supuesto, también puedes sobrescribir el maestro, con `git push -f'.

Si desea destruir todas las ramas y todo el contenido existente, simplemente ejecute rm -rf .git/.

5

Es posible que desee editar su primera confirmación (ya que siempre hay una primera confirmación en un repositorio de git). Considere usar git commit --amend --reset-author en lugar del git commit --amend habitual.

2

Otra manera de hacerlo es:

  1. Pedido a una rama que desea guardar (por decir dev) git checkout dev
  2. Ahora, eliminar la rama que desea restablecer git branch -D master
  3. Ahora, crear una rama vacía con el mismo nombre git checkout --orphan master

Por supuesto, todo esto dependerá de su uso, pero si tiene más de una rama, eliminando t El directorio .git no tiene sentido.

+1

Después de hacer esto, debe eliminar la rama en el control remoto antes de presionar. De lo contrario, cuando intentes empujar tendrás este error:! [rechazado] maestro -> maestro (no avance rápido) - error: error al presionar algunos refs a '[email protected]: r1/r2.git' - sugerencia: las actualizaciones fueron rechazadas porque la punta de su rama actual es detrás - sugerencia: su contraparte remota. Integre los cambios remotos (por ejemplo, sugerencia: 'git pull ...') antes de volver a presionar ... - Si hace un git pull, todos los commits vuelven. – dxvargas

2

salida a una rama temporal:

git checkout --orphan TEMP_BRANCH

Añadir todos los archivos:

git add -A

confirmar los cambios:

git commit -am "Commit inicial"

Eliminar la rama de edad:

git branch -D master

Cambie el nombre de la rama temporal de dominar:

git -m rama principal

Por último, actualizar la fuerza para nuestro repositorio:

git push origin master -f