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.
git
git-commit
MicTech
fonte
fonte
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 depick
paraedit
próximo ao hash do que você deseja modificar. Então, quando o git solicitar que você altere o commit, use o seguinte:Por exemplo, se seu histórico de confirmação estiver
A-B-C-D-E-F
comF
asHEAD
e você desejar alterar o autor deC
eD
, então você ...git rebase -i B
( aqui está um exemplo do que você verá após executar ogit rebase -i B
comando )A
, usegit rebase -i --root
C
eD
depick
paraedit
:wq
).C
git commit --amend --author="Author Name <[email protected]>"
git rebase --continue
D
git commit --amend --author="Author Name <[email protected]>"
novamentegit rebase --continue
git push -f
para atualizar sua origem com as confirmações atualizadas.fonte
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çãogit 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 e42627abe
é o commit com o novo autor.Faça o checkout do commit que estamos tentando modificar.
Faça o autor mudar.
Agora, temos um novo commit com hash assumido
42627abe
.Faça o checkout do ramo original.
Substitua o commit antigo pelo novo localmente.
Reescreva todas as confirmações futuras com base na substituição.
Remova a substituição para limpeza.
Empurre o novo histórico (use somente --force se o abaixo falhar e somente após verificar a sanidade com
git log
e / ougit diff
).Em vez de 4-6, você pode apenas refazer o novo commit:
fonte
git rebase -i
. Nunca ouvi falar dissogit 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
Envie o histórico corrigido para o GitHub:
OU se você deseja enviar referências selecionadas dos ramos, use
fonte
clone
/push
, terá um espaço para nome de backuprefs/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 [email protected]
Agora redefina o autor do seu commit sem a necessidade de edição:
git commit --amend --reset-author --no-edit
fonte
It's not last commit.
Então, como eles iriamamend
?git reset HEAD~
executei as linhas sugeridas e executei o próximo commit manualmente novamente. Funcionou bem!git config --local user.name FirstName LastName
egit config --local user.email [email protected]
. Em seguida, aplique nos últimos seis commits usandogit rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
. Por fim, envie-o para o repositório Git remoto usandogit push --force-with-lease
.Você pode alterar o autor da última confirmação usando o comando abaixo.
git commit --amend --author="Author Name <[email protected]>"
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 paraedit
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 pressioneEnter
.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 aNo rebase in progress?
mensagem.fonte
pick
ação e adicionar após cada linhaexec git commit --no-edit --amend --author="MyNewAuthor <[email protected]>"
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:fonte
Confirmar antes:
Para corrigir o autor de todas as confirmações, você pode aplicar o comando da resposta de @ Amber:
Ou, para reutilizar seu nome e e-mail, basta escrever:
Confirme após o comando:
Por exemplo, para alterar tudo a partir de
4025621
:Você deve executar:
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:
ou adicione esse alias em
~/.gitconfig
:E então execute:
fonte
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.
fonte
Ao fazer
git rebase -i
isso, há uma parte interessante no documento:A-B-C-D-E-F
,B
eD
(= 2 confirmações),então você pode fazer:
git config user.name "Correct new name"
git config user.email "[email protected]"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
seleciona o pai deB
.pick
parasquash
para aqueles.Exemplo do que
git rebase -i B^
lhe dará:mude isso para:
Ele solicitará que você edite as mensagens:
e você pode simplesmente remover as primeiras linhas.
fonte
Como resposta à resposta de Eugen Konkov , para iniciar a partir do commit raiz, use
--root
flag. A--no-edit
bandeira também é útilfonte
Encontre uma maneira de mudar o usuário rapidamente e não tenha efeito colateral para outras pessoas.
Maneira simples e clara:
operações detalhadas
refs/heads/master.
fonte
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.
fonte
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:
Crie um novo ramo a partir dele:
Mesclar isso sem informações de confirmação como uma confirmação:
Você também pode querer organizar mudanças:
Mude o nome do autor e confirme as alterações:
E é isso, você pode empurrar as mudanças.
Você pode excluir a ramificação com um autor errado depois disso.
fonte
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 <[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]>'
É 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
fonte
git push
comando?Alterando seu nome e e-mail de responsável globalmente:
Alterando o nome e o email do responsável por repositório:
Alterando as informações do autor apenas para o próximo commit:
Dica : Para outras situações e leia mais informações, leia a referência do post .
fonte
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:
altere o nome do autor do seu commit com:
Saia do editor que abre e envie novamente seu código:
fonte
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.Essas três linhas de código fizeram o trabalho de alterar a mensagem de confirmação de mesclagem (como autor).
fonte
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
aqui você pode alterar o e-mail antigo para seu novo nome de usuário e endereço de e-mail.
fonte