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.
git
git-commit
MicTech
fuente
fuente
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 depick
aledit
lado del hash del que desea modificar. Luego, cuando git le solicite que cambie la confirmación, use esto:Por ejemplo, si su historial de cambios están
A-B-C-D-E-F
conF
comoHEAD
, y que desea cambiar el autor deC
yD
, a continuación, lo haría ...git rebase -i B
( aquí hay un ejemplo de lo que verá después de ejecutar elgit rebase -i B
comando )A
, usegit rebase -i --root
C
yD
depick
aedit
:wq
).C
git commit --amend --author="Author Name <[email protected]>"
git rebase --continue
D
git commit --amend --author="Author Name <[email protected]>"
nuevogit rebase --continue
git push -f
para actualizar su origen con los commits actualizados.fuente
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 usogit 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, y42627abe
es el commit con el nuevo autor.Verifique el commit que estamos tratando de modificar.
Haz que el autor cambie.
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.
Reescribe todas las confirmaciones futuras basadas en el reemplazo.
Retire el reemplazo por limpieza.
Empuje el nuevo historial (solo use --force si falla lo siguiente, y solo después de verificar la cordura con
git log
y / ogit diff
).En lugar de 4-6, solo puede volver a crear una nueva confirmación:
fuente
git rebase -i
. Nunca he oído hablar de estogit 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
Empuje el historial corregido a GitHub:
O si desea insertar referencias seleccionadas de las ramas, use
fuente
clone
/push
, terminará con un espacio de nombre de respaldorefs/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 [email protected]
Ahora restablezca el autor de su confirmación sin necesidad de editar:
git commit --amend --reset-author --no-edit
fuente
It's not last commit.
Entonces, ¿cómo lo haríanamend
?git reset HEAD~
, ejecuté sus líneas sugeridas, luego hice el siguiente compromiso manualmente nuevamente. Funcionó bien!git config --local user.name FirstName LastName
ygit config --local user.email [email protected]
. Luego aplique a los últimos seis commits usandogit rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
. Finalmente empujarlo al repositorio remoto de Git usandogit push --force-with-lease
.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.Cambie la
pick
palabra clave aedit
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 presioneEnter
.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 elNo rebase in progress?
mensaje.fuente
pick
acción y agregar después de cada líneaexec git commit --no-edit --amend --author="MyNewAuthor <[email protected]>"
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:fuente
Comprometerse antes:
Para corregir el autor para todas las confirmaciones, puede aplicar el comando de la respuesta de @ Amber:
O para reutilizar su nombre y correo electrónico, simplemente puede escribir:
Comprometerse después del comando:
Por ejemplo, para cambiar todo a partir de
4025621
:Debes correr:
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:
o agregue este alias en
~/.gitconfig
:Y luego corre:
fuente
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.
fuente
Al hacerlo,
git rebase -i
hay este bit interesante en el documento:A-B-C-D-E-F
,B
yD
(= 2 commits),entonces puedes hacer:
git config user.name "Correct new name"
git config user.email "[email protected]"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
selecciona el padre deB
.pick
asquash
para aquellos.Ejemplo de lo que
git rebase -i B^
te dará:cambia eso a:
Le pedirá que edite los mensajes:
y solo puedes eliminar las primeras líneas.
fuente
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 útilfuente
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:
operaciones detalladas
refs/heads/master.
fuente
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.
fuente
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:
Crea una nueva rama a partir de ella
Fusionarlo sin información de confirmación como una confirmación:
Es posible que también desee organizar los cambios:
Cambia el nombre del autor y confirma los cambios:
Y eso es todo, puedes impulsar los cambios.
Puede eliminar la rama con un autor incorrecto después de eso.
fuente
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 <[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]>'
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
fuente
git push
comando?Cambiar el nombre y correo electrónico de su Comprador globalmente:
Cambio del nombre y correo electrónico de su committer por repositorio
Cambiar la información del autor solo para la próxima confirmación:
Sugerencia : Para otra situación y leer más información, lea la referencia de la publicación .
fuente
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:
cambie el nombre del autor de su compromiso con:
Salga del editor que se abre y presione nuevamente su código:
fuente
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.Estas tres líneas de código hicieron el trabajo para cambiar el mensaje de confirmación de fusión (como autor).
fuente
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
aquí puede cambiar el correo electrónico anterior a su nuevo nombre de usuario y dirección de correo electrónico.
fuente