Table of Contents generated with DocToc
- Outro guia de git
- Editando commits
- O que acabei de comitar?
- Escrevi a ultima mensagem de commit errada antes de dar push
- Escrevi a mensagem de commit errada antes de dar push
- Quero juntar meus commits
- Quero adicionar minhas novas alterações no ultimo commit
- Comitei com o usuario e email errado
- Quero deletar meu ultimo commit
- Acidentalmente eu dei um reset hard para outro commit, como volto reverto isso?
- Todos meus commits foram com email e autor errado, consigo alterar?
- Staging
- Untracked files
- Branches
- Outros
Um guia que explora os benefícios de utilizar o Git como ferramenta de controle de versão para projetos em qualquer linguagem, em qualquer plataforma.
- Funciona de maneira distribuída
- Permite a edição concorrente de arquivos do projeto
- Não depende de uma conexão ativa com um servidor
- Mantém histórico do que é feito no projeto
- Marca diferentes versões para o projeto
- Controle total do que se passa e do que pode ser feito com o seu repositóriooo
- Evita vários commits de merge
- Evita commits de merge desnecessários
- Utilizado para deixar o desenvolvimento atual salvo
- Usado para arrumar bugs antes de fazer commits inacabados
- Apaga tudo feito no working directory
- Apaga tudo que está no index
- Reseta tudo até o hash do commit
$git show
ou $git log --oneline
$git commit --amend
ou
$git commit --amend -m "xxxxx"
Supondo um git log igual ao abaixo:
fbb654d (HEAD -> master) Update editing commits section
e3228e7 Update README with untracked files section and more tips and tutorials
9489f92 Added section for recover branch deleted with none reflog
05ca271 Deleted '.DS_Store' files
Também supondo que quero alterar texto do commit 05ca271
$git rebase -i '05ca271^'
No seu editor de texto padrao irá aparecer algo como:
1 pick 05ca271 Deleted '.DS_Store' files
2 pick 9489f92 Added section for recover branch deleted with none reflog
3 pick e3228e7 Update README with untracked files section and more tips and tutorials
4 pick fbb654d Update editing commits section
5
6 # Rebase 82e0d8a..fbb654d onto 82e0d8a (4 commands)
7 #
8 # Commands:
9 # p, pick = use commit
10 # r, reword = use commit, but edit the commit message
11 # e, edit = use commit, but stop for amending
12 # s, squash = use commit, but meld into previous commit
13 # f, fixup = like "squash", but discard this commit's log message
14 # x, exec = run command (the rest of the line) using shell
15 # d, drop = remove commit
Alteramos a linha 1 para 1 reword 05ca271 Delete '.DS_Store' file
No seu editor que irá abrir faça as alterações e salve
Supondo um git log igual ao abaixo:
fbb654d (HEAD -> master) Update editing commits section
e3228e7 Update README with untracked files section and more tips and tutorials
9489f92 Added section for recover branch deleted with none reflog
05ca271 Deleted '.DS_Store' files
Também supondo que quero juntar os dois ultimos commits
$git rebase -i '05ca271^'
No seu editor de texto padrao irá aparecer algo como:
1 pick 05ca271 Deleted '.DS_Store' files
2 pick 9489f92 Added section for recover branch deleted with none reflog
3 pick e3228e7 Update README with untracked files section and more tips and tutorials
4 pick fbb654d Update editing commits section
5
6 # Rebase 82e0d8a..fbb654d onto 82e0d8a (4 commands)
7 #
8 # Commands:
9 # p, pick = use commit
10 # r, reword = use commit, but edit the commit message
11 # e, edit = use commit, but stop for amending
12 # s, squash = use commit, but meld into previous commit
13 # f, fixup = like "squash", but discard this commit's log message
14 # x, exec = run command (the rest of the line) using shell
15 # d, drop = remove commit
Alteramos a linha 1 para 2 squash 9489f92 Added section for recover branch deleted with none reflog
No seu editor que irá abrir faça as alterações com a nova mensagem de commit e salve
$git add .
para adicionar as alterações para stage
$git commit --amend --no-edit
para adicionar as alterações no commit anterior sem editar a mensagem de já comitada. Ou sem a opção --no-edit para editar a mensagem do commit anterior.
$git commit --amend --author "Novo author <[email protected]>"
Não recomendado e pois alguem pode peder a referencia dos commits resetados, mas um jeito de deletar um commit após o push é:
$git reset HEAD^ --hard
$git push --force-with-lease [remote] [branch]
Jeito recomendado...
$git revert <SHAdoCommitEraddo>
Para resetar se você ainda não deu push
$git reset --mixed HEAD^
- (default) retorna o commit e as mudanças ficam no working directory
$git reset --soft HEAD^
- retorna commit e mudanças permanecem staged(index)
$git reset --hard HEAD^
- apaga tudo, retorna commit, unstage e deleta
Para todas opções pode-se utilizar HEAD~1 no lugar do HEAD^
Você acidentalmente fez isso? Se fodeo! Já era! Brinks... O git mantém um log de tudo por alguns dias(foda, não?).
(master)$ git reflog
Você verá uma lista dos commits passados. Só escolher o SHA do tal commit e resetar para ele.
(master)$ git reset --hard <SHACommitResetaHardimente>
Yes! Github tem uma página pública com isso, mas basicamente é o seguinte:
- Abra o terminal
- De um "bare" clone
git clone --bare https://github.com/user/repo.git
cd repo.git
- Copie e cole o script alterando as variáveis(OLD_EMAIL, CORRECT_NAME, CORRECT_EMAIL) com suas informações
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"m
CORRECT_EMAIL="[email protected]"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
- Dê um enter
- Revise o log de commits
- Dê um push para o repo
git push --force --tags origin 'refs/heads/*'
- Apague o repo temporário
cd ..
rm -rf repo.git
(branch)$git commit --amend
Primeiro, para saber quais arquivos serão apagados
git clean -n
E o comando seguinte irá deletar os arquivos untracked
git clean -f
Ou também...
git clean -fd
para remover diretórios
git clean -fX
para remover ignored files
git clean -fx
para remover ignored files e non-ignored files
Para uma branch remota...
(master)$git push origin -d nome_branch
ou
(master)$git push origin :nome_branch
E para uma local
(master)$git branch -d nome_branch
Para uma branch local atual(checkout)...
(master)$git branch -m novo_nome
Ou uma outra local mas não dada checkout
(master)$git branch -m nome_branch_antiga nome_nome_branch
Irei simular possível acontecimento.
Começarei criando uma branch para trabalhar.
(master)$git checkout -b test_branch_to_delete
Agora vou editar meu arquivo README.md com esse passo-a-passo de como (spoiler alert)"resetar" minha branch excluída e irei commitar o resultado.
(test_branch_to_delete)$git add .
(test_branch_to_delete)$git commit -m "Added section 'Reset branch after deleted'"
[test_branch_to_delete cc7e264] Added section 'Reset branch after deleted'
1 file changed, 9 insertions(+)
(test_branch_to_delete)$git log
commit cc7e2644bfbf94e962d0cdad6cdd03247702338e
Author: xb193513 <[email protected]>
Date: Tue Nov 21 17:40:09 2017 -0200
Added section 'Reset branch after deleted'
Hora de voltar para master e "acidentalmente" excluir minha branch
(test_branch_to_delete)$git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
(master)$git branch -D test_branch_to_delete
Deleted branch test_branch_to_delete (was cc7e264).
É ai que entra nossa amigo reflog
. Que funciona como um logger dos acontecimento do repo.
(master)$git reflog
17ea9fe HEAD@{0}: checkout: moving from test_branch_to_delete to master
cc7e264 HEAD@{1}: commit: Added section 'Reset branch after deleted'
06d3d90 HEAD@{2}: commit: <--commit-filter 'if [ = [email protected] ]; START doctoc generated TOC please keep comment here to allow auto update -->
17ea9fe HEAD@{3}: checkout: moving from master to test_branch_to_delete
17ea9fe HEAD@{4}: commit: Added sections BRANCHES and Staging
1925529 HEAD@{5}: checkout: moving from outra_branch_teste to master
Agora basta pegar o hash do commit da branch deletada e restaurar nossa branch deletada
(master)$git checkout -b temp_branch
Switched to a new branch 'temp_branch'
(temp_branch)$git reset --hard cc7e264
HEAD is now at cc7e264 Added section 'Reset branch after deleted
Sucesso! Ouvi um amém? :D
Assim que fiz o item acima eu pensei: Como eu recuperaria minha branch se o commit não estivesse no reflog
? Essa situação se replica quando não sou dono da branch, portanto não estaria com o histórico de commits para recuperar um estado dela. Então achei esse esse passo-a-passo no stackoverflow. Parece verídico, mas não testei em uma situação real.
Use fsck
para listar commits danificados
git fsck --full --no-reflogs --unreachable --lost-found
cat-file
para mostra algumas informações adicionais para nós guiar
git cat-file -p SHACommitsDanificados
E como no tópico anterior basta pegar o hash do blob/commit danificada e restaurar em uma branch temporária
(master)$git checkout -b temp_branch
Switched to a new branch 'temp_branch'
(temp_branch)$git reset --hard cc7e264
HEAD is now at cc7e264...
- git - guia prático - Guia prático e sem complicação
- Learn Git Branching - Tutorial iterativo de git branch
- Flight rules for git - Guia do que fazer quando fazemos alguma caquinha (onde me espelhei)
- Commit messages guide - Um guia para entender a importância dos commits
- Git command Explorer - Um jeito facil de procurar comandos do git
- Git cheatsheet - "Gráfico" dos estados do de um arquivo gerenciado pelo git
- Anatomia dos pull requests - Um guia de como escrever pull requests
- Como escrever commits - Como escrever commits de qualidade