Como mudar o autor de um commit para um commit em particular?

Eu quero mudar o autor de um compromisso em particular na história. Este não é o último commit.

Eu sei sobre esta questão - como posso alterar o autor de um commit no git?

Mas estou pensando em algo em que identifico um commit por hash ou hash curto.

1564
15 июня '10 в 7:00 2010-06-15 07:00 MicTech definido 15 de junho '10 às 7:00 2010-06-15 07:00
@ 9 respostas

Rebase interativo a partir de um ponto anterior no histórico que o commit que você precisa mudar ( git rebase -i <earliercommit> ). Na lista de confirmações que foram realocadas, altere o texto de pick para edit ao lado do hash do que você deseja alterar. Então, quando o git solicitar que você altere o commit, use isto:

 git commit --amend --author="Author Name <email@address.com>" 

Por exemplo, se o seu histórico de commit ABCDE-f com F HEAD , e você quiser alterar o autor de C e D , então você ...

  1. Especifique git rebase -i B ( aqui está um exemplo do que você verá depois de executar o comando git rebase -i B )
    • se você precisar editar A , use git rebase -i --root
  2. mudar linhas para C e D de pick para edit
  3. Assim que o rebase começar, ele irá parar primeiro em C
  4. Você deve fazer git commit --amend --author="Author Name <email@address.com>"
  5. Então git rebase --continue
  6. Isso irá novamente parar em D
  7. Então você deve novamente git commit --amend --author="Author Name <email@address.com>"
  8. git rebase --continue
  9. A realocação será concluída.
  10. Use git push -f para atualizar sua origem com confirmações atualizadas.
2672
15 июня '10 в 7:31 2010-06-15 07:31 a resposta foi dada Amber 15 de junho '10 às 7:31 2010-06-15 07:31

A resposta aceita para essa pergunta é o uso surpreendentemente inteligente de relocação interativa, mas infelizmente causa conflitos, se o autor que estamos tentando alterar for usado pelo autor para o ramo que foi posteriormente mesclado. No caso mais geral, isso não funciona ao processar histórias sujas.

Como tenho medo de executar scripts que dependam da configuração e reconfiguração de variáveis ​​de ambiente para sobrescrever o histórico do git, estou escrevendo uma nova resposta com base nessa postagem, que é semelhante a essa resposta, mas é mais completa.

O seguinte é testado e funciona, em contraste com a resposta associada. Suponha, para maior clareza, que 03f482d6 seja um commit, cujo autor estamos tentando substituir, e 42627abe seja um commit com um novo autor.

border=0
  1. Faça um commit que estamos tentando mudar.

     git checkout 03f482d6 
  2. Faça o autor mudar.

     git commit --amend --author "New Author Name <New Author Email>" 

    Agora temos um novo commit com um hash igual a 42627abe .

  3. Check-out do ramo original.

  4. Substitua o commit antigo por um novo localmente.

     git replace 03f482d6 42627abe 
  5. Reescreva todos os commits futuros com base na substituição.

     git filter-branch -- --all 
  6. Remova o substituto para limpeza.

     git replace -d 03f482d6 
  7. Clique no novo histórico (use somente --force se o seguinte falhar, e somente após testar a funcionalidade com git log e / ou git diff ).

     git push --force-with-lease 

Em vez de 4-6, você pode simplesmente mudar para o novo commit:

 git rebase -i 42627abe 
369
04 марта '15 в 5:11 2015-03-04 05:11 a resposta é dada merlin2011 March 04 '15 at 5:11 2015-03-04 05:11
09 июня '15 в 19:02 2015-06-09 19:02 Resposta é dada por olivieradam666 09 de junho de 2015 às 19:02 2015-06-09 19:02
  • Redefina seu endereço de e-mail na configuração:

    git config --global user.email example@email.com

  • Agora redefina o autor do seu commit sem editar:

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

82
05 апр. a resposta é dada pravbeatle 05 de abril 2017-04-05 15:44 '17 às 3:44 pm 2017-04-05 15:44

Você pode alterar o autor do último commit 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 difícil. Você precisa iniciar uma reinstalação interativa, marcar as confirmações como corretas e alterá-las uma a uma e concluir.

Comece reiniciando com git rebase -i . Ele vai te mostrar algo assim.

Altere a palavra-chave pick para edit para os commits que você deseja alterar o nome do autor.

Em seguida, feche o editor. Para iniciantes, pressione Escape , digite :wq e pressione Enter .

Então você verá seu terminal como se nada tivesse acontecido. Você está realmente no meio de uma permutação interativa. Agora é hora de alterar a correção do nome do seu autor usando o comando acima. Ele irá abrir o editor novamente. Feche e continue reiniciando com git rebase --continue . Repita o mesmo para a quantidade de correção que você deseja editar. Você pode ter certeza de que o resumo interativo terminou quando você recebeu a mensagem No rebase in progress? .

69
29 авг. a resposta é dada por Fatih 29 ago. 2015-08-29 03:52 '15 às 3:52 2015-08-29 03:52

As respostas à pergunta à qual você está conectado são boas respostas e cobrem sua situação (outra pergunta é mais geral, porque envolve reescrever vários commits).

Como pretexto para polling git filter-branch escrevi um script para reescrever o nome do autor e / ou o e-mail do autor para este commit:

15 июня '10 в 8:24 2010-06-15 08:24 Resposta dada por Chris Johnsen em 15 de junho de 2010 às 8:24 2010-06-15 08:24

Ao executar o git rebase -i existe um bit interessante no documento:

Se você quiser redefinir dois ou mais commits para um, substitua o comando "pick" por um segundo e subseqüente commit com "squash" ou "fixup" . Se os commits tiverem autores diferentes, o fixador dobrado será atribuído ao autor do primeiro commit. A mensagem de confirmação proposta para uma consolidação dobrada é uma concatenação das mensagens de confirmação da primeira confirmação e comandos com o comando "squash" , mas omite as mensagens de confirmação de consolidação com o "fixup" .

  • Se você tem uma história ABCDEF ,
  • e você quer mudar os commits B e D (= 2 commits),

então você pode fazer:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • crie commits vazios (um para cada commit):
    • você precisa de uma mensagem para fins de encaminhamento
    • git commit --allow-empty -m "empty"
  • iniciar a operação de reinicialização
    • git rebase -i B^
    • B^ seleciona o elemento pai B
  • você precisa colocar um commit vazio antes de cada commit para mudar
  • Você precisa alterar a pick para squash -los.

Um exemplo de qual 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 

altere para:

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

Ele pedirá que você edite as mensagens:

 # This is a combination of 2 commits. # The first commit message is: empty # This is the 2nd commit message: ...some useful commit message there... 

e você pode simplesmente excluir as primeiras linhas.

12
28 авг. a resposta é dada dnozay 28 ago. 2013-08-28 04:03 '13 às 4:03 2013-08-28 04:03

Há mais um passo para a resposta Amber se você usar um repositório central:

git push -f para forçar um repositório central a atualizar.

Tenha cuidado para não ter muitas pessoas em um ramo, porque isso pode levar a uma perda de consistência.

11
20 дек. A resposta é dada por Fabian76 20 dez. 2013-12-20 18:06 '13 às 18:06 2013-12-20 18:06

Corrigir na frente de:

2019

Outras questões sobre tags ou Ask a Question