"git is a DVCS (Distributed Version Control System)"
Wikipedia
Durante a maior parte do período de manutenção do kernel Linux (1991-2002), as mudanças no software eram repassadas como patches e arquivos compactados. Em 2002, o projeto do kernel do Linux começou a usar um sistema DVCS proprietário chamado BitKeeper.
Em 2005, o relacionamento entre a comunidade que desenvolvia o kernel e a empresa que desenvolvia comercialmente o BitKeeper se desfez, e o status de isento-de-pagamento da ferramenta foi revogado. Isso levou a comunidade de desenvolvedores Linux (em particular Linus Torvalds) a desenvolver sua própria ferramenta baseada nas lições que eles aprenderam ao usar o BitKeeper.
Alguns dos objetivos desse novo sistema eram:
- Velocidade
- Design simples
- Suporte robusto a desenvolvimento não linear (milhares de branches em paralelo)
- Totalmente distribuído
- Capaz de lidar eficientemente com grandes projetos como o kernel Linux (velocidade e volume de dados)
E desde sua concepção em 2005, o Git evoluiu e amadureceu ao ponto de ser um sistema fácil de usar e ainda assim mantér essas qualidades iniciais. Sendo rápido, bastante eficiente com grandes projetos e possuir um sistema impressionante de branching para desenvolvimento não-linear.
fonte: Uma Breve História do Git
O github é um serviço de hospedagem de repositórios git, assim como gitlab, bitbucket e vários outros.
O stage, ou palco, é:
- conjunto de alterações para um commit
- armazenado em um arquivo especial no caminho
.git/index
- branch ≡ bifurcação
- aponta para um commit
- a branch
master
é sagrada
A área de stash é:
- uma pilha de modificações inacabadas
- útil para troca rápida de alterações entre branchs
- marcar pontos importantes no histórico
- geralmente utilizado para marcar versões (releases)
- aponta para um commit
- aponta para o commit atual
-
realiza várias configurações do ambiente (local/global)
git config --global user.name "nome do usuário" git config --global user.email email@email.com
-
configura ferramentas de diff/merge
git config --global diff.tool ferramenta_de_diff git config --global merge.tool ferramenta_de_merge
- usado para iniciar um repositório no diretório atual
- cria estrutura de arquivos no diretório .git
-
adiciona arquivos inteiros ao stage
git add nome_do_arquivo
-
adiciona algumas das alterações de um arquivo
git add -i
- como está o repositório local?
- exibe as modificações atuais dos arquivos
- reúne as alterações do stage e as consolida
- histórico de commits da branch atual
-
lista branchs
git branch
-
cria nova branch
git branch nome_da_nova_branch
-
remove arquivo do stage
git reset -- caminho_do_arquivo
-
altera a HEAD atual
git reset outra_ref
O comando git checkout
é usado para:
-
alterar branch atual
git checkout nome_da_branch
-
criar nova branch a partir da HEAD atual
git checkout -b nome_da_nova_branch
-
guarda alterações em uma área separada
git stash
-
aplica as alterações separadas por último
git stash apply
-
cria snapshot/backup do repositório
git archive HEAD -o arquivo_de_saida.zip
-
cria uma cópia a partir de um repositório remoto
git clone url_do_repositorio_remoto
-
gerencia servidores remotos
git remote add nome_do_remote url_do_remote
git remote rm nome_do_remote
-
lista os repositórios remotos
git remote -v
-
origin
é o nome de remote padrão após umclone
-
push
== empurar -
envia informações locais para um repositório remoto
git push nome_do_remote
-
também pode ser usado para apagar refs de um remote
git push nome_do_remote :nome_da_ref
- pull ≡ puxar
- baixa alterações de um remote e integra na branch atual
-
somente baixa as alterações de um remote
git fetch nome_do_remote
-
as refs remotas são disponibilizadas localmente com o prexifo
nome_do_remote/
, ex.:nome_do_remote/master
-
corrigir* commit apontado por hash_de_um_commit
git commit --fixup hash_de_um_commit
-
corrigir último commit
git commit --amend
* necessita de um rebase posterior
git rebase -i
para manipulação de forma interativa e explicativa
- edição de commits
- reordenação commits
- remoção de commits
-
aplicar alterações de um commit na HEAD atual
git cherry-pick hash_ou_ref_do_commit
-
realiza operações em referências perdidas*
git reflog
-
quem mecheu no meu código?
git blame nome_do_arquivo
-
busca por commit que introduziu um bug
git bisect ref_bugada ref_ok
* útil em caso de perda de commits
gitk
: visualização do históricogit-cola
: edição de commitsmeld
: visualização de alteraçõesgitkraken
: solução gráfica completagithub desktop
: solução gráfica completa
- fazer commits auto-contidos
- realizar merge/pull requests
- criar forks
- versionamento semântico via tags
- o fork é meu e eu faço o que eu "quiser"
- impede trabalho inacabado no repositório oficial
- permite a alteração da
master
sem problemas
- resolução de conflitos é uma tarefa complexa
- converse com quem fez a alteração conflituosa
- algumas ferramentas gráficas reduzem a dor:
git-cola
meld