Quiero cambiar el autor de una confirmación específica en la historia. No es el último compromiso.
Sé sobre esta pregunta: ¿cómo cambio el autor de un commit en git?
Pero estoy pensando en algo, donde identifico el commit por hash o short-hash.
Quiero cambiar el autor de una confirmación específica en la historia. No es el último compromiso.
Sé sobre esta pregunta: ¿cómo cambio el autor de un commit en git?
Pero estoy pensando en algo, donde identifico el commit por hash o short-hash.
Respuestas:
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 pick
al edit
lado 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@address.com>" --no-edit
Por ejemplo, si su historial de cambios están A-B-C-D-E-F
con F
como HEAD
, y que desea cambiar el autor de C
y D
, a continuación, lo haría ...
git rebase -i B
( aquí hay un ejemplo de lo que verá después de ejecutar el git rebase -i B
comando )
A
, usegit rebase -i --root
C
y D
de pick
aedit
:wq
).C
git commit --amend --author="Author Name <email@address.com>"
git rebase --continue
D
git commit --amend --author="Author Name <email@address.com>"
nuevogit rebase --continue
git push -f
para actualizar su origen con los commits actualizados.git rebase -i <commit>
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.
--no-edit
Opción de uso git commit --amend --reset-author --no-edit
No abrirá un editor. Disponible desde git 1.7.9.
git rebase -i --root
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 03f482d6
es el commit cuyo autor estamos tratando de reemplazar, y 42627abe
es el commit con el nuevo autor.
Verifique el commit que estamos tratando de modificar.
git checkout 03f482d6
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
.
Verifique la rama original.
Reemplace el compromiso anterior con el nuevo localmente.
git replace 03f482d6 42627abe
Reescribe todas las confirmaciones futuras basadas en el reemplazo.
git filter-branch -- --all
Retire el reemplazo por limpieza.
git replace -d 03f482d6
Empuje el nuevo historial (solo use --force si falla lo siguiente, y solo después de verificar la cordura con git log
y / 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
git rebase -i
. Nunca he oído hablar de esto git replace
antes. +1
--force-with-lease
lugar de -f
. Es más seguro.
git filter-branch -- --all
está 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.
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="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
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'
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ó.
git push -f
deberá forzar los cambios de inserción en el repositorio.
Restablezca su correo electrónico a la configuración globalmente:
git config --global user.email example@email.com
Ahora restablezca el autor de su confirmación sin necesidad de editar:
git commit --amend --reset-author --no-edit
It's not last commit.
Entonces, ¿cómo lo harían amend
?
git reset HEAD~
, ejecuté sus líneas sugeridas, luego hice el siguiente compromiso manualmente nuevamente. Funcionó bien!
git config --local user.name FirstName LastName
y git config --local user.email first.last@example.com
. 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
.
Puede cambiar el autor de la última confirmación utilizando el siguiente comando.
git commit --amend --author="Author Name <email@address.com>"
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.
Cambie la pick
palabra clave a edit
las confirmaciones a las que desea cambiar el nombre del autor.
Luego cierra el editor. Para los principiantes, presione y Escape
luego escriba :wq
y 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.
pick
acción y agregar después de cada líneaexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
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
Comprometerse antes:
Para corregir el autor para todas las confirmaciones, puede aplicar el comando de la respuesta de @ Amber:
git commit --amend --author="Author Name <email@address.com>"
O para reutilizar su nombre y correo electrónico, simplemente puede escribir:
git commit --amend --author=Eugen
Comprometerse después del comando:
Por ejemplo, para cambiar todo a partir de 4025621
:
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 <foo@bar.com>\"" 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
git shortlog -e -s
.
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.
Al hacerlo, git rebase -i
hay 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.
A-B-C-D-E-F
,B
y D
(= 2 commits),entonces puedes hacer:
git config user.name "Correct new name"
git config user.email "correct@new.email"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
selecciona el padre de B
.pick
a squash
para 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.
En apoyo a la respuesta de Eugen Konkov , para comenzar desde el commit raíz, use --root
flag. La --no-edit
bandera también es útil
git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
Encuentre una forma que pueda cambiar a los usuarios rápidamente y que no tenga efectos secundarios para los compromisos de otros.
git config user.name "New User"
git config user.email "newuser@gmail.com"
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
git log
git config user.name "New User"
git config user.email "newuser@gmail.com"
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
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
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 --force-with-lease
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.
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.
Pasos para renombrar el nombre del autor después de confirmar
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.
Luego escriba "git rebase --continue" o "git rebase --abort" según su necesidad
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
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 <author.name@mail.com>'
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>'
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <author.name@mail.com>'
Eso es todo, ahora solo presione ESC: wq y ya está todo listo
Luego git push origin HEAD: BRANCH NAME -f [por favor, cuide de -f Force push]
como git push -f
ogit push origin HEAD: dev -f
git push
comando?
Cambiar el nombre y correo electrónico de su Comprador globalmente:
$ git config --global user.name "John Doe"
$ git config --global user.email "john@doe.org"
Cambio del nombre y correo electrónico de su committer por repositorio
$ git config user.name "John Doe"
$ git config user.email "john@doe.org"
Cambiar la información del autor solo para la próxima confirmación:
$ git commit --author="John Doe <john@doe.org>"
Sugerencia : Para otra situación y leer más información, lea la referencia de la publicación .
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
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).
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="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
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.