NOTA: Esta respuesta cambia los SHA1, así que tenga cuidado al usarla en una rama que ya ha sido enviada. Si solo desea corregir la ortografía de un nombre o actualizar un correo electrónico antiguo, git le permite hacerlo sin tener que volver a escribir el historial .mailmap
. Ver mi otra respuesta .
Usando Rebase Interactiva
Podrías hacerlo
git rebase -i -p <some HEAD before all of your bad commits>
Luego marque todas sus confirmaciones erróneas como "editar" en el archivo de rebase. Si también desea cambiar su primera confirmación, debe agregarla manualmente como primera línea en el archivo de rebase (siga el formato de las otras líneas). Luego, cuando git le pide que modifique cada confirmación, haga
git commit --amend --author "New Author Name <email@address.com>"
editar o simplemente cerrar el editor que se abre, y luego hacer
git rebase --continue
para continuar el rebase.
Puede omitir abrir el editor por completo aquí agregando --no-edit
para que el comando sea:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Compromiso único
Como han señalado algunos de los comentaristas, si solo desea cambiar la confirmación más reciente, el comando rebase no es necesario. Solo haz
git commit --amend --author "New Author Name <email@address.com>"
Esto cambiará el autor al nombre especificado, pero el confirmador se establecerá en su usuario configurado en git config user.name
y git config user.email
. Si desea establecer el confirmador en algo que especifique, esto establecerá tanto el autor como el confirmador:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Nota sobre los compromisos de fusión
Hubo un pequeño defecto en mi respuesta original. Si hay ningún commit combinación entre la corriente HEAD
y su <some HEAD before all your bad commits>
, a continuación, git rebase
se aplanan ellos (y por cierto, si se utiliza una solicitud de extracción de GitHub, no va a haber un montón de confirmaciones de combinación en el historial). Esto a menudo puede conducir a un historial muy diferente (ya que los cambios duplicados pueden "eliminarse"), y en el peor de los casos, puede llevar a git rebase
pedirle que resuelva conflictos de fusión difíciles (que probablemente ya se resolvieron en los compromisos de fusión). La solución es usar la -p
bandera para git rebase
, que preservará la estructura de fusión de su historial. La página de manual para git rebase
advierte que el uso -p
y -i
puede conducir a problemas, pero en elBUGS
la sección dice "Editar confirmaciones y volver a redactar sus mensajes de confirmación debería funcionar bien".
He agregado -p
al comando anterior. Para el caso en el que solo está cambiando la confirmación más reciente, esto no es un problema.