¿Cómo agregar un archivo a una confirmación anterior?

84

En la última hora más o menos he modificado archivos

A
ATest
B
BTest

Para asegurarme de que mis mensajes de confirmación se alineen con el cambio real, confirme Acon una descripción. Desafortunadamente, no lo he incluido ATesten ese compromiso.

Mientras tanto, todavía no están comprometidos By BTest.

¿Cuál es la mejor forma de proceder en este momento? Me gustaría:

  1. ¿Revertir la confirmación anterior sin afectar mis archivos actualmente no enviados?
  2. ¿Agregar otro archivo con la misma descripción a la confirmación anterior?
James Raitsev
fuente
Creo que 2 debería ser la forma normal de hacerlo. ¿Cuál es el problema?
Adrian Shum

Respuestas:

140

Para agregar un nuevo archivo a la confirmación anterior:

$ git add new-file
$ git commit --amend

Puede usarlo git commit --amend --no-editsi no desea cambiar el mensaje de confirmación.

William Pursell
fuente
3
Gracias. Por curiosidad, si se conocía el sha1 de la confirmación y la confirmación no era la 'última', ¿cómo habría sido posible modificar esa confirmación?
James Raitsev
6
@Jam Yo diría que intente realmente no hacer eso ;-) Pero si debe hacerlo, una forma (no estoy seguro de si es la mejor) es confirmar el nuevo archivo como su propia confirmación y luego usarlo git rebase -ipara reordenar las confirmaciones y fusionar la confirmación de archivo nuevo con la otra confirmación. Eso podría ser material para una pregunta separada.
David Z
3
Al hacer lo git rebase -ique sugiere @DavidZ, todo lo que tiene que hacer es mover la nueva confirmación justo debajo de la que desea combinar y cambiar la palabra de la nueva confirmación a en squashlugar depick
MM
¿Qué pasa si preparé muchos archivos, pero solo quiero agregar uno a la confirmación modificada?
dfrankow
Desinstale todos los archivos preparados (p. Ej., git reset), Luego prepare el que desea agregar, modifique la confirmación y luego vuelva a preparar todos los archivos.
William Pursell
53

Aquí hay un divertido diagrama de flujo 1 que también es sorprendentemente útil: da la recomendación correcta tanto para la pregunta original como para la enmienda "¿Y si no fuera la última confirmación?" pregunta.

Diagrama de flujo de Git-pretty

1 Tomado de http://justinhileman.info/article/git-pretty/

amalloy
fuente
12

Agregar un archivo a una confirmación anterior

Si ya ha introducido la rama en la que está trabajando, consulte primero las páginas de manual . En particular, tenga en cuenta:

Rebasar (o cualquier otra forma de reescritura) una rama en la que otros han basado el trabajo es una mala idea: cualquiera que esté aguas abajo se ve obligado a corregir manualmente su historial.

Sin embargo, si no ha empujado su rama, prepárese para entrar en la zona de peligro .

Encuentra el hash de confirmación

Primero, necesita saber el hash de confirmación de la confirmación que desea agregar. Esto se muestra mediante git log. De hecho, desea especificar la confirmación antes de la que desea agregar. (Puede considerarlo como el índice de inicio del segmento de confirmaciones que desea modificar). Puede asegurarse de tener la confirmación correcta ejecutando git log -1 HEAD~n. Donde 'n' es un número entero que incrementa hasta que tenga la confirmación correcta. O podrías contar, no realmente.

Pero, si cuenta, al menos confirme que tiene el compromiso correcto con git log -1 HEAD~5o cualquiera que sea su conteo. NO debería ver la confirmación a la que desea agregar.

PELIGRO , je

Ahora estás listo para correr git rebase -i HEAD~5. O cualquiera que sea su hash de confirmación. Esto abrirá su editor de texto favorito y un archivo para editar. El archivo es la lista de tareas pendientes para el comando rebase. Los comentarios en el archivo le dicen qué opciones tiene. Simplemente busque la línea con la confirmación a la que desea agregar, y en esa línea cambie 'elegir' a 'editar'. Ahora guarde y cierre el archivo.

La rebase se detendrá una vez que alcance la confirmación que le dijo que editara. Ejecute a git statuspara ver la información adicional que proporciona. Organice sus archivos para agregarlos a la confirmación git add .o cualquiera que sea el nombre de archivo.

Entonces, hazlo git commit --amend. Esto modificará la confirmación que eligió editar.

Finalmente, corre git rebase --continue.

En caso de duda, en Linux puede obtener más información leyendo los documentos de salida de man git-rebaseo git --help rebase.

BaseZen
fuente
2
Respecto a "encontrar el hash de confirmación". No es necesario empezar a contar. Solo use git logpara encontrar su compromiso y copie su hash, luego use git rebase -i hash^para volver a basar el compromiso anterior al suyo.
Viktor