¿Cómo cambiar el autor de un commit para un commit particular?

Quiero cambiar el autor de un compromiso particular en la historia. Este no es el último commit.

Conozco esta pregunta: ¿cómo puedo cambiar el autor de un commit en git?

Pero estoy pensando en algo donde identifico un cometer por hash o hash corto.

1564
15 июня '10 в 7:00 2010-06-15 07:00 MicTech programó el 15 de junio de 2010 a las 7:00 2010-06-15 07:00
@ 9 respuestas

Rebase interactivo desde un punto anterior en la historia que el compromiso que necesita cambiar ( git rebase -i <earliercommit> ). En la lista de confirmaciones que se han reubicado, cambie el texto de pick to edit junto al hash del que desea cambiar. Luego, cuando git te pide que cambies el commit, usa esto:

 git commit --amend --author="Author Name <email@address.com>" 

Por ejemplo, si su historial de ABCDE-f con F HEAD , y desea cambiar el autor de C y D , entonces ...

  1. Especifique git rebase -i B ( aquí hay un ejemplo de lo que verá después de ejecutar el git rebase -i B )
    • Si necesita editar A , use git rebase -i --root
  2. Cambiar líneas para C y D desde pick a edit
  3. Tan pronto como comience la rebase, primero se detendrá en C
  4. Debe hacer git commit --amend --author="Author Name <email@address.com>"
  5. Entonces git rebase --continue
  6. Esto volverá a detenerse en D
  7. Luego, debe volver a git commit --amend --author="Author Name <email@address.com>"
  8. git rebase --continue
  9. Se reubicará la reubicación.
  10. Use git push -f para actualizar su fuente con confirmaciones actualizadas.
2672
15 июня '10 в 7:31 2010-06-15 07:31 la respuesta fue dada Ámbar 15 de junio de 2010 a las 7:31 2010-06-15 07:31

La respuesta aceptada a esta pregunta es el uso sorprendentemente inteligente de la reubicación interactiva, pero desafortunadamente causa conflictos, si el autor que estamos tratando de cambiar es utilizado por el autor para la rama que se fusionó más adelante. En el caso más general, esto no funciona cuando se procesan historias sucias.

Dado que tengo miedo de ejecutar scripts que dependen de configurar y restablecer las variables de entorno para sobrescribir el historial de git, estoy escribiendo una nueva respuesta basada en esta publicación, que es similar a esta respuesta, pero es más completa.

Lo siguiente está probado y funciona, en contraste con la respuesta asociada. Supongamos, para mayor claridad, que 03f482d6 es un compromiso, cuyo autor estamos tratando de reemplazar, y 42627abe es un compromiso con un nuevo autor.

border=0
  1. Haz un compromiso que estamos tratando de cambiar.

     git checkout 03f482d6 
  2. Haz que el autor cambie.

     git commit --amend --author "New Author Name <New Author Email>" 

    Ahora tenemos un nuevo commit con un hash igual a 42627abe .

  3. Revisa la sucursal original.

  4. Reemplace el antiguo compromiso con uno nuevo localmente.

     git replace 03f482d6 42627abe 
  5. Reescriba todos los compromisos futuros basados ​​en el reemplazo.

     git filter-branch -- --all 
  6. Retire el reemplazo para la limpieza.

     git replace -d 03f482d6 
  7. Haga clic en el nuevo historial (use solo --force si falla lo siguiente, y solo después de probar la funcionalidad con git log y / o git diff ).

     git push --force-with-lease 

En lugar de 4-6, simplemente puede cambiar a la nueva confirmación:

 git rebase -i 42627abe 
369
04 марта '15 в 5:11 2015-03-04 05:11 la respuesta se da merlin2011 04 de marzo de 2015 a las 5:11 2015-03-04 05:11
09 июня '15 в 19:02 2015-06-09 19:02 La respuesta está dada por olivieradam666 09 de junio de 2015 a las 19:02 2015-06-09 19:02
  • Restablece tu dirección de correo electrónico en la configuración:

    git config --global user.email example@email.com

  • Ahora reinicie el autor de su confirmación sin editar:

    git commit --amend --reset-author --no-edit

82
05 апр. la respuesta es pravbeatle 05 abr. 2017-04-05 15:44 '17 a las 3:44 pm 2017-04-05 15:44

Puede cambiar el autor de la última confirmación con el comando siguiente.

git commit --amend --author="Author Name <email@address.com>"

Sin embargo, si desea cambiar más de un nombre de autor, es un poco difícil. Debe iniciar una reinstalación interactiva, luego marcar las confirmaciones como correctas, luego cambiarlas una por una y terminar.

Comienza a reiniciar con git rebase -i . Él te mostrará algo como esto.

Cambie la palabra clave de pick para edit las confirmaciones que desea cambiar el nombre del autor.

Luego cierra el editor. Para los novatos, presione Escape , luego escriba :wq y presione Enter .

Entonces verás tu terminal como si nada hubiera pasado. En realidad, estás en medio de una permutación interactiva. Ahora es el momento de cambiar la corrección del nombre de su autor usando el comando anterior. Volverá a abrir el editor. Cierre y continúe reiniciando con git rebase --continue . Repita lo mismo para la cantidad de corrección que desee editar. ¿Puede asegurarse de que el resumen interactivo finalizó cuando recibió el mensaje No rebase in progress? .

69
29 авг. La respuesta la da Fatih el 29 de agosto. 2015-08-29 03:52 '15 a las 3:52 2015-08-29 03:52

Las respuestas a la pregunta a la que está conectado son buenas respuestas y cubren su situación (otra pregunta es más general, ya que implica reescribir varias confirmaciones).

Como pretexto para sondear git filter-branch escribí un script para volver a escribir el nombre del autor y / o el correo electrónico del autor para este compromiso:

15 июня '10 в 8:24 2010-06-15 08:24 Respuesta dada por Chris Johnsen el 15 de junio de 2010 a las 8:24 2010-06-15 08:24

Al ejecutar git rebase -i hay un bit interesante en el documento:

Si desea restablecer dos o más confirmaciones en una, reemplace el comando "pick" con una segunda confirmación y subsiguiente con "squash" o "fixup" . Si las confirmaciones tenían diferentes autores, el fijador plegado se atribuirá al autor de la primera confirmación. El mensaje de confirmación propuesto para una confirmación plegada es una concatenación de los mensajes de confirmación de la primera confirmación y comandos con el comando de "squash" , pero omite los mensajes de confirmación de confirmación con el "fixup" .

  • Si tienes una historia ABCDEF ,
  • y quieres cambiar las confirmaciones B y D (= 2 confirmaciones),

entonces puedes hacer

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • Crear confirmaciones vacías (una para cada confirmación):
    • necesita un mensaje para fines de reenvio
    • git commit --allow-empty -m "empty"
  • iniciar la operación de reinicio
    • git rebase -i B^
    • B^ selecciona el elemento padre B
  • Es necesario poner un compromiso vacío antes de cada compromiso para cambiar
  • Necesitas cambiar el pick para squash por ellos.

Un ejemplo de lo que git rebase -i B^ te dará:

 pick sha-commit-B some message pick sha-commit-C some message pick sha-commit-D some message pick sha-commit-E some message pick sha-commit-F some message # pick sha-commit-empty1 empty # pick sha-commit-empty2 empty 

cambiarlo a

 # change commit B author pick sha-commit-empty1 empty squash sha-commit-B some message # leave commit C alone pick sha-commit-C some message # change commit D author pick sha-commit-empty2 empty squash sha-commit-D some message # leave commit EF alone pick sha-commit-E some message pick sha-commit-F some message 

Te pedirá que edites los mensajes:

 # This is a combination of 2 commits. # The first commit message is: empty # This is the 2nd commit message: ...some useful commit message there... 

y simplemente puede eliminar las primeras líneas.

12
28 авг. La respuesta se da el día 28 de agosto. 2013-08-28 04:03 '13 a las 4:03 2013-08-28 04:03

Hay un paso más para la respuesta de Ámbar si utiliza un repositorio central:

git push -f para forzar la actualización de un repositorio central.

Tenga cuidado de no tener mucha gente en una rama, ya que puede llevar a una pérdida de consistencia.

11
20 дек. La respuesta la da Fabian76 el 20 de diciembre. 2013-12-20 18:06 '13 a las 18:06 2013-12-20 18:06

Arreglar delante de:

2019

30 июня '18 в 15:16 2018-06-30 15:16 Eugen Konkov da la respuesta el 30 de junio de 18 a las 15:16 2018-06-30 15:16

Otras preguntas sobre las etiquetas o Haz una pregunta