2011-08-04 8 views
10

Cómo agregar los nuevos cambios a las confirmaciones que están en el medio, es decir, no agregar a la confirmación superior.Agregue cambios a confirmaciones en el medio en Git

git log 
commit1 <--- HEAD 
commit2 
commit3 

Cómo agregar los cambios directamente a commit3, sin eliminar commit1 y commit2 y luego agregar cambios al commit3.

¿Debo utilizar el escondite?

Si es posible, proporcione el enlace.

+0

Ver también http://stackoverflow.com/questions/179123/how-do-i-edit-an-incorrect-commit-message-in-git –

Respuesta

2

Crea una nueva rama, que es una copia de commit3. Agrega tus cambios y confirma. Luego, combine commit2 y commit1 en esa rama.

12

Tienes que hacer una rebase interactiva. Lea la página de ayuda de git rebase para más detalles. La respuesta corta es que continuará y realizará los cambios "intermedios" como de costumbre, y luego ejecutará git rebase -i HEAD~4. Aparecerá una lista de los últimos 3 commit en un editor de texto. Simplemente reordenar las confirmaciones donde la confirmación más nueva se coloca en el medio, y luego guardar y salir del editor. Git intentará reconstruir el historial en el nuevo orden. Puede terminar con conflictos. Si es así, corrígelos como lo harías para un conflicto de combinación y luego ejecuta git rebase --continue después de que todos hayan sido arreglados y agregados. Te dice todo esto cuando tienes un conflicto, así que solo lee los mensajes de error y estarás bien.

EDITAR: en realidad, parece que desea editar una confirmación existente. En ese caso, cuando el editor aparece, mover comprometen su nuevo temporal para estar al lado de commit3 y luego cambiar el orden de "calabaza" de "recoger":

pick 123456 commit3 
squash 541343 tmpcommit 
pick 654321 commit2 
pick 431523 commit1 

Edit2: si la rama y commit1, commit2 y commit3 ya son públicos, entonces no debería volver a basarse. Por otra parte, no deberías modificar los commits de todos modos, por lo que toda la pregunta sería discutible. Estoy asumiendo que esta es una rama privada o una que otros esperan que se vuelva a configurar y se rebobine.

5

Usted puede hacer esto con git-rebase:

git rebase -i commit3^ 

En el archivo que aparece, cambiar pick commit3 a edit commit3. Guarde y salga, luego realice los cambios. Compromételos como lo harías normalmente, luego usa git rebase --continue. Cuando hayas terminado, verás tus nuevos cambios entre commit3 y commit2.

(Esto funciona igual que la respuesta de Sjoerd, es sólo una forma diferente de pensar en ello Si cambia su conflicto con commit2, que tendrán que manejar eso de cualquier manera..)

+0

No debe hacer 'git commit --amend'; el 'git rebase --continue' es suficiente después de agregar los cambios (a menos que también desee editar el mensaje). – siride

+0

Probablemente tengas razón. –

+1

Este método no funciona si los cambios ya están en el árbol de trabajo. Por supuesto, podría esconder los cambios, hacer la rebase y luego desvincularse al editar commit3 en lugar de hacer una squash como en mi respuesta. – siride

Cuestiones relacionadas