DEV Community

Cover image for 🆘 Git tips - comandos Ășteis para sobreviver no dia a dia
Lays Hidani
Lays Hidani

Posted on

🆘 Git tips - comandos Ășteis para sobreviver no dia a dia

O versionamento de código ajuda muito nossa vida como desenvolvedores. Porém muitas vezes nos deparamos com algumas situaçÔes difíceis com o git no dia a dia...

Eu gosto de ir tomando notas sobre minhas descobertas conforme vou aprendendo e sobrevivendo para relembrar e consultar sempre que necessĂĄrio.

Separei uma lista de comandos Ășteis (um pouco alĂ©m dos mais bĂĄsicos, e aqueles que geralmente a gente esquece), espero que te ajudem tambĂ©m 😉

Vamos lĂĄ...


Substituir comando entre <>

# URL

Verificar qual a URL remota

git remote -v
Enter fullscreen mode Exit fullscreen mode

Editar url remota

git remote set-url origin <https://github.com/USERNAME/REPOSITORY.git>
Enter fullscreen mode Exit fullscreen mode

Stash

📖 OpçÔes de Git stash (ver Atlassian)

O comando git stash Ă© utilizado para armazenar temporariamente as alteraçÔes que vocĂȘ fez, para poder trabalhar em outra coisa e depois voltar e reaplicĂĄ-las posteriormente.

image
Fonte da imagem: Atlasian

Stash tracked files

git stash
Enter fullscreen mode Exit fullscreen mode

Stash também dos untracked files

git stash -u

Enter fullscreen mode Exit fullscreen mode

onde -u = --include-untracked

Stash de todos os arquivos, incluindo os ignored files

git stash -a
Enter fullscreen mode Exit fullscreen mode

onde -a = --all

Stash com descrição

É possĂ­vel adicionar mensagens/descriçÔes aos stashs, assim como fazemos com os commits:

git stash save <"message">
Enter fullscreen mode Exit fullscreen mode

Listar stashs

git stash list
Enter fullscreen mode Exit fullscreen mode

Deletar stash especĂ­fica

git stash drop stash@{<index>}
Enter fullscreen mode Exit fullscreen mode

Deletar todas stash

git stash clear
Enter fullscreen mode Exit fullscreen mode

Reaplicando alteraçÔes que estão em stash

PadrĂŁo, Ășltimo stash

git stash apply
Enter fullscreen mode Exit fullscreen mode

Escolher qual stash (como em um array, utilize o git stash list para visualizar a lista de stashs):

git stash pop stash@{<index>}
Enter fullscreen mode Exit fullscreen mode

Visualizar Stash diff (stash show)

git stash show
Enter fullscreen mode Exit fullscreen mode

# ou, para visualização completa (-p = --patch):

git stash show -p
Enter fullscreen mode Exit fullscreen mode

Criar branch a partir de stash

git stash branch <branch-name> stash@{<index>}
Enter fullscreen mode Exit fullscreen mode

# Cherry Pick

O cherry-pick é um comando para 'Pegar' um commit de uma branch através do hash do commit e aplicå-lo em outra.

Ex: commitei acidentalmente em outra branch, e desejo trazer o commit para minha branch certa.

Pick 1 commit

git cherry-pick <hash>
Enter fullscreen mode Exit fullscreen mode

Pick vĂĄrios commits

git cherry-pick <hash1> <hash2> <hash3>
Enter fullscreen mode Exit fullscreen mode

Pick de um commit até outro commit

git cherry-pick <hash1...hash3>
Enter fullscreen mode Exit fullscreen mode

# Branchs

Listar Branchs

git branch
Enter fullscreen mode Exit fullscreen mode

Listar branchs matching

git branch --list '<termo>*'
Enter fullscreen mode Exit fullscreen mode

exemplo, listar branchs, cujos nomes começam com fix/:

git branch --list 'fix/*'
Enter fullscreen mode Exit fullscreen mode

Renomear branch

Local, e se vocĂȘ estĂĄ nessa branch

git branch -m <new-name>
Enter fullscreen mode Exit fullscreen mode

Local, e se vocĂȘ NÃO estĂĄ nessa branch

git branch -m <old-name> <new-name>
Enter fullscreen mode Exit fullscreen mode

Remota, seguir os passos adicionais

git push origin :<old-name> <new-name>

# ou

git push origin --delete <old-name>
git push origin <new-name>
Enter fullscreen mode Exit fullscreen mode

Resetar a branch upstream para o novo nome da branch

git push origin -u <new-name>
Enter fullscreen mode Exit fullscreen mode

Remover tag de uma branch

Remover tag, branch remota

git push origin :refs/tags/<tag-name>
Enter fullscreen mode Exit fullscreen mode

Remover tag, branch local

git tag -d <tag-name>
Enter fullscreen mode Exit fullscreen mode

Mudar para branch anterior [atalho]

git checkout -
Enter fullscreen mode Exit fullscreen mode

# Commits

Alterar (Reescrever) mensagem do Ășltimo commit

para renomear o commit, caso este seja seu Ășltimo commit:

git commit -m '<nova mensagem de commit>' --amend
Enter fullscreen mode Exit fullscreen mode
  • caso jĂĄ tenha subido este Ășltimo commit para a branch remota, serĂĄ necessĂĄrio fazer um push force pois estaremos sobreescrevendo a histĂłria
  • caso nĂŁo seja o ultimo commit, serĂĄ necessĂĄrio renomear atravĂ©s de rebase interativo ou reset —soft

Refazer o Ășltimo commit (add arquivos ao Ășltimo commit)

Refazer o Ășltimo commit utilizando a mensagem do commit anterior

Considere ter esquecido alguma alteração em um arquivo apĂłs ter commitado. VocĂȘ pode utilizar o amend para commitar de novo utilizando a mesma mensagem do Ășltimo commit:

# primeiro add o arquivo (git add <arquivos>) e em seguida:

git commit --amend --reuse-message HEAD
Enter fullscreen mode Exit fullscreen mode

ou

Refazer o Ășltimo commit

# primeiro add o arquivo (git add <arquivos>) e em seguida:

git commit --amend --no-edit
Enter fullscreen mode Exit fullscreen mode

Desfazer commits

  • com soft: apaga sĂł os commits
  • com hard: apaga os commits e o cĂłdigo

Desfazer o Ășltimo commit

mantendo as alteraçÔes do Ășltimo commit

git reset --soft HEAD^ 
Enter fullscreen mode Exit fullscreen mode

deletando todas as alteraçÔes do Ășltimo commit

git reset --hard HEAD^
Enter fullscreen mode Exit fullscreen mode

Desfazer commits por quantidade (do mais atual para o mais antigo)

Desfaz apenas os commits e mantem as alteraçÔes

git reset --soft HEAD~<quantidade de commits>
Enter fullscreen mode Exit fullscreen mode

Desfaz os commits e o cĂłdigo

git reset --hard HEAD~<quantidade de commits>
Enter fullscreen mode Exit fullscreen mode

Desfazer commits até o commit x (com soft ou hard):

AtravĂ©s de um git log --onelinepodemos verificar os commits, e obter a hash de referĂȘncia.

git reset --soft HEAD~<hash>
Enter fullscreen mode Exit fullscreen mode

o comando acima irĂĄ desfazer todos os commits posteriores Ă  hash especificada.


# Git log (lista de commits)

Listar commits resumido

git log --oneline
Enter fullscreen mode Exit fullscreen mode

Listar commits grĂĄfico branch

git log --graph --oneline
Enter fullscreen mode Exit fullscreen mode

Listar commits com referĂȘncias associadas (branch, tag, etc)

git log --decorate

# ou

git log --oneline --decorate
Enter fullscreen mode Exit fullscreen mode

Listar commits por quantidade

git log -<quantidade>

# ex: git log -5
Enter fullscreen mode Exit fullscreen mode

Listar commits pesquisa → procurar commits com uma mensagem/palavra

git log -S <'string-to-search'>
Enter fullscreen mode Exit fullscreen mode

Listar commits pesquisa → procurar commits com uma mensagem/palavra do código

git log -S '<string-to-search>'
Enter fullscreen mode Exit fullscreen mode

Listar commits pesquisa → procurar commits com uma mensagem/palavra da mensagem de commit

git log --grep='<string-to-search>'

# ex: git log --grep='fix'
# ex: git log --grep='fix' --oneline
Enter fullscreen mode Exit fullscreen mode

Listar commits pesquisa → procurar commits por arquivos

git log -- <file1.extension> <file2.extension> <...n>

# ex: git log -- foo.ts bar.ts
Enter fullscreen mode Exit fullscreen mode

Listar commits por data

Depois de

git log --after='<date>'

# ex: 
# git log --after='2014-7-1'
# git log --after='yesterday'
# git log --after='1 week ago'
Enter fullscreen mode Exit fullscreen mode

Depois de

git log --before='<date>'

# ex: 
# git log --before='2014-7-1'
# git log --before='yesterday'
# git log --before='1 week ago'
Enter fullscreen mode Exit fullscreen mode

Entre datas

git log --since='<date>' --until='<date>'

# ex: git log --since='<JAN 01 2019>' --until='<DEC 25 2019>'
Enter fullscreen mode Exit fullscreen mode

Listar commits por autor

1 autor

git log --author='<name>'

# ex: 
#  git log --author='Lays'
Enter fullscreen mode Exit fullscreen mode

Mais de 1 autor

git log --author='<name1>\|<name2>'

# ex: 
#  git log --author='Lays\|Bruno'
Enter fullscreen mode Exit fullscreen mode

Listar Ășltimo commit

git log -1
Enter fullscreen mode Exit fullscreen mode

# Push

Push force

Caso a gente reescreva a história de algo que jå estå commitado na branch remota, como por exemplo um squash, renomear commit etc, serå necessårio fazer um push force para forçar a atualização remota, jå que ela irå recusar a atualização por push normal. Ou seja o push force, sobreescreve tudo o que estå na branch remota pelo que estå na branch local. Tome cuidado com esse comando, e nunca faça push force das branchs principais.

git push --force

# ou

git push -f

# ou 

git push origin +HEAD
Enter fullscreen mode Exit fullscreen mode

Fazer push sem digitar o nome da branch em que vocĂȘ estĂĄ (HEAD) [atalho]

git push origin HEAD
Enter fullscreen mode Exit fullscreen mode

🆘 # Reflog - o Salva vidas

HistĂłrico - Listar tudo o que vocĂȘ fez no git

Enquanto o git log exibe apenas os commits, o git reflog exibe todo o histĂłrico, incluindo commits, checkout, merge, rebase etc.

git reflog
Enter fullscreen mode Exit fullscreen mode

a partir da lista/histórico conseguimos reverter algumas alteraçÔes indesejadas.

Algumas opçÔes com git reflog

ApĂłs executar o git reflog, serĂŁo listadas todas as modificaçÔes. Procure o hash referente ao ponto que vocĂȘ gostaria de voltar no tempo. Algumas opçÔes para trabalhar com o reflog:

  • Reverter todas as alteraçÔes para o hash especĂ­fico (deleta todas as alteraçÔes feitas):

    git reset --hard <hash>
    
  • Reverter somente um arquivo especĂ­fico para o estado em que estava a partir de um hash:

    git checkout <hash> -- <filename>
    
  • Fazer Cherry-pick a partir do hash:

    git cherry-pick <hash>
    

# Merge tips

sem fast-forward

git merge --no-ff <branch-name>
Enter fullscreen mode Exit fullscreen mode

The --no-ff flag prevents git merge from executing a "fast-forward" if it detects that your current HEAD is an ancestor of the commit you're trying to merge. A fast-forward is when, instead of constructing a merge commit, git just moves your branch pointer to point at the incoming commit.

However, occasionally you want to prevent this behavior from happening, typically because you want to maintain a specific branch topology (e.g. you're merging in a topic branch and you want to ensure it looks that way when reading history). In order to do that, you can pass the --no-ff flag and git merge will always construct a merge instead of fast-forwarding.

_https://newbedev.com/what-is-the-difference-between-git-merge-and-git-merge-no-ff

image
Fonte da imagem: NewBeDev

# Arquivos

Renomear arquivo local

1ÂȘ opção: renomear pelo computador

  1. renomeie normalmente o arquivo pela pasta.
  2. Faça git add do arquivo
  3. Assim ele irĂĄ passar para o estado de RENAMED quando vocĂȘ verificar pelo git status
  4. Agora faça o commit do arquivo normalmente com git commit

2ÂȘ opção: pelo Git

  1. No terminal: git mv nome_antigo.extensĂŁo novo_nome.extensĂŁo
  2. Assim ele irĂĄ passar para o estado de RENAMED quando vocĂȘ verificar pelo git status
  3. Agora faça o commit do arquivo normalmente com git commit para consolidar a mudança

Unstage Files

Se vocĂȘ deseja jĂĄ fez git add em um arquivo e ele estĂĄ em STAGE pronto para ser commitado, mas deseja reverter (sem perder as alteraçÔes):

Todos os arquivos:

git reset
Enter fullscreen mode Exit fullscreen mode

Arquivo especĂ­fico:

git reset -- <nome-do-arquivo>
Enter fullscreen mode Exit fullscreen mode

Desfazer alteraçÔes

Supondo que vocĂȘ deseja desfazer alteraçÔes no arquivo (apagar alteraçÔes)
 vai depender em que ponto ele estĂĄ: untracked, modified, commited.

  • Ao invĂ©s de desfazer, o mais aconselhado Ă© reverter, para ao invĂ©s de apenas deletar a alteração, manter documentado. Ver reverter mais abaixo.

Desfazer alteraçÔes: arquivo em :::untracked:::

git checkout --<nome_do_arquivo.extensĂŁo>
Enter fullscreen mode Exit fullscreen mode

Desfazer alteraçÔes: arquivos em :::modified::: (jå feito add, mas não commit)

  1. 1Âș tira ele de modified e leva de volta para untracked:

    git reset <nome_do_arquivo.extensĂŁo>
    
  2. 2Âș jĂĄ Ă© possĂ­vel fazer checkout e reverter alteraçÔes

    git checkout --<nome_do_arquivo.extensĂŁo>
    

Desfazer alteraçÔes: arquivos jå commitados

1Âș caso SOFT

Tirar arquivo de commit e passar de volta para staged, sem deletar o arquivo, usa-se o comando –soft + a hash do pai, ou seja, a hash do commit anterior ao que eu quero apagar. e depois Ă© possĂ­vel fazer o checkout.

git reset --soft <hash_do_pai>
Enter fullscreen mode Exit fullscreen mode

ou atravĂ©s da quantidade de commits (voltar atrĂĄs em nÂș de commits):

git reset --soft HEAD~<numero de commits>
Enter fullscreen mode Exit fullscreen mode

2Âș caso MIXED

Tirar arquivo de commit e passar para modified (fora do staged), sem deletar o arquivo, usa-se o comando –mixed + a hash do pai, ou seja, a hash do commit anterior ao que eu quero apagar e depois Ă© possĂ­vel fazer o checkout.

git reset --mixed <hash_do_pai>
Enter fullscreen mode Exit fullscreen mode

ou

atravĂ©s da quantidade de commits (voltar atrĂĄs em nÂș de commits):

git reset --mixed HEAD~<numero de commits>
Enter fullscreen mode Exit fullscreen mode

3Âș caso DELETAR HARD

Tirar arquivo de commit e deletar o arquivo (todos os commits e arquivos que estĂŁo depois do que o commit em questĂŁo deixam de existir, sĂŁo deletados e fica sĂł do commit pai/anterior para baixo). Usa-se o comando –hard + a hash do pai, ou seja, a hash do commit anterior ao que eu quero apagar e depois Ă© possĂ­vel fazer o checkout.

git reset --hard <hash_do_pai><hash_do_commit_a_ser_revertido>
Enter fullscreen mode Exit fullscreen mode

ou

atravĂ©s da quantidade de commits (voltar atrĂĄs em nÂș de commits):

git reset --hard HEAD~<numero de commits>
Enter fullscreen mode Exit fullscreen mode

Reverter alteraçÔes

Quase semelhante ao desfazer, mas nesse caso será criado um commit que indica a reversão. É o mais aconselhado.

1° caso

Com mensagem sobre a reversĂŁo, neste caso o editor de texto irĂĄ abrir para que vocĂȘ insira a mensagem sobre o por que da reversĂŁo, ou digite (-m “mensagem”) apĂłs o hash

git revert <hash_do_commit_a_ser_revertido>
Enter fullscreen mode Exit fullscreen mode

2° caso

Sem mensagem sobre a reversĂŁo:

git revert <hash_do_commit_a_ser_revertido> --no-edit
Enter fullscreen mode Exit fullscreen mode

Desfazer: arquivo deletado da mĂĄquina

git checkout -- <nome_do_arquivo.extensĂŁo>
Enter fullscreen mode Exit fullscreen mode

Remover arquivo/pasta pelo Git

Remover arquivo

git rm <nome_do_arquivo.extensĂŁo>
Enter fullscreen mode Exit fullscreen mode

Remover pasta

git rm -r <nome da pasta>
Enter fullscreen mode Exit fullscreen mode

Desfazer alteraçÔes

Desfazer todas as alteraçÔes (untracked)

  • visualizar arquivos que estĂŁo fora da working tree:

    git clean -n -d
    
  • deletar arquivos:

    git clean -f -d
    

Desfazer todas as alteraçÔes (tracked)

git checkout .
Enter fullscreen mode Exit fullscreen mode

Voltar para versĂŁo anterior de arquivo (checkout)

git checkout <hash> <file-name.extension>
Enter fullscreen mode Exit fullscreen mode

Remover arquivo adicionado acidentalmente

Arquivo ainda nĂŁo commitado:

git reset </path/file-name.extension>
Enter fullscreen mode Exit fullscreen mode

Arquivo jĂĄ commitado:

Desfazer merge e manter o histĂłrico de commits

git reset --soft HEAD~1

git reset </path/file-name.extension> 

rm </path/file-name.extension>

git commit
Enter fullscreen mode Exit fullscreen mode

ir para a branch principal

git checkout <master_branch>
Enter fullscreen mode Exit fullscreen mode

git log para verificar a hash correta

git log --oneline
Enter fullscreen mode Exit fullscreen mode

fazer a reversĂŁo utilizando a hash do merge correspondente

git revert -m 1 <merge-commit-hash>
Enter fullscreen mode Exit fullscreen mode

# Squash (‘comprimir’ commits em um só)

Considerando que vocĂȘ deseja comprimir/transformar seus Ășltimos 1 sĂł.. para isso fazemos o squash.

  • desfazer os Ășltimos commits por quantidade (mantendo as alteraçÔes):
git reset --soft HEAD~<commit_quantity>
Enter fullscreen mode Exit fullscreen mode

ex, desfazer 5 commits: git reset --soft HEAD~5

ou vocĂȘ pode optar por utilizar as hashs dos commits. O comando abaixo listarĂĄ os commits, assim vocĂȘ pode verificar atĂ© qual commit vocĂȘ quer desfazer.
(lembrando que os commits sĂŁo listados do mais novo para o mais antigo)

git log --oneline
Enter fullscreen mode Exit fullscreen mode

em sequida:

git reset --soft <hash_do_ultimo-commit_que_vc_quer_manter>
Enter fullscreen mode Exit fullscreen mode

ex:

git log --oneline

# listou:
<x323x32> meu commit 6
<kj56kj5> meu commit 5
<8f7g87f> meu commit 4
<k6k356j> meu commit 3
<jk4hj34> meu commit 2
<hjh2424> meu commit 1

# supomos que vocĂȘ deseja desfazer os 3 primeiros commits 
# (hash_6, hash_5, hash_4) e manter a partir do hash_3, entĂŁo vocĂȘ usarĂĄ
# o cĂłdigo do hash 3

git reset --soft k6k356j
Enter fullscreen mode Exit fullscreen mode
  • faz o processo de add e commit com a mensagem certa
  • faz push para o repositĂłrio remoto

# ConfiguraçÔes globais

Verificar e editar configuraçÔes globais

git config --global -e
Enter fullscreen mode Exit fullscreen mode

Configurar usuĂĄrio e email

git config --global user.name <name>
git config --global user.email <email>
Enter fullscreen mode Exit fullscreen mode

Configurar editor padrĂŁo

git config --global core.editor '<editor_name> --wait'
Enter fullscreen mode Exit fullscreen mode

exemplo com o VSCode:

git config --global core.editor 'code --wait'
Enter fullscreen mode Exit fullscreen mode

# Remover Git no repositĂłrio

Se por algum motivo não deseja mais usar o controle de versÔes e deseja 'desligar/remover' o Git do repositório (esse comando irå remover/deletar o Git do repositório em questão):

rm -rf .git/
Enter fullscreen mode Exit fullscreen mode

Este comando irå deletar o arquivo onde o git guarda todas as informaçÔes e configuraçÔes do repositório. Pode ser feito dessa forma, ou deletando o arquivo manualmente.

--
Foto de capa: Yancy Min on Unsplash

Oldest comments (0)