Git (clone repositório remoto)
O Git permite a gestão das alterações em arquivos de texto e seu armazenamento remoto para acesso compartilhado e salvaguarda do histórico de modificações.
Obter repositório remoto
$ cd /opt/git/ $ git clone git@github.com:reinaldoc/repo-name
- Ao obter um repositório remoto, este repositório já será configurado para envio e obtenção dos commits;
Configuração de autor
$ git config --global user.name "Reinaldo Gil Lima de Carvalho"; $ git config --global user.email reinaldoc@gmail.com
- Outras opções de configuração: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
Consultar estado do repositório
$ git status
- Untracked files: arquivos ainda não incluídos ao controle de versão;
- Changes not staged for commit: arquivos alterados ainda não adicionados para serem salvos (commit);
- Changes to be committed: arquivos já adicionados para serem salvos (commit);
Pode-se criar o arquivo .gitignore para indicar padrões de nomes de arquivo (*.pdf) que não devem ser incluídos ao controle de versão;
Adicionar arquivos para o próximo commit
$ git add index.html
- Para retirar arquivos já adicionados para o próximo commit:
- git reset HEAD index.html
- Para desfazer as mudanças no arquivo desde o útimo commit:
- git checkout — index.html
Salvar modificações localmente (commit)
$ git commit -m "Mensagem descritiva da alteração";
- Um commit deve sempre manter o estado funcional;
- Para refazer o último commit com novas alterações: git commit ‘mensagem’ –amend
- Para reverter para um commit anterior: git revert [commit-hash]
- Unir três últimos commits ao último:
- git rebase -i HEAD~3
- Unir commits desde um commit-id (anterior ao que se quer unir) até o atual de forma interativa
- git rebase -i [commit-id]
- Aplicar um commit (de outro branch) ao branch atual
- git cheery-pick [commit-id]
Consultar histórico de modificações salvas (commits)
$ git log $ git log --oneline $ git log --graph $ git log --decorate --oneline --graph --all $ git log -p $ git log --pretty="format:%h (%an) %s";
- Opções de log: https://devhints.io/git-log-format
- O registro dos commits refere-se ao branch ativo (checkout);
Consultar o autor e data de alteração de cada linha do arquivo
$ git blame index.html
Gerar diff de alterações
# gerar diff desde o último commit $ git diff # gerar diff entre dois commits $ git diff [commit-id1] [commit-id2] # gerar diff de um arquivo entre dois commits $ git diff [commit-id1] [commit-id2] ./README # gerar diff entre os últimos commits de dois branchs $ git diff [branch-1]..[branch2]
Listar repositório remoto
$ git remote -v
Branches
Os branchs permitem a realização de commits de implementações em desenvolvimento sem afetar o branch principal.
Ferramenta para simular uso de branches
# Listar branch locais e remotos (-r) $ git branch -a # Adicionar branch $ git branch [nome-do-branch] $ git branch issue1234 # Alternar (working tree) para um branch (-b para adicionar a branch) $ git checkout issue1234
- A opção -b pode ser utilizada com o checkout para criar o branch e alternar para ele;
- Remover repositórios remotos que não existem mais no remoto: git fetch –all –prune
- Remover branch remoto: git push origin -d test
- Remover branch local: git branch -d test
- Ajustar o HEAD se o branch deletado era o HEAD: git remote set-head origin -a
Incorporar mudanças entre branches
Merge e rabase são duas formas de incorporar commits de um branch em outro, a diferença está em como isso será registrado no log do repositório.
- Merge → aplica os commits de um branch no branch ativo e realiza um novo commit de merge;
- Quando utilizado em excesso torna difícil de entender o fluxo do histórico do projeto nos logs do git;
- Deve ser utilizado para mudanças significativas (adição de recursos completos e grandes refatorações);
- Não deve ser utilizado para pequenos ajustes ou correções de bugs triviais;
- Os commits individuais permancem no branch de origem e há um commit para registro do merge;
- Rebase → aplica os commits de uma branch no branch ativo;
- Deve ser utilizado para atualização de um branch com commits realizados no master após a criação do branch;
- Não use rebase em um branch remoto que tenha commits de outras pessoas, será difícil resolver os conflitos;
- Os commits individuais são registrados também no branch alvo e não há um commit de rebase/merge;
- Artigos sobre Merge x Rebase
Merge para a master:
# Alternar para branch master $ git checkout master # Incorporar mudanças significativas na master $ git merge feature83 # Remover branch feature83 $ git branch -d feature83
- As funções de checkout master e merge podem ser condensadas em: git merge master feature83
Rebase para a master:
# Alternar para branch issue23 $ git checkout master # Incorporar mudanças menores $ git rebase issue23 # Remover branch issue23 $ git branch -d issue23
Stash
Guarda as modificações dos arquivos desde o último commit para uso posterior, sem registrar no log.
# salvar modificações dos arquivos desde o último commit $ git stash # listar stashs $ git stash list # retornar modicações $ git stash apply 0 $ git stash drop 0
- As funções apply e drop podem ser condensadas em: git stash pop;
Tags
# Listar tags $ git tag # Criar uma tag $ git tag -a v0.1 -m "Versão 0.1" # Enviar a tag para o repositório remoto $ git push origin v0.1 # Remover tag $ git tag -d v0.1 # Remover tag do repositório remoto $ git push -d origin v0.1
Remover commits do repositório remoto
Esta é uma operação remove arquivos do histórico do git. Talvez você precise de um backup do git.
# git rebase -p --onto COMITID # git push --force