Share
Embed
O Fantástico Mundo de GIT
Talk educacional para novos desenvolvedores ministrada na Superlógica
Matheus Fidelis
December 22, 2017
Transcript
68 slides
-
$ whoami Matheus Fidelis Desenvolvedor Web PHP na Superlogica Tecnologias
DevOps & Security SysAdmin /fidelissauro /msfidelis $ WHOAMI -
• GIT não é um sistema de controle de versão
de código • GIT é um sistema de controle de versão de ARQUIVOS • Permite que pessoas possam contribuir para projetos de forma simultânea, editando, criando e removendo sem riscos de sobrescrita. • GIT não se resume apenas a código e usar um sistema de versionamento é uma decisão sábia não só para Devs. • Versiona arquivos PST, Imagens, Documentos, Binários e até mesmo… folhas de código :) # git log O QUE É GIT -
▸ Criado por Linus Torvalds para substituir um VCS (Version
Control System) chamado Bit Keeper - Todos os arquivos são requisitados ao servidor ▸ Criado a partir da necessidade de gerenciar o projeto do Kernel Linux com a comunidade. ▸ Focado em performance e confiabilidade ▸ Mais tarde se tornou um DVCS (Distributed Version Control Systems) - Todo cliente possui uma cópia completa do repositório. O QUE É GIT -
▸ GIT é apenas um serviço, em um servidor que
manipula as informações e versões do repositórios. ▸ O Github é uma hospedagem de Git. Ele fornece ferramentas para melhorar a usabilidade em um servidor de Git compartilhado com opções gratuitas e privadas. O GIT NÃO É O GITHUB -
git pull git push git commit git add git checkout
ALIASES DO GIT Plumbing and Porcelain -
git pull git push git commit git add git checkout
ALIASES DO GIT Plumbing and Porcelain git rebase git reset git merge git fetch -
ALIASES DO GIT Plumbing and Porcelain git pull git push
git commit git add git checkout git rebase git reset git merge git fetch cat-file write-tree read-tree commit-tree hash-object -
OS OBJETOS DO GIT - BLOBS ▸ O Git usa
um modelo de armazenamento uniforme para todos os seus objetos. ▸ Cada objeto é identificado com o seu hash, mas o tipo do objeto é armazenado em metadados juntamente com o objeto. ▸ Sempre que criamos ou modificamos um arquivo trackeado, é gerado um BLOB para o mesmo. -
OS OBJETOS DO GIT - TREES ▸ Como o GIT
sabe, qual arquivo está na minha branch atual, e qual pertence a qual? ▸ Os blobs são organizados em trees, o que corresponde aos diretórios em uma estrutura de diretórios. ▸ A tree representa uma arvore de diretório diretório, contendo uma mistura de blobs e outras trees. Caso seja um blob de tree dentro de uma tree, podemos identificar um subdiretório, e assim em diante... -
OS OBJETOS DO GIT - COMMITS ▸ Um commit também
é um objeto de hash, armazenado exatamente nos mesmos mecanismos em que blobs e trees. ▸ Um commit é um hash da mensagem de commit, com um tipo de identificação das modificações. -
USANDO O GIT NO GITHUB COM AUTENTICAÇÃO DE DUAS ETAPAS
▸ Copie sua chave pública. ▸ No Github vá em Settings -> SSH and GPG keys ▸ Clique em New SSH Key e cole sua chave. ▸ Pronto :) -
USANDO O GIT NO GITHUB COM AUTENTICAÇÃO DE DUAS ETAPAS
▸ cat ~/.ssh/id_rsa.pub -
CONFIGURANDO O GIT $ git config --global user.name “SEU NOME”
$ git config --global user.email “SEU EMAIL” $ git config --global core.fileMode false $ git config --global diff.tool vimdiff -
▸ O repositório é onde o sistema de controle de
versão mantém o rastreamento de todas as alterações realizadas no projeto. ▸ Armazenam o estado atual do código, o histórico de alterações, quem fez, e um log que explica o porquê da alteração ter sido realizada. ▸ De forma geral o repositório precisa ter tudo que é essencial para o projeto, tanto para codificar, modificar quanto para construir as versões. REPOSITORIO -
▸ WORKING DIRECTORY - Onde estão os arquivos vigentes, ainda
não adicionados nem commitados ▸ INDEX (STAGE) - É uma árvore temporária de arquivos adicionados. ▸ HEAD (Ta valendo) - Area que aponta o ultimo commit de alterações confirmadas que você realizou. FLUXO DE TRABALHO NO GIT -
▸ Commited: O arquivo está sob controle de versão e
não apresenta nenhuma modificação. ▸ Commit candidate: Quando você adiciona as modificações (commit), esses serão os arquivos incluídos. ▸ Modified: Arquivos que foram modificados. ▸ Untracked: Arquivos novos, que ainda não estão sendo monitorados pelo Git. OS 4 ESTADOS DOS ARQUIVOS NO GIT -
INICIANDO UM REPOSITORIO LOCAL $ git init ▸ Cria um
repositório LOCAL com a estrutura do git ▸ A pasta que contém a pasta “.git” ▸ Contém todos os metadados do seu repositório e as versões disponíveis $ git remote add origin <servidor> -
CLONANDO UM REPOSITORIO REMOTO $ git clone https://github.com/user/repositorio.git VIA HTTPS
$ git clone [email protected]:user/repositorio.git VIA SSH -
CRIANDO E DANDO CHECKOUT NAS BRANCHES $ git checkout -b
novabranch branchorigem PARA CRIAR UMA BRANCH A PARTIR DE OUTRA $ git checkout branch TROCANDO DE BRANCH -
IDENTIFICANDO AS BRANCHES $ git branch PARA VERIFICAR AS BRANCHS
UTILIZADAS $ git branch --all VERIFICAR TODAS AS BRANCHES EXISTENTES NO PROJETO -
O COMANDO MAIS IMPORTANTE DO GIT $ git status ▸
Exibe o status da branch, e todos os arquivos. ▸ Deve se usar sem moderação. ▸ Exibe o status das árvores, branch atual, histórico de arquivos modificados, adicionados, criados e apagados -
ADICIONANDO UM ARQUIVO / TODOS $ git add arquivo.php $
git add pasta/ $ git add * ▸ Adiciona os arquivos para o Index (Stage) -
REMOVENDO UM ARQUIVO DA INDEX $ git reset arquivo.php HEAD
▸ Retorna o arquivo para o estágio de unstaged -
LIMPANDO ARQUIVOS UNTRACKED $ git clean -df ▸ Limpa todos
arquivos não traqueados da sua branch -
CRIANDO UM COMMIT $ git commit -m "modifiquei o sistema
de checkout" ▸ Cria um commit das modificações executadas $ git commit -am "modifiquei os boletos" ▸ Cria um commit das modificações executadas já adicionando todos os commits candidates (add * ) -
CRIANDO PUSH PARA O REMOTE $ git push origin <branch>
▸ Enviamos nossas modificações commitadas para o remote. -
SOLICITANDO UM PULL DAS MODIFICAÇÕES DO SERVIDOR $ git pull
origin <branch> ▸ Git pull é um “syntax sugar” para “git fetch ; git merge HEAD”, onde são baixadas as modificações da branch e as mesmas são “merjadas” com a HEAD atual. -
EFETUANDO O MERGE DE DUAS BRANCHES $ git merge <branch>
▸ O Merge é uma das tarefas mais complexas que o git faz, perde somente para o rebase, outra alteranativa para o merge. ▸ O Merge vai olhar para as duas branches (a atual e a de origem), encontrar os commits em comum e aplicar os commits que a branch atual não tem em cima. -
REBASE - ALTERNATIVA MAIS COMPLEXA AO MERGE $ git rebase
<branch> ▸ É mais uma forma de mover commits entre branchs do Git ▸ No Rebase, os seus commits (acima da base) são temporariamente apagados. ▸ A branch atual fica exatamente igual ao outro branch e seus commits são aplicados um a um no branch atual. ▸ Ideal para manter o histórico intacto. -
VERIFICANDO UM DIFF DE UM ARQUIVO $ git diff file
▸ É o visualizador de diffs default do git. ▸ Ele mostra as linhas modificadas de um arquivo apontado. ▸ Caso o arquivo seja muito grande ele vai abrir um “less” em shell para melhor visualização. ▸ “+” Representa as linhas adicionadas ▸ “-” Representa as linhas removidas/substituidas -
▸ O Netbeans tem plugin nativo (FODA) de Git que
ajuda no historico e nos diffs ▸ O Sublime tem alguns packages que ajudam -> Sublime GIT -> GitStatus ▸ Atom tem muitos tbm... VERIFICANDO UM DIFF DE UM ARQUIVO -
VERIFICANDO CONFLITOS $ git ls-files -u ▸ Lista todos os
conflitos encontrados durante o merge. -
REVERTENDO ALTERAÇÕES LOCAIS $ git checkout -- <arquivo> ▸ Modifiquei,
deu ruim, é mais fácil refazer… CHECKOUT NELE! ▸ Substitui as alterações do arquivo pelo conteúdo mais recente do mesmo presente do HEAD. ▸ Alterações já adicionadas ao Index (Stage) e novos arquivos serão mantidos. -
VERIFICANDO OS LOGS DOS COMMITS $ git log ▸ Verifica
as alterações efetuadas no repositório e parseia de uma forma mais amigável. ▸ Exibe as hashes dos commits e seus respectivos autores. -
REVERTENDO ALTERAÇÕES LOCAIS $ git fetch origin $ git reset
--hard origin/master ▸ ZOEI TODO O MEU LOCAL!!! E agora??? Descarte todos os commits locais e baixe uma nova cópia novinha do servidor! ▸ Todas as suas alterações locais (sem o push) vão voltar para o estado original do servidor. ▸ CUIDADO. Vai descartar tudo MESMO! -
ROLLBACK EM COMMITS $ git reset --hard hashdocommit $ git
reset --hard HEAD˜10 ▸ Podemos dar um reset na hash de um commit específico, voltando todo o estado do head para o estado commit especificado (git log) ▸ Podemos voltar também um número específico de commits para trás. -
STASH EM ARQUIVOS $ git reset --hard hashdocommit $ git
reset --hard HEAD˜10 ▸ Podemos “Encostar” arquivos pra navegar entre as branches do nosso projeto e “soltar” elas. ▸ É um modo inteligente de mover arquivos entre branches ▸ É também um modo inteligente de retirar arquivos e trocar de branches -
APOIO ▸ https://services.github.com/kit/downloads/github-g it-cheat-sheet.pdf ▸ https://git-scm.com/book/en/v2/Getting-Started-Git -Basics ▸ https://git-scm.com/about/distributed ▸
http://rogerdudler.github.io/git-guide/index.pt_BR.h tml ▸ https://education.github.com/git-cheat-sheet-educa tion.pdf