2010-02-11 16 views
328

Quiero cambiar algo en la primera confirmación de mi proyecto sin perder todas las confirmaciones posteriores. ¿Hay alguna manera de hacer esto?¿Cambiar el primer compromiso del proyecto con Git?

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

Respuesta

484

Como se ha mencionado por ecdpalmabelow, git 1.7.12+ (agosto de 2012) ha mejorado la opción --root para git rebase:

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

Ese nuevo comportamiento fue inicialmente discussed here:

Personalmente pienso "git rebase -i --root" se debe hacer para trabajar solo, sin necesidad de "--onto" y le permiten "editar", incluso el primero en la historia.
Es comprensible que a nadie le moleste, ya que las personas están reescribiendo con menos frecuencia casi al comienzo de la historia que de lo contrario.

El patch followed.


(respuesta original, febrero de 2010)

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

  1. Crear nueva rama temporal
  2. rebobinar a la confirma que quieres 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 archivo)
  4. rama Rebase en la parte superior de cambiado cometer, usando:

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

El truco es estar seguro de la información que desea eliminar no está siendo presentada de nuevo por una confirmación más tarde en otro lugar en tu archivo. Si sospecha eso, entonces tiene que usar filter-branch --tree-filter para asegurarse de que el contenido de ese archivo 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 rama que estás modificando.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 las confirmaciones que estás a punto de reescribir.

+4

En OS X Mountain Lion con git 1.7.9.6 instalado el sistema (de Apple Git-31.1) establece que '' para ser el mismo hash que utilicé en el comando 'git reset --hard'. Aparte de ese pequeño cambio, esto funciona maravillosamente para actualizar la información del autor en todas las confirmaciones en un repositorio. – berto

+4

puede dar un ejemplo de lo que debería ser $ tip. 'git rebase -i --root' funcionó para mí. –

+0

@ RémiBenoit sí, '$ tip' puede ser cualquier confirmación que desee. 'master' (que significa' master HEAD' commit) está bien. – VonC

0

Si desea modificar sólo la primera de comprometerse, puede intentar git rebase y modificar la confirmación, que es similar a este post: How to modify a specified commit in git?

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

71

git rebase -i le permite editar cómodamente cualquier confirmación anterior, a excepción de la confirmación de la 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 
+10

Seguí estas instrucciones como un n00b y funcionaron perfectamente, ¡gracias! Puede mencionar agregar '-a' a' git commit --amend' o usar 'git add' porque lo olvidé esa primera vez. –

+1

Esto ya no es cierto, consulte la respuesta aceptada –

+0

Muchas gracias por su respuesta. Estoy usando un Centos 7 y la versión de git es 1.7.1 con muchas limitaciones en los comandos. La respuesta aceptada no funcionó para mí y este _ ** cómo ** _ funcionó como un amuleto para reconstruir el historial del repositorio de _ ** confirmación inicial ** _ –

126

Como se indica en 1.7.12 Release Notes, es posible utilizar

$ git rebase -i --root 
+2

git versión 1.7.9 se queja: 'Debe especificar - -onto cuando se utiliza --root' –

+2

Funciona bien con git 1.9.4 –

+2

Funcionó maravillosamente para mí también, usando git 1.9.4. –

Cuestiones relacionadas