Cómo modificar varias confirmaciones en Git para cambiar de autor


He realizado una serie de confirmaciones en Git y ahora me doy cuenta de que olvidé establecer correctamente las propiedades de mi nombre de usuario y correo electrónico de usuario (nueva máquina). Todavía no he enviado estas confirmaciones a mi repositorio, así que ¿cómo puedo corregir estas confirmaciones antes de hacerlo (solo las 3 confirmaciones más recientes en la rama master)?

He estado mirando git reset y git commit -C <id> --reset-author, pero no creo que esté en el camino correcto.

Author: Chris Maes, 2011-02-13

5 answers

Rebase / amend parece ineficiente, cuando usted tiene el poder de la rama de filtro a su alcance:

git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
     GIT_AUTHOR_EMAIL=correct@email;
     GIT_AUTHOR_NAME="Correct Name";
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
     GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all

(dividir entre líneas para mayor claridad, pero no es necesario)

Asegúrese de inspeccionar el resultado cuando haya terminado, para asegurarse de que no ha cambiado nada que no quería!

 143
Author: Cascabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-13 03:33:19

El enfoque de rebase interactivo es bastante bueno cuando se usa junto con exec. Puede ejecutar cualquier comando de shell contra una confirmación específica o todas las confirmaciones en la rebase.

Primero establece la configuración del autor de git

git config --global user.name "John Doe"
git config --global user.email [email protected]

Luego restablecer el autor para todas las confirmaciones después del SHA dado

git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"

Esto aparecerá en su editor para confirmar los cambios. Todo lo que necesita hacer aquí es guardar y salir y pasará por cada confirmación y ejecutará el comando especificado en-x bandera.

Según el comentario de @Dave a continuación, también puede cambiar el autor mientras mantiene las marcas de tiempo originales con:

git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <[email protected]>' -CHEAD"
 88
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-31 12:35:54

Para cambiar el autor solo para la última confirmación:

git commit --amend --author 'Author Name <[email protected]>' --no-edit

Supongamos que solo desea cambiar el autor para las últimas N confirmaciones:

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --no-edit"

NOTAS

  • la bandera --no-edit se asegura de que el git commit --amend no pida una confirmación adicional
  • cuando usas git rebase -i, puedes seleccionar manualmente las confirmaciones donde cambiar el autor,

El archivo que edites se verá así:

pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
pick dc18f70 bugfix
 49
Author: Chris Maes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-28 07:19:43

Creo que lo que estás buscando es git rebase --interactive

Te permite ir a restablecer a un commit específico y luego ir a lanzar el historial cambiando agregando o agrupando commits

Aquí tienes una explicación http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive

 3
Author: Fernando Diaz Garrido,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-12 23:16:18

Si te sientes inseguro por degradar y modificar, podrías hacerlo de esta manera. Al mismo tiempo, también estaría configurando la configuración global que probablemente pretendía hacer de todos modos.

git reset HEAD~ (deshacer la última confirmación)

git config --global user.name "Your Name"

git config --global user.email [email protected]

git commit -m "message"

 0
Author: tymac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-13 03:28:13