¿Cómo cambiar el autor de confirmación para una confirmación específica?

Respuestas:

3570

El rebase interactivo 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 van a modificar, cambie el texto de pickal editlado del hash del que desea modificar. Luego, cuando git le solicite que cambie la confirmación, use esto:

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

Por ejemplo, si su historial de cambios están A-B-C-D-E-Fcon Fcomo HEAD, y que desea cambiar el autor de Cy D, a continuación, lo haría ...

  1. Especifique 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. Cambia 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ó el rebase, primero se detendría en C
  5. Lo harías git commit --amend --author="Author Name <[email protected]>"
  6. Entonces git rebase --continue
  7. Pausaría de nuevo a las D
  8. Entonces lo harías de git commit --amend --author="Author Name <[email protected]>"nuevo
  9. git rebase --continue
  10. El rebase se completaría.
  11. Use git push -fpara actualizar su origen con los commits actualizados.
Ámbar
fuente
90
Buena respuesta, pero para principiantes: primero encuentre un commit antes del que le gustaría cambiar, luego ejecutegit rebase -i <commit>
Mathew Byrne
47
Si no sabe en qué editor está, la respuesta es probable vim. Para guardar y salir, escriba Esc: wq Enter. Por otro lado, si es Nano y ve cosas como "WriteOut: ^ O" en la parte inferior, entonces debe usar Ctrl + O, Enter, Ctrl + X en su lugar.
Ámbar
30
¿Qué pasa si desea modificar la primera confirmación? ¿Cuál es el hash de confirmación anterior entonces?
Brenden
219
--no-editOpción de uso git commit --amend --reset-author --no-editNo abrirá un editor. Disponible desde git 1.7.9.
5lava
51
@Brenden para modificar el primer commit en el proyecto, usegit rebase -i --root
Noah Passalacqua
488

La respuesta aceptada a esta pregunta es un uso maravillosamente inteligente de rebase interactivo, pero desafortunadamente exhibe conflictos si el commit del que estamos tratando de cambiar el autor solía estar en una rama que posteriormente se fusionó. Más generalmente, no funciona cuando maneja historias desordenadas.

Dado que me preocupa la ejecución de scripts que dependen de establecer 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 funciona, a diferencia de la respuesta vinculada. Supongamos por claridad de exposición que 03f482d6es el commit cuyo autor estamos tratando de reemplazar, y 42627abees el commit con el nuevo autor.

  1. Verifique el commit que estamos tratando de modificar.

    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 hash que se supone que es 42627abe.

  3. Verifique la rama original.

  4. Reemplace el compromiso anterior con el nuevo localmente.

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

    git filter-branch -- --all
    
  6. Retire el reemplazo por limpieza.

    git replace -d 03f482d6
    
  7. Empuje el nuevo historial (solo use --force si falla lo siguiente, y solo después de verificar la cordura con git logy / o git diff).

    git push --force-with-lease
    

En lugar de 4-6, solo puede volver a crear una nueva confirmación:

git rebase -i 42627abe
merlin2011
fuente
99
Ponga una nota allí para volver a pagar su sucursal original después del paso 2.
Benjamin Riggs
42
Esto parece una alternativa muy clara a la horrible git rebase -i. Nunca he oído hablar de esto git replaceantes. +1
FractalSpace
3
Para limpiar las referencias / original / ... copia de seguridad ver aquí
alexis
55
Recomiendo usar en --force-with-leaselugar de -f. Es más seguro.
Jay Bazuzi
11
ADVERTENCIA: tenga en cuenta que git filter-branch -- --allestá cambiando los commits en todas las ramas en las que estaba el commit original. Si no tiene suficientes credenciales (o simplemente no quiere cambiar el historial de las ramas de otros), es bueno tener cuidado con esta respuesta.
ribamar
225

La documentación de Github contiene un script que reemplaza la información del committer para todos los commits en una rama .

  • 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
    
  • Empuje el historial corregido a GitHub:

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

    O si desea insertar referencias seleccionadas de las ramas, use

    git push --force --tags origin 'refs/heads/develop'
    
olivieradam666
fuente
12
Esto lo cambia en todas las confirmaciones, no solo en una. Lo curioso, hice esto hace menos de 30 minutos.
Artjom B.
Cuando encontré esta respuesta después de leer las anteriores, pensé que valía la pena intentarlo y listo, hizo el trabajo. Sin embargo, en mi caso, cambió el nombre del confirmador solo en la confirmación inicial. Por cierto, antes probé ideas de la primera respuesta. Tal vez afectó el sistema de alguna manera.
Ruslan Gerasimov
2
Tenga en cuenta que si evita usar clone/ push, terminará con un espacio de nombre de respaldo refs/original/. No pude encontrar una manera de eliminar este espacio de nombres de manera inteligente, así que terminé eliminando el directorio .git/refs/original, que funcionó.
VasiliNovikov
¿Por qué esto produce cambios en el repositorio si, por ejemplo, OLD_EMAIL no coincide con nada? Por alguna razón, algunos (¡pero no todos!) Comprometen el cambio de hashes.
mjs
1
Mi caso de uso para esta respuesta es: tengo dos cuentas de github, una que involuntariamente utilicé para realizar confirmaciones. Este script ayudó a arreglar todos mis commits al renombrar los correos electrónicos / nombres incorrectos del committer. Por supuesto, si me he estado comprometiendo con el usuario equivocado de, digamos, el 50º compromiso con el 500º compromiso, habrá 450 confirmaciones divergentes. De todos modos, después de ejecutar el script, como señaló @andrej, git push -fdeberá forzar los cambios de inserción en el repositorio.
LWY
168
  • Restablezca su correo electrónico a la configuración globalmente:

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

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

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

pravbeatle
fuente
2
No, no es. Mira el OP: It's not last commit.Entonces, ¿cómo lo harían amend?
underscore_d
2
Esto es genial, es una pena que solo sea la última confirmación. Lo necesitaba en los últimos dos, afortunadamente, así que solo hice un git reset HEAD~, ejecuté sus líneas sugeridas, luego hice el siguiente compromiso manualmente nuevamente. Funcionó bien!
Matt Fletcher
2
¡Gracias! El --reset-author hizo el truco por mí, ya que sin él el autor cambia pero el "commiter" permanece con los detalles del antiguo autor.
Lucas P.
99
Para arreglar mis últimos seis commits: Primero configure el autor correcto para el repositorio actual de Git usando git config --local user.name FirstName LastName y git config --local user.email [email protected]. Luego aplique a los últimos seis commits usando git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6. Finalmente empujarlo al repositorio remoto de Git usando git push --force-with-lease.
olibre
@olibre funciona de maravilla, gracias.
Bruno Gasparotto
88

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

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

Sin embargo, si desea cambiar más de un nombre de autor confirmado, es un poco complicado. Debe comenzar un rebase interactivo, luego marcar commits como edición, luego modificarlos uno por uno y finalizar.

Comience a rebasar con git rebase -i. Te mostrará algo como esto.

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

Cambie la pickpalabra clave a editlas confirmaciones a las que desea cambiar el nombre del autor.

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

Luego cierra el editor. Para los principiantes, presione y Escapeluego escriba :wqy presione Enter.

Entonces verá su terminal como si nada hubiera pasado. En realidad, estás en medio de un rebase interactivo. Ahora es el momento de modificar el nombre del autor de su confirmación utilizando el comando anterior. Se abrirá el editor nuevamente. Salga y continúe rebase con git rebase --continue. Repita lo mismo para el recuento de confirmación que desea editar. Puede asegurarse de que el rebase interactivo finalice cuando reciba el No rebase in progress?mensaje.

Fatih Acet
fuente
¿Puedes por favor actualizar tus fotos?
Shimmy Weitzhandler
1
Si tiene varias confirmaciones para cambiar, en lugar de editarlas individualmente, también puede dejar la pickacción y agregar después de cada líneaexec git commit --no-edit --amend --author="MyNewAuthor <[email protected]>"
Pierre-Olivier Vares
60

Las respuestas en la pregunta a la que vinculó son buenas respuestas y cubren su situación (la otra pregunta es más general ya que implica reescribir múltiples confirmaciones).

Como excusa para probar git filter-branch, escribí un guión para reescribir el Nombre del autor y / o el Correo electrónico del autor para un compromiso determinado:

#!/bin/sh

#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
#     If -f is supplied it is passed to "git filter-branch".
#
#     If <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; then
    force='-f'
    shift
fi

die() {
    printf '%s\n' "$@"
    exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"

TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL

filt='

    if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
        if test -n "$TARG_EMAIL"; then
            GIT_AUTHOR_EMAIL="$TARG_EMAIL"
            export GIT_AUTHOR_EMAIL
        else
            unset GIT_AUTHOR_EMAIL
        fi
        if test -n "$TARG_NAME"; then
            GIT_AUTHOR_NAME="$TARG_NAME"
            export GIT_AUTHOR_NAME
        else
            unset GIT_AUTHOR_NAME
        fi
    fi

'

git filter-branch $force --env-filter "$filt" -- $br
Chris Johnsen
fuente
+1 gracias. El repositorio git de assembla.com no parece cambiar todas las referencias de autor en la vista web del repositorio, pero los resultados de 'git pull / clone' parecen funcionar correctamente.
Johnny Utahh
Gran solución, ya que solo cambia lo que se pretende, y no otros campos, como la fecha de confirmación.
Guillaume Lemaître
12
La documentación de Github contiene un script similar
olivieradam666
2
@ olivieradam666 que funciona de
maravilla
@ olivieradam666 Gracias. Realmente deberías agregar eso como respuesta para que reciba más atención.
Seane
44

Comprometerse antes:

ingrese la descripción de la imagen aquí

Para corregir el autor para todas las confirmaciones, puede aplicar el comando de la respuesta de @ Amber:

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

O para reutilizar su nombre y correo electrónico, simplemente puede escribir:

git commit --amend --author=Eugen

Comprometerse después del comando:

ingrese la descripción de la imagen aquí

Por ejemplo, para cambiar todo a partir de 4025621:

ingrese la descripción de la imagen aquí

Debes correr:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621

Nota: Para incluir un autor que contenga espacios como un nombre y una dirección de correo electrónico, el autor debe estar rodeado de comillas escapadas. Por ejemplo:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <[email protected]>\"" 4025621

o agregue este alias en ~/.gitconfig:

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --

Y luego corre:

git reauthor 4025621 Eugen
Eugen Konkov
fuente
1
Para verificar que el comando funcionó como se esperaba, revisé el resultado de git shortlog -e -s.
Taylor Edmiston el
55
Esta es la respuesta que mejor sirvió a mis propósitos, gracias. Y dado que solo quería ajustar mi dirección de correo electrónico, podría ejecutar con --exec = "git commit --amend --reset-author", después de actualizar mi .git / config.
Dato
1
Eeh, no estoy seguro de por qué lo olvidé! Hecho ahora.
Dato
Gran respuesta y muy fácil de arreglar. Me encanta el alias!
J_A_X
Eso no me ayudó. Ahora he Continuar Rebase Error de error
Alexey Sh.
17

Hay un paso adicional para la respuesta de Amber si está utilizando un repositorio centralizado:

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

Tenga cuidado de que no haya mucha gente trabajando en la misma rama porque puede arruinar la consistencia.

Fabian76
fuente
16

Al hacerlo, git rebase -ihay este bit interesante en el documento:

Si desea doblar dos o más confirmaciones en una, reemplace el comando "pick"para la segunda y posteriores confirmaciones con "squash"o "fixup". Si los commits tenían diferentes autores, el commit plegado se atribuirá al autor del primer commit. El mensaje de compromiso sugerido para el compromiso plegado es la concatenación de los mensajes de compromiso del primer compromiso y de aquellos con el "squash"comando, pero omite los mensajes de compromiso con el "fixup"comando.

  • Si tienes un historial de A-B-C-D-E-F ,
  • y quieres cambiar commits By D(= 2 commits),

entonces puedes hacer:

  • git config user.name "Correct new name"
  • git config user.email "[email protected]"
  • crear confirmaciones vacías (una para cada confirmación):
    • necesitas un mensaje con el propósito de rebase
    • git commit --allow-empty -m "empty"
  • iniciar la operación de rebase
    • git rebase -i B^
    • B^selecciona el padre de B.
  • querrá poner una confirmación vacía antes de cada confirmación para modificar
  • tendrá que cambiar picka squashpara aquellos.

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

cambia eso a:

# change commit B's 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's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

Le pedirá que edite los mensajes:

# This is a combination of 2 commits.
# The first commit's message is:

empty

# This is the 2nd commit message:

...some useful commit message there...

y solo puedes eliminar las primeras líneas.

dnozay
fuente
16

En apoyo a la respuesta de Eugen Konkov , para comenzar desde el commit raíz, use --rootflag. La --no-editbandera también es útil

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
korwalskiy
fuente
Esto funcionó y cambió en todos los commits.
SagarKapasi099
1
Gracias por la respuesta. Tenía que agregar --interactive para que funcione. git rebase --root --interactive --exec "git commit --amend --author = 'name <email>' --no-edit"
Sreeragh AR
8

Encuentre una forma que pueda cambiar a los usuarios rápidamente y que no tenga efectos secundarios para los compromisos de otros.

Forma simple y clara:

git config user.name "New User"
git config user.email "[email protected]"

git log
git rebase -i 1f1357
# change the word 'pick' to 'edit', save and exit

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

git push --force-with-lease

operaciones detalladas

  • muestre los registros de confirmación y descubra la identificación de confirmación que antes de su confirmación que desea cambiar:
git log
  • git rebase comienza desde la identificación de confirmación elegida a la reciente inversa:
git config user.name "New User"
git config user.email "[email protected]"
git rebase -i 1f1357

# change word pick to edit, save and exit
edit 809b8f7 change code order 
pick 9baaae5 add prometheus monitor kubernetes
edit 5d726c3 fix liquid escape issue   
edit 3a5f98f update tags
pick 816e21c add prometheus monitor kubernetes
  • rebase se detendrá en el próximo commit id, salida:
Stopped at 809b8f7...  change code order 
You can amend the commit now, with
  git commit --amend 

Once you are satisfied with your changes, run

  git rebase --continue
  • confirme y continúe su rebase hasta que sea exitosamente refs/heads/master.
# each continue will show you an amend message
# use git commit --amend --reset-author --no-edit to comfirm
# use git rebase --skip to skip
git commit --amend --reset-author --no-edit
git rebase --continue
git commit --amend --reset-author --no-edit
...
git rebase --continue
Successfully rebased and updated refs/heads/master.
  • git push para actualizar
git push --force-with-lease
NOZUONOHIGH
fuente
5

Si la confirmación que desea cambiar no es la última confirmación, siga los pasos a continuación. Si su confirmación está en una rama diferente, primero cambie a esa rama.

git checkout branch_name

Encuentra commit antes del commit que deseas cambiar y encuentra su hash. Luego emita el comando rebase.

git rebase -i -p hash de commit

Luego, se abrirá un editor e ingresará 'editar' para las confirmaciones que desea cambiar. Deje a otros con la opción predeterminada de 'selección'. Una vez cambiado, ingrese la tecla 'esc' y wq! salir.

Luego emita el comando git commit con la opción de enmienda.

git commit --amend --author = "Correo electrónico de nombre de usuario" --no-edit

Luego emita el siguiente comando.

git rebase --continuar

Una vez que el autor de confirmación se actualiza en el repositorio local, envíe los cambios al repositorio remoto.

ChannaB
fuente
Creo que esta es la forma más sencilla de hacerlo. Estaba usando el comando reword y eso falla. Aprendí que necesito usar el comando de edición en su lugar. Tal vez la palabra clave "editar" se puede resaltar. Gracias por la respuesta @ChannaB 👍
Berk
Realmente fácil de seguir los pasos. ¡Gracias!
Habiba
4

También hay un enfoque perezoso para este problema, especialmente si tiene más de una confirmación que desea cambiar. En mi caso, tenía una nueva sucursal con varias confirmaciones con un autor equivocado, así que lo que me ayudó:

Ve a tu sucursal original:

git checkout develop

Crea una nueva rama a partir de ella

git checkout -b myFeature develop 

Fusionarlo sin información de confirmación como una confirmación:

git merge --no-commit --squash branchWrongAuthor

Es posible que también desee organizar los cambios:

git stage .

Cambia el nombre del autor y confirma los cambios:

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

Y eso es todo, puedes impulsar los cambios.

git push

Puede eliminar la rama con un autor incorrecto después de eso.

alexlz
fuente
4

Pasos para renombrar el nombre del autor después de confirmar

  1. Primero escriba "git log" para obtener la identificación de confirmación y más detalles
  2. git rebase i HEAD ~ 10 (10 es la confirmación total para mostrar en rebase)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. Luego escriba "git rebase --continue" o "git rebase --abort" según su necesidad

    • ahora se abrirá su ventana de rebase, haga clic en la tecla "i" del teclado
    • entonces obtendrá una lista de confirmaciones a 10 [porque hemos pasado 10 confirmaciones arriba] Como a continuación

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Ahora debe agregar el siguiente comando justo debajo del commit que desea editar, como a continuación

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <[email protected]>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <[email protected]>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <[email protected]>'

    1. Eso es todo, ahora solo presione ESC: wq y ya está todo listo

    2. Luego git push origin HEAD: BRANCH NAME -f [por favor, cuide de -f Force push]

    como git push -fogit push origin HEAD: dev -f

Kirtikumar A.
fuente
gran respuesta, ¿podrías actualizar el punto 6 con un ejemplo de git pushcomando?
Lukasz 'Severiaan' Grela
1
@ Lukasz'Severiaan'Grela editado, por favor verifique ahora, Gracias
Kirtikumar A.
3

Cambiar el nombre y correo electrónico de su Comprador globalmente:

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

Cambio del nombre y correo electrónico de su committer por repositorio

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

Cambiar la información del autor solo para la próxima confirmación:

$ git commit --author="John Doe <[email protected]>"

Sugerencia : Para otra situación y leer más información, lea la referencia de la publicación .

AmerllicA
fuente
2

Si lo que necesita cambiar es el AUTOR DEL ÚLTIMO commit y nadie más está usando su repositorio, puede deshacer su último commit con:

git push -f origin last_commit_hash:branch_name 

cambie el nombre del autor de su compromiso con:

git commit --amend --author "type new author here"

Salga del editor que se abre y presione nuevamente su código:

git push
pebox11
fuente
2

Para el mensaje de confirmación de fusión, descubrí que no puedo modificarlo usando rebase, al menos en gitlab. Muestra la fusión como una confirmación, pero no puedo volver a basarme en ese #sha. Encontré que esta publicación es útil.

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

Estas tres líneas de código hicieron el trabajo para cambiar el mensaje de confirmación de fusión (como autor).

Jason Liu
fuente
1

puedes usar estos comandos desde la página oficial de github

https://help.github.com/en/github/using-git/changing-author-info

aquí están los comandos

#!/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

aquí puede cambiar el correo electrónico anterior a su nuevo nombre de usuario y dirección de correo electrónico.

Mudassir Khan
fuente