¿Cambiar el primer compromiso del proyecto con Git?

Quiero cambiar algo en la primera confirmación de mi proyecto sin perder todas las confirmaciones posteriores. ¿Hay alguna manera de hacer esto?

Accidentalmente enumeré mi correo electrónico sin procesar en un comentario dentro del código fuente, y me gustaría cambiarlo ya que recibo spam de los bots que indexan GitHub.

Como se menciona en ecdpalma a continuación , git 1.7.12+ (agosto de 2012) ha mejorado la opción --root para git rebase :

" git rebase [-i] --root $tip " ahora se puede usar para reescribir todo el historial que lleva a " $tip " hasta la confirmación raíz.

Ese nuevo comportamiento se discutió inicialmente aquí :

Personalmente creo que " git rebase -i --root " debería estar hecho para funcionar sin requerir " --onto " y permitirle "editar" incluso el primero en la historia.
Es comprensible que a nadie le moleste, ya que las personas están reescribiendo con less frecuencia casi al comienzo de la historia que de lo contrario.

El parche siguió .


(respuesta original, febrero de 2010)

Como se menciona en las preguntas frecuentes de Git (y esta pregunta de SO ), la idea es:

  1. Crear una nueva twig temporal
  2. Rebobina el compromiso que deseas cambiar usando git reset --hard
  3. Cambia esa confirmación (sería la parte superior de HEAD actual, y puedes modificar el contenido de cualquier file)
  4. Rama de Rebase en la parte superior de la confirmación modificada, usando:

     git rebase --onto <tmp branch> <commit after changed> <branch>` 

El truco consiste en asegurarse de que la información que desea eliminar no sea reintroducida por un compromiso posterior en otro lugar de su file. Si sospechas eso, entonces tienes que usar filter-branch --tree-filter para asegurarte de que el contenido de ese file no contenga ninguna información sensible.

En ambos casos, terminas reescribiendo el SHA1 de cada confirmación, así que ten cuidado si ya has publicado la twig de la que estás modificando el contenido. Probablemente no deberías hacerlo a less que tu proyecto aún no sea público y otras personas no hayan basado el trabajo en las confirmaciones que estás a punto de reescribir.

Como se indica en las Notas de la versión 1.7.12 , puede usar

 $ git rebase -i --root 

git rebase -i permite editar convenientemente cualquier confirmación anterior, excepto la confirmación raíz . Los siguientes commands le muestran cómo hacerlo manualmente.

 # tag the old root, "git rev-list ..." will return the hash of first commit git tag root `git rev-list HEAD | tail -1` # switch to a new branch pointing at the first commit git checkout -b new-root root # make any edits and then commit them with: git commit --amend # check out the previous branch (ie master) git checkout @{-1} # replace old root with amended version git rebase --onto new-root root # you might encounter merge conflicts, fix any conflicts and continue with: # git rebase --continue # delete the branch "new-root" git branch -d new-root # delete the tag "root" git tag -d root 

Si desea modificar solo la primera confirmación, puede probar git rebase y modificar la confirmación, que es similar a esta publicación: ¿Cómo modificar una confirmación especificada en git?

Y si desea modificar todas las confirmaciones que contienen el correo electrónico sin procesar, filter-branch es la mejor opción. Hay un ejemplo de cómo cambiar la dirección de correo electrónico globalmente en el libro Pro Git , y puede encontrar útil este enlace http://git-scm.com/book/es/Git-Tools-Rewriting-History