¿Cambiar la primera confirmación del proyecto con Git? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Quiero cambiar algo en el primer commit de mi proyecto sin perder todos los commits 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 a medida que obtengo spammed de bots indexando GitHub.

Author: VonC, 2010-02-11

4 answers

Como se menciona en ecdpalma abajo, 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 de root.

Ese nuevo comportamiento fue inicialmente discutido aquí:

Personalmente creo que "git rebase -i --root" debería hacerse para funcionar sin requerir "--onto" y permitirle "editar" incluso el primero en la historia.
Es es comprensible que nadie se molestara, ya que la gente está reescribiendo con mucha menos frecuencia cerca del comienzo de la historia que de otra manera.

El parche siguió a.


(respuesta original, febrero de 2010)

Como se menciona en el Git FAQ (y esto SO question ), la idea es:

  1. Crear una nueva rama temporal
  2. Rebobinarlo a la confirmación que desea cambiar usando git reset --hard
  3. Cambiar ese commit (sería en la parte superior de la CABEZA actual, y puede modificar el contenido de cualquier archivo)
  4. Rebase la rama encima del commit cambiado, usando:

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

El truco es asegurarse de que la información que desea eliminar no sea reintroducida por una confirmación posterior en otro lugar de su archivo. Si usted sospecha que, entonces usted tiene que utilizar filter-branch --tree-filter para asegurarse de que el contenido de ese archivo no contiene en ningún commit la información sensible.

En ambos casos, se termina reescribiendo el SHA1 de cada commit, así que ten cuidado si ya has publicado la rama en la que estás modificando el contenido. Probablemente no deberías hacerlo a menos que tu proyecto aún no sea público y otras personas no hayan basado el trabajo en los commits que estás a punto de reescribir.

 567
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:26

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

$ git rebase -i --root
 153
Author: ecdpalma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-17 00:18:53

git rebase -i le permite editar convenientemente cualquier confirmación anterior, excepto la confirmación raíz. Los siguientes comandos 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 (i.e. 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
 72
Author: cmcginty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-04 02:38:56

Si quieres modificar solo el primer commit, puedes probar git rebase y modificar el commit, que es similar a este post: ¿Cómo modificar un commit especificado 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 que este enlace le resulte útil http://git-scm.com/book/en/Git-Tools-Rewriting-History

 0
Author: ZelluX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:50