¿Cómo puedo cambiar el autor de la confirmación para una única confirmación?

Resuelto MicTech asked hace 14 años • 29 respuestas

Quiero cambiar el autor de una confirmación específica en el historial. No es el último compromiso.

Relacionado: ¿Cómo cambio el nombre/correo electrónico del autor y del autor de confirmaciones para varias confirmaciones?

MicTech avatar Jun 15 '10 11:06 MicTech
Aceptado

Rebase interactivo a partir de un punto anterior en el historial que la confirmación que necesita modificar ( git rebase -i <earliercommit>). En la lista de confirmaciones que se están modificando, cambie el texto al picklado editdel hash del que desea modificar. Luego, cuando git te solicite cambiar la confirmación, usa esto:

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

Por ejemplo, si su historial de confirmaciones es A-B-C-D-E-Fcon Fas HEADy desea cambiar el autor de Cy D, entonces debería...

  1. Especificar git rebase -i B( aquí hay un ejemplo de lo que verá después de ejecutar el git rebase -i Bcomando )
    • si necesita editar A, usegit rebase -i --root
  2. Cambie las líneas para ambos Cy Dde pickaedit
  3. Salga del editor (para vim, esto sería presionar Esc y luego escribir :wq).
  4. Una vez que comenzó la rebase, primero se detendría enC
  5. Lo haríasgit commit --amend --author="Author Name <[email protected]>"
  6. Entoncesgit rebase --continue
  7. Se detendría nuevamente enD
  8. Entonces lo harías git commit --amend --author="Author Name <[email protected]>"de nuevo
  9. git rebase --continue
  10. La rebase se completaría.
  11. Úselo git push -fpara actualizar su origen con las confirmaciones actualizadas.
Amber avatar Jun 15 '2010 04:06 Amber

La respuesta aceptada a esta pregunta es un uso maravillosamente inteligente de la rebase interactiva, pero desafortunadamente presenta conflictos si la confirmación que intentamos cambiar el autor solía estar en una rama que posteriormente se fusionó. En términos más generales, no funciona al manejar historias confusas.

Como me preocupa ejecutar scripts que dependen de configurar y desarmar variables de entorno para reescribir 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 funcionando, a diferencia de la respuesta vinculada. Para mayor claridad de exposición, supongamos que 03f482d6es la confirmación cuyo autor estamos intentando reemplazar y 42627abeque es la confirmación con el nuevo autor.

  1. Consulte el compromiso que estamos intentando modificar:

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

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

    Ahora tenemos una nueva confirmación cuyo hash se supone que es 42627abe.

  3. Consulte la sucursal original.

  4. Reemplace la confirmación anterior con la nueva localmente:

     git replace 03f482d6 42627abe
    
  5. Reescribe todas las confirmaciones futuras basadas en el reemplazo:

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

     git replace -d 03f482d6
    
  7. Empuje la nueva historia:

     git push --force-with-lease
    

    (Úselo solo --forceen lugar de --force-with-leasesi este último falla, y solo después de verificar la cordura con git logy/o git diff.)

En lugar de los pasos 4 y 5, puedes simplemente cambiar la base a la nueva confirmación:

git rebase -i 42627abe
merlin2011 avatar Mar 04 '2015 02:03 merlin2011

Si solo desea cambiar el autor de su última confirmación , puede hacer esto:

  • Restablecer autor del repositorio actual:

    git config --local user.name "Alex Smith"

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

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

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

  • Fuerce el envío de sus cambios sin sobrescribir las confirmaciones de nadie más:

    git push --force-with-lease

Tenga en cuenta que esto también cambiará la marca de tiempo del autor.

Para hacer esto para las últimas N confirmaciones :

git rebase --onto HEAD~N --exec "git commit --amend --reset-author --no-edit" HEAD~N

pravsels avatar Apr 05 '2017 12:04 pravsels

La documentación de Github contiene un script que reemplaza la información del confirmador para todas las confirmaciones en una rama (ahora irrecuperable, esta es la última instantánea ).

Ejecute el siguiente script desde la terminal después de cambiar los valores de las variables

#!/bin/sh
 
git filter-branch --env-filter '
 
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

Envíe el historial corregido a GitHub:

git push --force --tags origin 'refs/heads/*'

O si desea enviar referencias seleccionadas de las ramas, utilice

git push --force --tags origin 'refs/heads/develop'
olivieradam666 avatar Jun 09 '2015 16:06 olivieradam666