Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Introdução ao Git
Felipe dos Santos Silveira
SECCOM 2012
17 de Outubro de 2012
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Histórico
Criado por Linus Torvalds para desenvolvimento do Kernel Linux
DistribuídoApto ao desenvolvimento não linearTrabalha eficientemente (tempo e espaço) com projetosgrandes
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Características
Armazena snapshots de arquivos e não diferença entre versõesMaioria das operações são locaisMantém integridade (via hashes SHA-1)Dados só são adicionados ao repositório
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Estados de modificações
Existem 3 estados em que uma modificação pode estar
Working directoryMudanças, arquivos adicionados, arquivos removidos.
Staging areaSnapshots de coisas do Working directory que serão commitados.
RepositórioAqui ficam armazenados os commits feitos. De maneira geral, elesnão são mais editados.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Estrutura de um commit
Um commit é composto por três partes:Autor, informações do commiter, dataUm snapshot dos arquivos do repositórioUma mensagem de commitUma lista de commits do qual ele derivou
À partir dessas informações é calculado o hash SHA-1, que é usadopara identificar unicamente esse commit.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Exemplo de commits
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Instalação
Veja como instalar na sua distribuição/sistema operacional no siteoficial: git-scm.com/downloads
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Configuração
Antes de começar a trabalhar precisamos nos identificar.Para isso usamos o comando git config
Definindo variáveis de usuáriogit config --global user.name “<Seu nome>”git config --global user.email “<Seu email>”git config --global core.editor “gedit”
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Níveis de configuração
Existem 3 níveis de configuração:
local para configurações somente para o repositório atualglobal para configurações somente para o usuário atualsystem para configurações para todos usuários do sistema
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git help
Mostra uma tela de ajuda com descrições dos comandos.
Ajuda específicagit help <comando> Mostra uma melhor descrição e maisopções do comando selecionado.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git init
Um repositório é criado executando o comando git init.Agora já podemos começar o trabalho =)
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git add
As mudanças são adicionadas na staging area utilizando ocomando git add <arquivo>
Lembre-seUm snapshot do arquivo é guardado na staging area. Caso maismodificações sejam feitas, elas precisam ser adicionadas de novo.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git status e git diff
Como está o nosso working directory e staging area?
O comando git status nos mostra o estado atual dorepositório, além de algumas outras dicas, que veremos embreve.O comando git diff nos mostra as diferenças entre o workingdirectory e o último commit.Para ver mudanças apenas da staging area use git diff--cached.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git remove
Às vezes precisamos remover um arquivo do nosso repositório.Podemos atingir esse objetivo com o comando git remove<arquivo>
CuidadoO comando git remove também deleta o arquivo do sistema.Utilize a git remove --cached <arquivo> para manter ele emdisco.
Lembre-seAs operações do git são aditivas. Logo, ainda é possível recuperar oarquivo deletado.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git commit
Com as mudanças adicionadas à staging area podemos fazer onosso primeiro commit com git commitO editor que configuramos com core.editor será chamado epoderemos ver as nossas mudanças e editar a nossa mensagem decommit.
Boa práticaUma boa mensagem de commit é composta de duas partesseparadas por uma linha em branco: Uma mensagem de até 80caracteres que descreve brevemente o commit. E, se necessário,uma melhor descrição do commit.
Commit messageA mensagem do commit também pode ser passada por parâmetro.git commit -m <commit message>
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git log
A qualquer momento podemos ver como está o repositório com ocomando git log
FormataçãoA saída do comando é totalmente configurável. Não esqueça de veras opções com git help log.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Referências
Como você deve ter percebido, todos os commits são referenciadospor seus hashes. Porém, podemos usar um modo mais amigável dereferenciá-los. Para isso, usamos Referências, que são ponteirospara commits. Existem 3 tipos de referências:
tag: Um ponteiro para um commit específico. Ela não semove sob qualquer circunstância.branch: Um ponteiro para uma “linha” de commits. Éatualizado quando há um novo commit no branch.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
HEAD
HEAD é a referência para onde estamos. Pode estar em doisestados:
Apontando para um branch. Assim, os commits feitos à partirde HEAD atualizarão o ponteiro do branch.Apontando para uma tag ou commit. Esse estado é chamadode detached HEAD e os commits feitos só serão alcançáveisà partir de seus hashes.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Um repositório com referências
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git checkout
Move o ponteiro de HEAD para a o destino especificado (branch,tag, commit)
Obtendo um arquivo de outro commitPara trazer para o working directory o arquivo X no commit Y,execute git checkout Y -- X.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git reset
Move o pointeiro do branch atual.
CuidadoO comando reset move o ponteiro do branch, e não a referência deHEAD, como o checkout. Ou seja, os commits do branch antigonão serão mais alcançados.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git reset --hard versao-1.0
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Criando referências
Criando uma tag à partir do commit apontado por HEADgit tag <nome-da-tag>
Criando um branch à partir do commit apontado por HEADgit checkout -b <nome-do-branch>
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git merge
Um “merge“ é um ponto onde duas linhas separadas se encontram.Ou seja, é a junção de dois branches para criar um commit que terádois pais.
Exemplogit merge NovaFeature
fast forwardQuando o alvo do comando for um sucessor direto do últimocommit do branch atual, o merge é chamado de fast forward esomente as referências são atualizadas.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Conflitos
Caso haja um conflito que o git não consiga resolver, o arquivo comconflito será alterado para que possamos tomar providências.
Lembre-seO comando git status nos dá informações sobre conflitos queocorreram.
ExemploO arquivo merge-conflict.tar.bz2 contém um exemplo de umconflito para vocês resolverem.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git rebase
O comando rebase nos permite aplicar nossas mudanças partindode outro commit base.
Exemplogit rebase <branch>
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Estado inicial
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Após algum tempo
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Após: git rebase master
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Mais rebase
Você ainda pode usar a opção -i para editar os commits que serãoadicionados.
reword: mudar a mensagem do commitedit: parar para editar o commitsquash: junta com o commit anterior (mantém ambasmensagens)fixup: junta com o commit anterior (usa só a mensagem doanterior)
Se um linha for apagada, o commit não será usado.Os commits são aplicados de cima para baixo, e podem serreordenados à vontade.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git clone
O comando git clone faz uma cópia de um repositório externo paraa sua máquina.
Clonando o repositório do linux
git clone git://github.com/torvalds/linux.git
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Sincronização
Como as operações são sempre locais, precisamos de algum modopra sincronizar os repositórios.
git fetch: apenas baixa as informações sobre os servidoresremotosgit pull: a mesma coisa que fetch, mas faz merge do branchatual com o seu respectivo remoto.git push: lança as atualizações para o servidor de todos osbranches locais que têm um branch remoto associado.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Referências
As referências de servidores remotos têm como prefixo o nome doremoto. E o nome do primeiro remote geralmente é “origin”.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git pull
Assumindo que o branch local seja “master”
Equivalente agit fetchget merge origin/master
Gera muitos commits de merge em um repositório ativo.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
git push
Somente commits que sejam fast forward serão atualizados noservidor.
Criando um branch remotoPor padrão, todos os branches são locais. Para criar um branch noservidor, utilize:git push -u <remote> <branch-local> (a opção -u configura oseu repositório para associar o branch remoto ao local).
Enviando tagsPor padrão as tags também são locais. Para enviar uma tag paraum servidor, utilize:git push <remote> <tag-local>.Note: A opção --tags transferirá todas as tags locais para oservidor.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Github
Acesse github.com
Usando SSHhttps://help.github.com/articles/generating-ssh-keysTroubleshooting
Usando HTTPShttps://help.github.com/articles/set-up-git
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Fiz um commit errado. Como corrijo?
Depende.
Se você já deu push no commit, ele já está no servidor, logonão é uma boa idéia editá-lo.Porém, você pode criar um novo commit que desfaz amudança do commit.git revert <commit>Se você ainda não deu push temos duas opções:Editar as mudanças necessárias e “editar” o último commitusando git commit --amendCriar um novo commit. Reordenar as mudanças e juntar asmodificações com a opção fixup do comand git rebase -i
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Sempre preciso adicionar todos os arquivos commodificações à staging area?
Não. O comando git commit -a commita todos os arquivostracked. Independentemente da staging area.
CuidadoArquivos tracked são arquivos que o git já conhece (pois você jáexecutou git add nele).Arquivos novos sempre devem ser adicionadosUso constante de git commit -a leva a commits com arquivosfaltando.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Como faço para ignorar um arquivo?
Crie um arquivo chamado .gitignore dentro do seu repositório ecoloque o nome do arquivo dentro dele.Várias regras são separadas por quebras de linha e são aplicadas àtodos os sub-diretórios.
manualgit help gitignore
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Quando devo usar merge e quando devo usar rebase?
Devido à característica especial de merges criarem um commit comvários pais. É uma boa prática usar isso apenas para os casos onderealmente ocorreu a junção de dois caminhos destintos (e nãosempre que você esquecer de sincronizar com o repositório remoto).
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
“Perdi” um commit. E agora?
Você pode usar o comando git reflog para ver os últimos estadosonde HEAD estava. Assim podendo aplicar um reset oucherry-pick.
cherry-pick?O comando git cherry-pick permite você “copiar” um commit deoutro lugar e aplicar em seu HEAD.Um novo commit será gerado com a mesmas mudanças, porém,com diferentes hashes.
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Existe outras formas de referenciar um commit?
Sim. Você pode referenciar um commit caminhando por sua “árvoregenealógica”.
Exemplo<commit>˜N Significa o N-ésimo pai do commit. <commit>˜0Significa ele mesmo.
Você também pode especificar um intervalo de commits.
Manualgit help gitrevisions
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Essas coisas de terminal não são pra mim. E interfacegráfica, tem?
Claro =)Dê uma olhada nesse link http://git-scm.com/downloads/guis
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Algumas coisas interessantes
git statusgit merge --ff-only / git merge --no-ffgit rebase -igit log --graph --oneline --decorate=short --date-order--allPlugin de git para o eclipsegit config --global alias.co checkoutgit config --global -e
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Perguntas?
Contato: [email protected]
Introdução Configurações Primeiros passos Conceitos Servidores Remotos Tips, Tricks & FAQ
Referências
http://git-scm.com/bookgit helpBlogs aleatórios e respostas no Stack Overflow.