2010-01-22 22 views
237

Hay maneras de cambiar el mensaje más tarde, comete:¿Edita el compromiso raíz en Git?

git commit --amend     # for the most recent commit 
git rebase --interactive master~2  # but requires *parent* 

¿Cómo se puede cambiar el mensaje del primer cometer cometer (que no tiene padre)?

+0

Vea también http://stackoverflow.com/questions/11987914/how-do-i-reword -the-very-first-git-commit-message – fork0

+0

En particular: el uso de la variable de entorno GIT_COMMIT en el script de 'g es filter-branch --msg-filter' – fork0

Respuesta

221

Asumiendo que usted tiene un árbol de trabajo limpio, puede hacer lo siguiente.

# checkout the root commit 
git checkout <sha1-of-root> 

# amend the commit 
git commit --amend 

# rebase all the other commits in master onto the amended root 
git rebase --onto HEAD HEAD master 
+20

Creo que esto debería ser 'git rebase --onto HEAD master'. – Andrew

+1

@Andrew: en este ejemplo 'HEAD' _es_ la confirmación de raíz modificada. –

+3

Correcto, pero desea la confirmación del origen _original_ para el de 'git rebase'. 'git rebase' aplica commits en (' master') que no están en ; 'HEAD' no está en' master', por lo que su versión intenta aplicar todo el 'master'. – Andrew

3

Usted podría utilizar git filter-branch:

cd test 
git init 

touch initial 
git add -A 
git commit -m "Initial commit" 

touch a 
git add -A 
git commit -m "a" 

touch b 
git add -A 
git commit -m "b" 

git log 

--> 
8e6b49e... b 
945e92a... a 
72fc158... Initial commit 

git filter-branch --msg-filter \ 
"sed \"s|^Initial commit|New initial commit|g\"" -- --all 

git log 
--> 
c5988ea... b 
e0331fd... a 
51995f1... New initial commit 
+0

Estoy usando filter-branch cambia el autor/committer, y la opción '--all' es la clave en este caso para poder manejar también el commit raíz . – sschuberth

428

A partir de Git versión 1.7.12, ahora se puede usar

git rebase -i --root 
+23

Creo que esta debería ser la "respuesta aceptada", específicamente por su concisión y claridad. – Atcold

+5

De acuerdo, esta debería ser la respuesta aceptada. ¡Gracias por esto! –

+6

por favor, acepte esta respuesta en su lugar :) – marcio

53

Para ampliar ecdpalma's answer, ahora se puede utilizar la opción --root para contar rebase que desea volver a escribir la raíz/primera cometer:

git rebase --interactive --root 

a continuación, la raíz cometen se mostrará en la lista de rebase TODO, y se puede seleccionar a editar o nueva redacción:

reword <root commit sha> <original message> 
pick <other commit sha> <message> 
... 

Esta es la explicación de --root de the Git rebase docs (énfasis mío):

Rebase todos comete accesible desde <branch>, en lugar de limitar ellos con un <upstream>. Esto le permite volver a establecer la base de las confirmaciones raíz en una rama.

7

Otra forma de evitar este problema si sabe que va a cambio de base en la parte superior de la "primera" cometer en el futuro, es hacer un vacío COMMIT al principio:

git commit --allow-empty -m "Initial commit" 

y solo entonces comience a realizar confirmaciones "reales", luego puede volver a establecer la base de manera fácil de cometer la forma estándar usando algo como git rebase -i HEAD^

+2

¿No significa esto que, para que esto funcione, necesita tener la previsión (o ser psíquico) para hacer una confirmación * vacía al principio de su proyecto *? Esto parece ser *** extremadamente situacional ***, para mí, y en general *** no práctico ***. ¿Qué piensas? ¿Qué sucede si ya hice 100 commits y de repente necesito editar la confirmación de root? ¿Funcionará esto, en ese caso, si no hice esa confirmación vacía al comienzo? –

+1

La edición del mensaje de la confirmación raíz probablemente no sea algo que haría después de tener cientos de ellas. A veces solo quiero tener un repo de git, haciendo commits poco convencionales, sabiendo que una vez que alcance algún estado utilizable, los aplastaré en uno, por ejemplo, y volveré a redactar el mensaje. De todos modos, ahora he cambiado de opinión y creo que lo más útil para la primera confirmación sería poner el archivo '.gitattributes' en lugar de hacer una confirmación vacía. –

Cuestiones relacionadas