DEV Community

Cover image for Drops #02: Como alterar o autor do commit depois do push
William Queiroz
William Queiroz

Posted on • Edited on

Drops #02: Como alterar o autor do commit depois do push

Photo by Yancy Min on Unsplash

E ae dev, tudo bem com você?

Semana passada eu finalmente comecei a usar o dev.to, inaugurando-o com um post que eu havia escrito originalmente lá no Medium, se você ainda não leu, já salva pra ler mais tarde: Drops #01: Corrigindo vulnerabilidades em dependências com Yarn! (ou quase)

Bom, continuando essa série "drops" com dicas e truques que eu uso no dia-a-dia...

Quem nunca subiu um código para o repositório depois de ter "comitado" com o usuário que você usa na empresa, não é mesmo? HAHAHA

Calma, isso é mais comum do que você imagina. Ainda mais se costuma utilizar uma única máquina tanto para o seu trabalho, quanto para aqueles projetos pessoais que você costuma publicar no Github.

A dica de hoje é de como alterar o autor do commit depois de já tê-lo enviado ao seu repositório remoto.

Bora pro post?

Ah! mas antes disso... Esse post faz parte de uma série de artigos "drops" que tenho aqui! Veja a lista:


Alterando o usuário do repositório

Antes de realizarmos as alterações nos commits, vamos definir o usuário que, daqui pra frente, será o autor dos commits futuros.

Para isso, abra um terminal na pasta do seu repositório, e execute os comandos abaixo:

git config --local user.email "<GIT_EMAIL>" --replace-all
git config --local user.name "<GIT_USER>" --replace-all
Enter fullscreen mode Exit fullscreen mode

NOTA: a flag --replace-all irá substituir todas as configurações anteriores.

Altere <GIT_EMAIL> e <GIT_USER> para os seus respectivos valores.

Opcional:

Eu costumo armazenar as credenciais usando o helper store, essa configuração evita que uma janela de credenciais seja aberta a cada interação com o repositório remoto.

Caso você queira usar a mesma configuração, execute o comando abaixo:

git config --local credential.helper store
Enter fullscreen mode Exit fullscreen mode

Veja mais em: https://git-scm.com/docs/git-credential-store

Note que todos os comandos, servirão apenas para o repositório atual, caso queira essa configuração em outros repositórios, basta repetir o processo nos repositórios desejados.

Selecionando os commits para alteração

O git-rebase é uma ferramenta poderosíssima, que nos permite alterar a linha do tempo sem ser necessário gerar novas ramificações. Com isso é possível juntar commits, reordenar, removê-los, e um bocado de outras coisas.

Vamos utilizá-lo para selecionar os commits!

Se você quer alterar todos os commits, desde o primeiro, basta executar o seguinte comando:

git rebase -i --root
Enter fullscreen mode Exit fullscreen mode

Caso queira alterar apenas os 3 ou N últimos commits, basta utilizar o comando git rebase -i HEAD~3 ou git rebase -i HEAD~n, sendo n o número de commits que deseja alterar.

Isso abrirá um arquivo chamado git-rebase-todo, que é exatamente ali onde informaremos o que queremos fazer com os commits, e.g.:

pick 687f049 foo: bar
pick 25a798a fooz: barz

# Rebase f157872..25a798a onto f157872 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Enter fullscreen mode Exit fullscreen mode

No nosso caso, iremos substituir pick por edit:

- pick 687f049 foo: bar
+ edit 687f049 foo: bar
- pick 25a798a fooz: barz
+ edit 25a798a fooz: barz
Enter fullscreen mode Exit fullscreen mode

Podemos então, salvar a edição do arquivo, e fechá-lo.

Alterando o autor

No terminal, veremos a seguinte saída após fechar o arquivo:

You can amend the commit now, with

  git commit --amend 

Once you are satisfied with your changes, run

  git rebase --continue
Enter fullscreen mode Exit fullscreen mode

Beleza! Estamos prontos.

Para cada um dos commits, iremos alterar o autor, com o seguinte comando:

git commit --amend --author="<GIT_USER> <<GIT_EMAIL>>" --no-edit
# e.g.: git commit --amend --author="Lorem Ipsum <lorem@ipsum.com>" --no-edit
Enter fullscreen mode Exit fullscreen mode

Altere <GIT_EMAIL> e <GIT_USER> para os seus respectivos valores.

Após isso, você deve continuar para o próximo commit, que selecionou na edição do git-rebase-todo:

git rebase --continue
Enter fullscreen mode Exit fullscreen mode

Esse processo ocorre para cada commit. Quando finalizado, o rebasing é concluído.

Aqui é importante observar que, você não conseguirá enviar de volta os commits modificados com apenas o comando git push. Isso porque estamos reescrevendo a nossa linha do tempo, isso significa que devemos substituir a branch atual que existe lá no remoto.

Para isso, devemos usar a flag --force:

git push --force
Enter fullscreen mode Exit fullscreen mode

E Voilà!

Alteramos o autor dos commits lá do repositório e ainda garantimos que os próximos commits sejam criados com o usuário correto!

Finalizando…

Bem, é isso, por hoje, é só!

Quero agradecer a você que chegou até aqui, e queria lhe pedir também para encaminhar-me as suas dúvidas, comentários, críticas, correções ou sugestões sobre a postagem.

Deixe seu ❤️ se gostou ou um 🦄 se esse post te ajudou de alguma maneira! Não se esqueça de ver os posts anteriores e me siga para maaaais conteúdos.

Até!

Top comments (8)

Collapse
 
pedro35803 profile image
Pedro Júnior

Eu estava passando por problemas para editar vários commits de uma vez, então estou gravando aqui que para esse caso é necessário usar esses comandos em loop até a hora que o git informar que fez o rebase com sucesso.
faça em um loop:
Primeiro esse commit para informar o user e email para o commit:

git commit --amend --author="<GIT_USER> <<GIT_EMAIL>>" --no-edit
Enter fullscreen mode Exit fullscreen mode

depois esse para realizar o rebase:

git rebase --continue
Enter fullscreen mode Exit fullscreen mode

Mantenha fazendo isso até a hora que o git informar que deu certo
Nessa hora o git vai dizer que o rebase foi realizado com sucesso

Successfully rebased and updated refs/heads/temp.
Enter fullscreen mode Exit fullscreen mode
Collapse
 
wnqueiroz profile image
William Queiroz

Opa! É isso mesmo @pedro35803 , dependendo da quantidade de commits isso deve ser feito até que o rebase seja finalizado, obrigado pela contribuição!

Collapse
 
mmxm0 profile image
Marta Xavier

pow William, valeu demais meu filho. eu já tinha feito esse procedimento usando rebase, mas fazia tempo entçao não tava lembrando muito bem e seu post me salvou demais!

Collapse
 
wnqueiroz profile image
William Queiroz

Eu que agradeço pela leitura @mmxm0! Que bom que te ajudou! Tmj 👊🏻

Collapse
 
igordsgoncalves profile image
Igor Gonçalves

Mano, sensacional teu post me ajudou pakas, muito obrigado.

Collapse
 
wnqueiroz profile image
William Queiroz

Fico muito feliz em ajudar Igor! 🤘🏻🚀

Collapse
 
javoso profile image
Lucas Queiroz

William, seu post me ajudou demais, muito obrigado por compartilhar seu conhecimento.

Collapse
 
wnqueiroz profile image
William Queiroz

Opa meu querido! Bora! Fico feliz demais que te ajudou, tamo junto! 🚀