¿Cómo puedo cambiar el autor de la confirmación para una única confirmación?
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?
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 pick
lado edit
del 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-F
con F
as HEAD
y desea cambiar el autor de C
y D
, entonces debería...
- Especificar
git rebase -i B
( aquí hay un ejemplo de lo que verá después de ejecutar elgit rebase -i B
comando )- si necesita editar
A
, usegit rebase -i --root
- si necesita editar
- Cambie las líneas para ambos
C
yD
depick
aedit
- Salga del editor (para vim, esto sería presionar Esc y luego escribir
:wq
). - Una vez que comenzó la rebase, primero se detendría en
C
- Lo harías
git commit --amend --author="Author Name <[email protected]>"
- Entonces
git rebase --continue
- Se detendría nuevamente en
D
- Entonces lo harías
git commit --amend --author="Author Name <[email protected]>"
de nuevo git rebase --continue
- La rebase se completaría.
- Úselo
git push -f
para actualizar su origen con las confirmaciones actualizadas.
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 03f482d6
es la confirmación cuyo autor estamos intentando reemplazar y 42627abe
que es la confirmación con el nuevo autor.
Consulte el compromiso que estamos intentando modificar:
git checkout 03f482d6
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
.Consulte la sucursal original.
Reemplace la confirmación anterior con la nueva localmente:
git replace 03f482d6 42627abe
Reescribe todas las confirmaciones futuras basadas en el reemplazo:
git filter-branch -- --all
Retire el reemplazo para su limpieza:
git replace -d 03f482d6
Empuje la nueva historia:
git push --force-with-lease
(Úselo solo
--force
en lugar de--force-with-lease
si este último falla, y solo después de verificar la cordura congit log
y/ogit diff
.)
En lugar de los pasos 4 y 5, puedes simplemente cambiar la base a la nueva confirmación:
git rebase -i 42627abe
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
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'