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

 

Configuração da estratégia de merge

$ git config --global pull.ff only
  • Rebase: git pull –rebase
  • Merge: git pull –rebase=merges

 

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";

 

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