Toure Holder ESPECIALISTA DE TECNOLOGIA
Uma lista de comandos git usados com muita frequência com exemplos e dicas.
- Criando e alterando repositórios e branches
- git clone
- git checkout
- git add
- git commit
- git push
- git pull
- Visualizando estado atual e histórico
- git status
- git log
- Alterando o histórico
- git rebase
- Como mudar a mensagem de um commit
- Mudar a mensagem do último commit
- Mudar a mensagem de um commit específico
- Como mudar a ordem de alguns commits
- push –force
- BÔNUS: Pro-tips
- Dicas para manter um histórico de git sucinto, limpo (e bonito)
- Como adicionar mudanças ao último commit
- Como transformar X commits em 1 commit
- Uma dica para encontrar um commit que introduziu um bug rapidamente
- Dicas para manter um histórico de git sucinto, limpo (e bonito)
Criando e alterando repositórios e branches
git clone
Clonar um respositório em uma nova pasta. Veja mais
Exemplo:
git clone git@ssh.dev.azure.com:v3/wizsolucoes/SquadUnidade/meuproduto-web
git checkout
Mudar a branch local. Veja mais
Exemplo:
# Mudar para branch local chamada master.
git checkout master
# Criar uma nova branch local e mudar para essa branch.
git checkout -b 'feature/login'
git add
Adicionar arquivos ao index do git. (Fazer o “stage“ de arquivos.) Veja mais
Exemplos:
# Adicionar um arquivo específico
git add src/myfile.ts
# Adicionar arquivos somente modificados, mas não adiciona arquivos novos.
git add -u
# Adicionar todos os arquivos novos e modificados
git add -A
git commit
Gravar mudanças no repositório. Criar/modificar commits. Veja mais
Exemplos:
# Criar um commit com os arquivos adicionados ao index e escrever a mensagem em seguida no editor de texto.
git commit
# Criar um commit com os arquivos adicionados ao index com a mensagem de commit
git commit -m 'feat: implementar login'
# Modificar commit mais recente, adicionado alterações indexadas e/ou alterando a mensagem de commit
git commit --amend
git push
Enviar mudanças no repositório local para o repositório remoto. Veja mais
Exemplos:
# Desde Git 2.0, por default envia as mudanças da branch local atual para a branch remota associada. Antes do Git 2.0, por default envia mudanças de todas as branches locais
git push
# Enviar as mudanças da branch local atual para a branch remota associada
git push origin 'feature/login'
# Criar uma branch remote, setar como upstream, e envia da branch local atual
git push -u origin 'feature/signup'
# Substituir o hitórico de commits remoto com o histórico de commits local. USAR COM CUIDADO.
git push -f origin 'feature/signup'
git pull
Buscar e integrar mudanças de um repositório remoto ou outra branch local. Veja mais
Exemplos:
# Atualizar todas as branches existentes no repositório remoto
git pull
# Especificar a branch da qual deseja puxas as alterações
git pull origin master
# Buscar mudanças de uma branch remota e inserí-las ANTES dos commits locasl. O USO É ALTAMENTE RECOMENDADO
git pull --rebase origin master
Visualizando estado atual e histórico
git status
Mostrar o status atual do repositório local. Veja mais
Exemplo:
git status
git log
Mostrar o histórico de commits do repositório local. Veja mais
Exemplo:
git log
# Mostrar histórico resumido. Cada commit ocupa apenas 1 linha.
git log --oneline
Alterando o histórico
git rebase
Rebase é o processo de mudar ou combinar uma sequência de commits. Comumente usado para alterar o histórico do git. Veja mais aqui e aqui. Veja casos de uso e exemplos a seguir.
Como mudar a mensagem de um commit
Mudar a mensagem do último commit
Se você precisar mudar a mensagem do último commit, basta fazer um commit com amend e com uma nova mensagem. Não é preciso fazer um rebase neste caso.
Exemplo:
Suponha o seguinte histórico de commits:
$ git log --oneline
f76775a implementar login
74517e7 docs: readme
Você pode alterar a mensagem do último commit (f76775a) assim:
git commit --amend -m "feat: implementar login"
Mudar a mensagem de um commit específico
Se você precisa alterar a mensagem de um commit que não seja o último. É preciso fazer uma rebase interativa. O comando para iniciar a rebase git rebase
.
Exemplo:
Suponha o seguinte histórico de commits:
$ git log --oneline
6d8772f test: escrever testes para login
f76775a implementar login
74517e7 docs: readme
Iniciamos a rebase interativa usando o commit ANTES dos que queremos alterar como base.
# Repare que a base é o commit antes dos commits que queremos alterar
git rebase -i 74517e7
No editor configurado pelo git vemos o seguinte (truncado):
pick f76775a implementar login
pick 6d8772f test: escrever testes para login
# Rebase 74517e7..6d8772f onto 74517e7 (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
.
.
.
Para modificar a mensagem de um commit precisamos alterar o comando pick
para reword
ou r
. E salvar e fechar a janela do editor.
r f76775a implementar login
pick 6d8772f test: escrever testes para login
# Rebase 74517e7..6d8772f onto 74517e7 (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
.
.
.
Git irá abrir o editor novamente para que você possa escrever a nova mensagem de commit.
feat: implementar login
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: Fri Jan 22 08:51:27 2021 -0300
#
# interactive rebase in progress; onto 74517e7
# Last command done (1 command done):
# reword f76775a implementar login
# Next command to do (1 remaining command):
# pick 3420fa7 test: escrever testes para login
# You are currently editing a commit while rebasing branch 'feature/login' on '74517e7'.
Salve e feche a janela do editor para finalizar a rebase.
Como mudar a ordem de alguns commits
Se você precisa mudar a ordem de commit no histórico. É preciso fazer um rebase interativa. O comando para iniciar a rebase git rebase
.
Exemplo: Suponha o seguinte histórico de commits:
$ git log --oneline
169dbd1 test: escrever testes para login
0e6d5f4 feat: implementar login
74517e7 docs: readme
Iniciamos a rebase interativa usando o commit ANTES dos que queremos alterar como base.
# Repare que a base é o commit antes dos commits que queremos alterar
git rebase -i 74517e7
No editor configurado pelo git vemos o seguinte (truncado):
pick 0e6d5f4 feat: implementar login
pick 169dbd1 test: escrever testes para login
# Rebase 74517e7..169dbd1 onto 74517e7 (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
Para mudar a ordem dos commits, basta reordenar as linhas, salvar e fechar a janela do editor.
pick 169dbd1 test: escrever testes para login
pick 0e6d5f4 feat: implementar login
# Rebase 74517e7..6d8772f onto 74517e7 (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
.
.
.
Git irá finalizar a rebase sem a necessidade de mais interação.
push –force
Depois de uma rebase interativa, o histórico de commits local pode ficar dessincronizado com o histórico remoto. Quando isso acontece, é necessário fazer um push forçado com a flag --force
ou -f
para sobrescrever o histórico remoto.
Exemplo:
git push -f origin 'feature/login'
BÔNUS: Pro-tips
Dicas para manter um histórico de git sucinto, limpo (e bonito)
Manter um histórico de git sucinto com apenas commits significativos facilita o entendimento das alterações feitas em um repositório e facilita encontrar e reverter commits que introduziram bugs. Seguem algumas formas de criar commits atómicos que seguem a regra: “One change, one commit”.
Como adicionar mudanças ao último commit
Sabia que é super fácil adicionar suas alterações ao último commit do histórico? Basta adicionar as alterações com git add
e fazer o commit com a flag --amend
.
Experimente:
git add -u
git commit --amend
Como transformar X commits em 1 commit
Um dos comandos disponíveis na rebase interativa é squash
e é muito útil para transformar X commits em 1 commit.
Suponha o seguinte histórico de commits:
3b0320a corrigir um problema na tela de login
e880de1 corrigir typo na tela de login
43faa39 integrar com api de login
416a586 escrever a lógica da ui de login
ad9bd7d criar ui de login
6ce4688 test: escrever testes para login
Com uma rebase interativa podemos juntar os últimos 5 commits (antes de criar um PR, por exemplo):
# Usamos o commit ANTES dos que queremos alterar como base.
git rebase -i 6ce4688
No editor configurado pelo git vemos o seguinte (truncado):
pick ad9bd7d criar ui de login
pick 416a586 escrever a lógica da ui de login
pick 43faa39 integrar com api de login
pick e880de1 corrigir typo na tela de login
pick b003267 corrigir um problema na tela de login
# Rebase 6ce4688..b003267 onto e880de1 (5 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
Com o comando squash
ou s
, podemos juntar um commit com seu commit anterior. Para juntar múltiplos commits podem fazer assim:
pick ad9bd7d criar ui de login
s 416a586 escrever a lógica da ui de login
s 43faa39 integrar com api de login
s e880de1 corrigir typo na tela de login
s b003267 corrigir um problema na tela de login
# Rebase 6ce4688..b003267 onto e880de1 (5 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
Repare que é necessário usar o primeiro commit, mantendo o pick
.
Git irá abrir o editor novamente para que você possa escrever a nova mensagem de commit. Depois de salvar a nova mensagem de fechar o editor, o commando git log revela que os 5 commits foram transformados em 1.
$ git log --oneline
9f3f545 feat: implementar login
6ce4688 test: escrever testes para login
Uma dica para encontrar um commit que introduziu um bug rapidamente
O time percebeu que alguma funcionalidade da aplicação que estava funcionando não está funcionando mais e ninguém sabe quando parou de funcionar?
git bisect
é seu amigão.
Vejam estes links para conhecer melhor e aprender a encontrar commits ruins rapidamente.
testes