Quero mudar o autor de um commit específico na história. Não é o último commit.
Eu sei sobre essa pergunta - Como altero o autor de um commit no git?
Mas estou pensando em algo, onde identifico o commit por hash ou short-hash.
Quero mudar o autor de um commit específico na história. Não é o último commit.
Eu sei sobre essa pergunta - Como altero o autor de um commit no git?
Mas estou pensando em algo, onde identifico o commit por hash ou short-hash.
Respostas:
Rebase interativo fora de um ponto anterior no histórico que o commit que você precisa modificar ( git rebase -i <earliercommit>
). Na lista de confirmações que estão sendo reformuladas, altere o texto de pick
para edit
próximo ao hash do que você deseja modificar. Então, quando o git solicitar que você altere o commit, use o seguinte:
git commit --amend --author="Author Name <email@address.com>" --no-edit
Por exemplo, se seu histórico de confirmação estiver A-B-C-D-E-F
com F
as HEAD
e você desejar alterar o autor de C
e D
, então você ...
git rebase -i B
( aqui está um exemplo do que você verá após executar o git rebase -i B
comando )
A
, usegit rebase -i --root
C
e D
de pick
paraedit
:wq
).C
git commit --amend --author="Author Name <email@address.com>"
git rebase --continue
D
git commit --amend --author="Author Name <email@address.com>"
novamentegit rebase --continue
git push -f
para atualizar sua origem com as confirmações atualizadas.git rebase -i <commit>
vim
. Para salvar e sair, digite Esc: wq Enter. Por outro lado, se for Nano e você vir coisas como "WriteOut: ^ O" ao longo da parte inferior, use Ctrl + O, Enter, Ctrl + X.
--no-edit
opção git commit --amend --reset-author --no-edit
não abre um editor. Disponível desde o git 1.7.9.
git rebase -i --root
A resposta aceita para essa pergunta é um uso maravilhosamente inteligente de rebase interativa, mas infelizmente exibe conflitos se o commit em que estamos tentando mudar o autor costumava estar em um ramo que foi posteriormente incorporado. Mais geralmente, ele não funciona ao lidar com histórias confusas.
Como estou apreensivo com a execução de scripts que dependem da configuração e da configuração de variáveis de ambiente para reescrever o histórico do git, estou escrevendo uma nova resposta baseada neste post, que é semelhante a essa resposta, mas é mais completa.
O seguinte é testado e está funcionando, ao contrário da resposta vinculada. Assuma, por clareza da exposição, que 03f482d6
é o commit cujo autor estamos tentando substituir e 42627abe
é o commit com o novo autor.
Faça o checkout do commit que estamos tentando modificar.
git checkout 03f482d6
Faça o autor mudar.
git commit --amend --author "New Author Name <New Author Email>"
Agora, temos um novo commit com hash assumido 42627abe
.
Faça o checkout do ramo original.
Substitua o commit antigo pelo novo localmente.
git replace 03f482d6 42627abe
Reescreva todas as confirmações futuras com base na substituição.
git filter-branch -- --all
Remova a substituição para limpeza.
git replace -d 03f482d6
Empurre o novo histórico (use somente --force se o abaixo falhar e somente após verificar a sanidade com git log
e / ou git diff
).
git push --force-with-lease
Em vez de 4-6, você pode apenas refazer o novo commit:
git rebase -i 42627abe
git rebase -i
. Nunca ouvi falar disso git replace
antes. 1
--force-with-lease
vez de -f
. É mais seguro.
git filter-branch -- --all
está alterando confirmações em todas as ramificações em que a confirmação original estava. Se você não possui credenciais suficientes (ou simplesmente não deseja alterar o histórico de ramificações de outras pessoas), é bom ter cuidado com esta resposta.
A documentação do Github contém um script que substitui as informações do commit de todos os commits em uma ramificação .
Execute o seguinte script do terminal depois de alterar os valores das variáveis
#!/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
Envie o histórico corrigido para o GitHub:
git push --force --tags origin 'refs/heads/*'
OU se você deseja enviar referências selecionadas dos ramos, use
git push --force --tags origin 'refs/heads/develop'
clone
/ push
, terá um espaço para nome de backup refs/original/
. Não consegui encontrar uma maneira de remover esse espaço de nomes de forma inteligente, então acabei excluindo o diretório .git/refs/original
, que funcionou.
git push -f
forçar as alterações no repo.
Redefina seu email para a configuração globalmente:
git config --global user.email example@email.com
Agora redefina o autor do seu commit sem a necessidade de edição:
git commit --amend --reset-author --no-edit
It's not last commit.
Então, como eles iriam amend
?
git reset HEAD~
executei as linhas sugeridas e executei o próximo commit manualmente novamente. Funcionou bem!
git config --local user.name FirstName LastName
e git config --local user.email first.last@example.com
. Em seguida, aplique nos últimos seis commits usando git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
. Por fim, envie-o para o repositório Git remoto usando git push --force-with-lease
.
Você pode alterar o autor da última confirmação usando o comando abaixo.
git commit --amend --author="Author Name <email@address.com>"
No entanto, se você quiser alterar mais de um nome de autor, é um pouco complicado. Você precisa iniciar uma nova reformulação interativa, marcar as confirmações como editar, alterá-las uma a uma e terminar.
Comece a rebasear com git rebase -i
. Isso mostrará algo assim.
Altere a pick
palavra-chave para edit
para as confirmações nas quais deseja alterar o nome do autor.
Depois feche o editor. Para os iniciantes, pressione Escape
e digite :wq
e pressione Enter
.
Então você verá seu terminal como se nada tivesse acontecido. Na verdade, você está no meio de um rebase interativo. Agora é hora de alterar o nome do autor do commit usando o comando acima. Ele abrirá o editor novamente. Saia e continue com o rebase git rebase --continue
. Repita o mesmo para a contagem de confirmação que você deseja editar. Você pode ter certeza de que o rebase interativo terminou quando receber a No rebase in progress?
mensagem.
pick
ação e adicionar após cada linhaexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
As respostas na pergunta à qual você vinculou são boas e abrangem sua situação (a outra pergunta é mais geral, pois envolve a reescrita de várias confirmações).
Como desculpa para experimentar git filter-branch
, escrevi um script para reescrever o Nome do Autor e / ou o E-mail do Autor para um determinado commit:
#!/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
Confirmar antes:
Para corrigir o autor de todas as confirmações, você pode aplicar o comando da resposta de @ Amber:
git commit --amend --author="Author Name <email@address.com>"
Ou, para reutilizar seu nome e e-mail, basta escrever:
git commit --amend --author=Eugen
Confirme após o comando:
Por exemplo, para alterar tudo a partir de 4025621
:
Você deve executar:
git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621
Nota: Para incluir um autor que contenha espaços como nome e endereço de e-mail, o autor deve estar entre aspas. Por exemplo:
git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621
ou adicione esse alias em ~/.gitconfig
:
[alias]
reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --
E então execute:
git reauthor 4025621 Eugen
git shortlog -e -s
.
Há uma etapa adicional na resposta de Amber se você estiver usando um repositório centralizado:
git push -f
para forçar a atualização do repositório central.
Cuidado para não haver muitas pessoas trabalhando no mesmo ramo, pois isso pode arruinar a consistência.
Ao fazer git rebase -i
isso, há uma parte interessante no documento:
Se você deseja dobrar duas ou mais confirmações em uma, substitua o comando
"pick"
da segunda e as confirmações subsequentes por"squash"
ou"fixup"
. Se os commits tiverem autores diferentes, o commit dobrado será atribuído ao autor do primeiro commit. A mensagem de confirmação sugerida para a confirmação dobrada é a concatenação das mensagens de confirmação da primeira confirmação e daquelas com o"squash"
comando, mas omite as mensagens de confirmação de confirmações com o"fixup"
comando.
A-B-C-D-E-F
,B
e D
(= 2 confirmações),então você pode fazer:
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^
seleciona o pai de B
.pick
para squash
para aqueles.Exemplo do que git rebase -i B^
lhe 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
mude isso para:
# 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
Ele solicitará que você edite as mensagens:
# 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...
e você pode simplesmente remover as primeiras linhas.
Como resposta à resposta de Eugen Konkov , para iniciar a partir do commit raiz, use --root
flag. A --no-edit
bandeira também é útil
git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
Encontre uma maneira de mudar o usuário rapidamente e não tenha efeito colateral para outras pessoas.
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
Se a confirmação que você deseja alterar não for a última confirmação, siga as etapas abaixo. Se o seu commit estiver em uma ramificação diferente, primeiro mude para essa ramificação.
git checkout branch_name
Localize o commit antes do commit que você deseja alterar e encontre seu hash. Em seguida, emita o comando rebase.
git rebase -i -p hash de confirmação
Em seguida, um editor será aberto e digite 'edit' para as confirmações que você deseja alterar. Deixe outras pessoas com a opção padrão 'pick'. Uma vez alterado, digite a tecla 'esc' e wq! sair.
Em seguida, emita o comando git commit com a opção de alteração.
git commit --amend --author = "Nome de usuário e-mail" --no-edit
Em seguida, emita o seguinte comando.
git rebase --continuar
Depois que o autor da confirmação for atualizado no repositório local, envie as alterações para o repositório remoto.
Há também uma abordagem preguiçosa para esse problema, especialmente se você tiver mais de um commit que deseja alterar. No meu caso, eu tinha uma nova ramificação com vários commits com um autor errado, então o que me ajudou:
Vá para o seu ramo original:
git checkout develop
Crie um novo ramo a partir dele:
git checkout -b myFeature develop
Mesclar isso sem informações de confirmação como uma confirmação:
git merge --no-commit --squash branchWrongAuthor
Você também pode querer organizar mudanças:
git stage .
Mude o nome do autor e confirme as alterações:
git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"
E é isso, você pode empurrar as mudanças.
git push
Você pode excluir a ramificação com um autor errado depois disso.
Etapas para renomear o nome do autor após o envio da confirmação
git rebase i HEAD ~ 10 (10 é o total comprometido para exibir na 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.
Em seguida, digite "git rebase --continue" ou "git rebase --abort" conforme sua necessidade
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
Agora você precisa adicionar o comando abaixo, logo abaixo do commit que você deseja editar, como abaixo
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>'
É isso aí, agora basta pressionar ESC,: wq e está tudo pronto
Em seguida, git push origin HEAD: FILIAL NOME -f [cuide de -f Force push]
gosto git push -f
ougit push origin HEAD: dev -f
git push
comando?
Alterando seu nome e e-mail de responsável globalmente:
$ git config --global user.name "John Doe"
$ git config --global user.email "john@doe.org"
Alterando o nome e o email do responsável por repositório:
$ git config user.name "John Doe"
$ git config user.email "john@doe.org"
Alterando as informações do autor apenas para o próximo commit:
$ git commit --author="John Doe <john@doe.org>"
Dica : Para outras situações e leia mais informações, leia a referência do post .
Se o que você precisa mudar é o commit do AUTOR DO ÚLTIMO e nenhum outro está usando seu repositório, você pode desfazer seu último commit com:
git push -f origin last_commit_hash:branch_name
altere o nome do autor do seu commit com:
git commit --amend --author "type new author here"
Saia do editor que abre e envie novamente seu código:
git push
Para a mensagem de consolidação de mesclagem, descobri que não posso alterá-la usando rebase
, pelo menos no gitlab. Ele mostra a mesclagem como uma confirmação, mas não posso me refazer à #sha. Achei que este post é útil.
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
Essas três linhas de código fizeram o trabalho de alterar a mensagem de confirmação de mesclagem (como autor).
você pode usar esses comandos na página oficial do github
https://help.github.com/en/github/using-git/changing-author-info
aqui estão os 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
aqui você pode alterar o e-mail antigo para seu novo nome de usuário e endereço de e-mail.