back Git cheat sheet
comp
publication: Outubro 08 2020 21:10
last update: Outubro 08 2020 21:10
Inicializando um repositório a partir do diretório atual na sua máquina:
git init
Clonando um repositório para sua máquina:
git clone ENREDEÇO_DO_REPOSITÓRIO
Verificando o estado do repositório:
git status
Adicionando arquivos à área de staging:
git add ARQUIVO
Executando um commit:
git commit -m "MENSAGEM"
Verificando alterações nos arquivos:
git diff # todos os arquivos
git diff ARQUIVO # um arquivo específico
git diff HASH_DO_COMMIT # compara com um commit
git diff COMMIT1 COMMIT2 # compara dois commits
Log de ações:
git log # formato padrão
git log --pretty=format:"%h %an %ar - %s" # especifica um formato de saída
git log --grep="abc" # busca commits com a string "abc"
git log --oneline # log resumido
git log --since="1 week" # commits de até uma semana
git log --help # para mais informações
Visualizando modificações:
git show # exibe o diff do último commit
git show HASH_DO_COMMIT # exibe o diff de um commit específico
Listar branches:
git branch # branches locais
git branch -r # branches remotos
git branch -a # branches locais e remotos
Criando, alterando e deletando branch de trabalho:
git branch BRANCH # cria um novo branch
git checkout BRANCH # altera o branch de trabalho
git checkout -b BRANCH # cria e muda para o novo branch
git branch -d BRANCH # deleta um branch localmente
git push REMOTE --delete BRANCH # deleta um branch remoto
Repositórios remotos:
git remote -v # exibe os repositórios remotos
git remote add NOME ENDEREÇO # adiciona um repositório remoto
git remote rm NOME # remove o repositório remoto
Sincronizando repositório local e remoto:
git push NOME BRANCH # envia os commits locais para o repositório NOME no branch BRANCH
git pull NOME BRANCH # baixa os commits do repositório remoto
git fetch NOME BRANCH # baixa informações do repositório remoto sem alterar o branch local
Desfazendo mudanças:
git checkout -- ARQUIVO # descarta mudanças no ARQUIVO
git checkout . # descarta mudanças em todos os arquivo do diretório atual
git reset ARQUIVO # retira o ARQUIVO da área de staging
git reset # retira todos os arquivos da área de staging
git reset --hard ARQUIVO # retira da área de staging e reverte as mudanças no ARQUIVO
git reset --hard COMMIT # limpa a área de staging e reverte as mudanças para o COMMIT
git reset --hard HEAD # limpa a área de staging e reverte as mudanças para o último commit
Revertendo commits:
git revert COMMIT # desfaz as mudanças feitas no COMMIT
git revert HEAD # desfaz as mudanças feitas último commit
git revert COMMIT1...COMMIT2 # desfaz as mudanças entre os commits
Merge de branches:
git merge BRANCH
Quando mudanças num arquivo local e sua versão remota geram diffs diferentes para um mesmo conjunto de linhas, tem-se um conflito e o merge automático não é possível. Nesses casos, o arquivo local apresentará os marcadores abaixo separando as mudanças no arquivo remoto e no arquivo local
<<<<<<< HEAD
# mudanças feitas no arquivo local
=======
# mudanças feitas no arquivo remoto
>>>>>>> HASH_DO_COMMIT
Para resolver o conflito, é possível preservar apenas uma das versões (local ou remota)
git checkout --ours ARQUIVO # mantem as mudanças feitas localmente
git checkout --theirs ARQUIVO # mantem as mudanças feitas remotamente
Entretanto, quando ambas as mudanças precisam ser incorporadas a versão final, o arquivo precisa ser editado manualmente removendo as marcações e deixando-o na sua versão final considerando as ambas as mudanças.
Exemplo do merge de branchs:
$ git checkout master
$ git log --oneline
7a4d5f7 (HEAD -> master) D
906d0f4 C
16d27f9 B
68140e0 A
$ git checkout dev
$ git log --oneline
225f507 (HEAD -> dev) G
1006597 F
152da18 E
16d27f9 B
68140e0 A
$ git checkout master
$ git merge dev
$ git log --oneline
932d94a (HEAD -> master) Merge branch 'dev'
225f507 (dev) G
7a4d5f7 D
1006597 F
906d0f4 C
152da18 E
16d27f9 B
68140e0 A
Ilustração do exemplo:
E---F---G dev
/ \
A---B---C---D---M master
Rebase:
git rebase BRANCH
Fazer um rebase
significa refazer o ponto de partida (base) do branch. No
exemplo abaixo, o branch dev foi iniciado no commit B.
E---F---G dev
/
A---B---C---D master
Ao executar um rebase
no branch dev, aplicamos os commits B, C e D ao branch
dev e reaplicamos os commits E, F e G. Observe que pode haver conflitos de modo
semelhante ao merge
ao executar o rebase
.
E'---F'---G' dev
/
A---B---C---D master
Exemplo do rebase de branchs:
$ git checkout master
$ git log --oneline
7a4d5f7 (HEAD -> master) D
906d0f4 C
16d27f9 B
68140e0 A
$ git checkout dev
$ git log --oneline
225f507 (HEAD -> dev) G
1006597 F
152da18 E
16d27f9 B
68140e0 A
$ git rebase master
$ git log --oneline
55bdc65 (HEAD -> dev) G
8a0ee8a F
aa99277 E
7a4d5f7 (master) D
906d0f4 C
16d27f9 B
68140e0 A
Observe que o hash dos commits E, F e G mudou após o rebase
. Existem outros
cuidados que precisam ser considerados ao utilizar o
rebase.
Merge ou rebase?
Dada a situação abaixo
E---F---G dev
/
A---B---C---D master
execute um rebase
no branch dev e resolva eventuais conflitos:
E'---F'---G' dev
/
A---B---C---D master
Observe que apenas o branch dev foi afetado até momento. Em seguida, execute o
merge
no branch master:
E'---F'---G' dev
/ \
A---B---C---D-------------M master
Bisseção (procurando bugs):
git bisect start # inicia o modo de bisseção
git bisect bad COMMIT_RUIM # marca o commit como ruim
git bisect good COMMIT_BOM # marca o commit que se sabe não ter o bug
# marca-se cada commit dado pelo git como bom ou ruim
git bisect good # se o commit não apresenta o bug
git bisect bad # se o commit apresenta o bug
# ao final das iterações o git identifica o commit que introduziu o bug
git bisect reset # finaliza a bisseção
# você pode analisar e corrigir o problema
A busca por bisseção evita que todos os commits entre COMMIT_BOM
e
COMMIT_RUIM
precisem ser analisados.
Identificando os responsáveis (blame):
git blame ARQUIVO # mostra a última pessoa a alterar cada linha do ARQUIVO
git blame -L 5,11 ARQUIVO # mostra a última pessoa a alterar as linhas de 5 a 11 do ARQUIVO
Escolhendo as mudanças (cherry picking):
git cherry-pick COMMIT # aplica o COMMIT de um outro branch ao branch atual
git cherry-pick --abort # cancela o cherry picking em caso de conflito, por exemplo
git cherry-pick --continue # continua o cherry picking após resolver o conflito
Alterando commits:
git commit --amend # permite alterar o último commit
git rebase --interactive HEAD~5 # permite alterar os últimos 5 commits
git rebase --interactive --root # permite alterar todos os commits