0
GitAuthor: Eduardo R. D’Avila <erdavila@gmail.com>Date:   Fri Aug 31 12:00:00 2012 -0300
TópicosRepositóriosCommitsBranches e TagsRepositórios RemotosGit como cliente de SVNAlterações no HistóricoComandos e Opçõ...
Repositórios
Distribuído x Centralizado         Distribuído                  Centralizado                                              ...
Workflows                repositório             compartilhado                              ditador         repositório   ...
RepositóriosRepositório de desenvolvedor• Usado para se trabalhar no projeto• Com arquivos do projeto• Dados do Git no dir...
Git versus SVNGit: versionamento do projeto como um todoSVN: versionamento dos arquivos e diretóriosHistórico• SVN: histór...
Renomeação e CópiaSVNComandos move e copy• Mantêm o histórico associado ao novo arquivo/diretório• Devem ser usados com di...
DiretóriosSVN: versiona diretórios vaziosGit: não versiona diretórios vaziosSolução: criar um arquivo não usado dentro do ...
Commits
CommitCommits são representados por hashes SHA1                                        SVN: revisões são• 40 caracteres!  ...
CommitIndex / Staging Area / CacheÉ um estágio pré-commit     arquivo       git add              git commit               ...
Comando status                 index / staging area / cache                          SVN: “git checkout -- ARQUIVO”       ...
Branchese Tags
Branches no SVNSão uma convençãoEstrutura de diretórios:•    trunk/•    branches/ABC/•    branches/XYZ/•    branches/.../C...
Branches no GitSão uma feature obrigatóriaBranch master é criado por padrão• Não tem nada de especial  – Pode ser renomead...
BranchesSão implementados como referências a commitsmaster     format                                                     ...
Operações com branchesListar• git branchO branch atual é marcado com “*”Alternar• git checkout BRANCH                     ...
MergeCria imediatamente um novo commit                                       SVN: após o merge é                          ...
Fast-forwardSimplesmente avança o branch atual para alcançar o outrobranch     $ git checkout master     $ git merge new-f...
Merge com conflito                                     // Begin                          // Begin                         ...
HEADHEAD é o estado do histórico sobre o qual se está trabalhandoImplementado como referência a um branch (o branch atual)...
TagsMarcam uma versão do projetoSão implementadas como referências a commits   SVN: implementação                         ...
RepositóriosRemotos
Repositórios RemotosIdentificados por uma URL ou caminho:Sistema de arquivos local:• /git/projeto.git• ../outro-projeto• f...
Operações com repositórios remotosSomente duas operações básicas envolvem comunicação comrepositório remotogit fetch [--ta...
Branches “seguidos” (track)Cada branch local pode estar associado a um branch remotoOperações simplificadas no branch atua...
Usando Gitcomo clientede SVN
Git como cliente de SVNGit pode ser usado para interagir com servidor SVNTodas as funcionalidades locais do Git ficam disp...
Commits do SVN no GitCommits do SVN no Git incluem revisão relacionadaCommits feitos no Git são substituídos pelo commit d...
Cuidados e restriçõesManter histórico linearInformações de merge do Git e do SVN não são compatíveisDiretórios vaziosGit n...
Alteraçõesno Histórico
Alterações no históricoAlteração no último commitgit commit --amendRebaseDiversos usos:• Tornar linear parte do histórico•...
Alterações no histórico           CUIDADO!      Commits que já foram       compartilhados com     outros repositórios não ...
Comandose OpçõesDiversas
stashGuarda temporariamente alterações ainda não commitadasÚtil quando se começa uma tarefa e precisa-se alternar para out...
logProvê MUITAS opções de visualização do histórico• git log    [COMMIT ...] – Histórico a partir do commit mais recente (...
Operações em linhas de arquivosO parâmetro -p em alguns comandos permite selecionarinterativamente partes de arquivosSelec...
show / diff / blameshow – Exibe informações de um commit e/ou alterações econteúdo de arquivos• git show [COMMIT] – Mostra...
cherry-pickCaso específico de rebase: re-aplica alterações de um únicocommit     $ git checkout master                    ...
revertInverte as alterações feitas por um commit     $ git checkout master     $ git revert B                             ...
bisectEfetua uma busca binária para ajudar a identificar commit queintroduziu um bugPode ser automatizadaFunciona com hist...
Ferramentas gráficasgitkCorrespondente ao comando git log, mas mais visual e navegávelgit guiProvê funcionalidades de comm...
Perguntas?Dúvidas?Sugestões?Críticas?Opiniões?
Upcoming SlideShare
Loading in...5
×

Git

784

Published on

Tópicos básicos e avançados para quem já usa Git ou SVN. Inclui comparações com SVN e uso do Git como cliente de SVN. Baixe o arquivo e abra no PowerPoint para ver as animações!

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
784
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
34
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • Branch “format”Negrito – “format” avançaItálico e sublinhadoBranch “align”“align” avançaMergeBranch “clipboard”“align” avançaBranch “bullets” “bullets” vai usar algo que foi feito na implementação de “clipboard” “clipboard” avança Merge: clipboard + align Fim: “bullets” avança; merge
  • Transcript of "Git"

    1. 1. GitAuthor: Eduardo R. D’Avila <erdavila@gmail.com>Date: Fri Aug 31 12:00:00 2012 -0300
    2. 2. TópicosRepositóriosCommitsBranches e TagsRepositórios RemotosGit como cliente de SVNAlterações no HistóricoComandos e Opções Diversas2
    3. 3. Repositórios
    4. 4. Distribuído x Centralizado Distribuído Centralizado CVS Git é Distribuído • Todo diretório de trabalho é um repositório completo • Contém todo histórico de alterações • Principais operações são locais • Sem dependência de um servidor • Somente operações de “sincronização” necessitam acesso a outros repositórios4
    5. 5. Workflows repositório compartilhado ditador repositório público desenvolvedores tenentes desenvolvedores5
    6. 6. RepositóriosRepositório de desenvolvedor• Usado para se trabalhar no projeto• Com arquivos do projeto• Dados do Git no diretório .git na raiz do projetoRepositório de servidor (bare)• Usado para compartilhar o projeto• Sem arquivos do projeto• Dados do Git diretamente na raiz do projetoCriação de repositório:• git init [--bare] DIRETÓRIO6
    7. 7. Git versus SVNGit: versionamento do projeto como um todoSVN: versionamento dos arquivos e diretóriosHistórico• SVN: histórico de alterações se referem a arquivos/diretórios• Git: histórico de alterações se referem ao projeto inteiroBranching• SVN: “branches” são implementados como cópias de diretórios• Git: branches são “realidades alternativas” do projeto inteiroConcorrência• SVN: deixa alterar arquivos concorrentemente, possivelmente introduzindo problemas no projeto• Git: só permite atualizar repositório compartilhado após fazer merge (ou rebase)Navegação em interfaces web:• SVN: primeiro árvore de diretórios e arquivos, depois histórico de alterações de arquivo• Git: primeiro histórico de alterações do projeto, depois árvore de diretórios da versão do projeto7
    8. 8. Renomeação e CópiaSVNComandos move e copy• Mantêm o histórico associado ao novo arquivo/diretório• Devem ser usados com diretórios (em vez de usar comandos do sistema operacional)GitComando mv• Equivale a: – git rm --cached NOME-ANTES # tira do versionamento mas mantém o arquivo no diretório – mv NOME-ANTES NOME-DEPOIS – git add NOME-DEPOISNão tem comando para cópia• Executar: – cp ARQUIVO NOVO-ARQUIVO – git add NOVO-ARQUIVO... mas o Git se esforça para detectar renomeações e cópias!Parâmetros -M e -C em alguns comandos8
    9. 9. DiretóriosSVN: versiona diretórios vaziosGit: não versiona diretórios vaziosSolução: criar um arquivo não usado dentro do diretório (.gitignore)Comandos addsvn add DIRETÓRIO – Adiciona todos os itens dentro do diretório. Acusa erro sehouver itens já adicionadosgit add DIRETÓRIO – Adiciona todos os itens dentro do diretório sem reclamarsobre itens já adicionados9
    10. 10. Commits
    11. 11. CommitCommits são representados por hashes SHA1 SVN: revisões são• 40 caracteres! números sequenciais• Só é necessário usar caracteres o suficiente para não ser ambíguo, a partir de 4 caracteres commit 2874505bdb80ee8790296428576d977c28708e7f Author: Eduardo R. DAvila <erdavila@gmail.com> Date: Sat Jul 28 13:48:56 2012 -0300 Force loading order of test scriptsConforme o comando, um commit representa:• Um estado do projeto• OU alterações aplicadas a um estado do projeto para gerar um novo estado (delta / diff)• OU histórico do início do projeto até o estado do commitComandos• git checkout COMMIT• git show COMMIT• git log COMMIT11
    12. 12. CommitIndex / Staging Area / CacheÉ um estágio pré-commit arquivo git add git commit index commit alteradoPara identificar arquivos alterados e não-commitados:git statusPara commitar diretamente todos os arquivos alterados:git commit -a SVN: para commitar somente alguns arquivos, é necessário listá- los todos na linha de comando12
    13. 13. Comando status index / staging area / cache SVN: “git checkout -- ARQUIVO” corresponde a “svn revert ARQUIVO”13
    14. 14. Branchese Tags
    15. 15. Branches no SVNSão uma convençãoEstrutura de diretórios:• trunk/• branches/ABC/• branches/XYZ/• branches/.../Criar branch:• svn copy .../trunk .../branches/XYZ“Mergear” branch:• svn checkout .../trunk• svn merge .../branches/XYZ15
    16. 16. Branches no GitSão uma feature obrigatóriaBranch master é criado por padrão• Não tem nada de especial – Pode ser renomeado – Pode ser removido – Pode ser recriadoSão locais a cada repositório• Podem corresponder automaticamente (“track”) a um branch em um repositório remoto16
    17. 17. BranchesSão implementados como referências a commitsmaster format master master bullets masteralign clipboardO nome do branch pode ser usado no lugar do commit em comandos17
    18. 18. Operações com branchesListar• git branchO branch atual é marcado com “*”Alternar• git checkout BRANCH SVN: comando switchCriar• git branch BRANCH [COMMIT] # somente cria SVN: um novo commit é criado• git checkout –b BRANCH [COMMIT] # cria e alterna para o branchMerge• git merge OUTRO-BRANCHExcluir• git branch –d BRANCH # não deixa apagar branch não-mergeado SVN: um novo commit é criado• git branch –D BRANCHRemove somente a referência. Os commits continuam no histórico.18
    19. 19. MergeCria imediatamente um novo commit SVN: após o merge é preciso efetuar commitA não ser que:• Resulte em um “fast-forward”• Haja algum conflito! SVN: informações de merge ficamFacilmente identificável no histórico em propriedades do diretório HEAD $ git checkout master master $ git merge new-feature D E F A B C I G H new-feature19
    20. 20. Fast-forwardSimplesmente avança o branch atual para alcançar o outrobranch $ git checkout master $ git merge new-feature HEAD master A B C D E new-feature20
    21. 21. Merge com conflito // Begin // Begin function f(x) { function f(x) { main.js return 7; <<<<<<< HEAD function f(x) { } return 7; } // End merge ======= return 2 * x; function f(x) { >>>>>>> other-branch return 2 * x; } } // End$ git merge other-branchAuto-merging main.jsCONFLICT (content): Merge conflict in main.jsAutomatic merge failed; fix conflicts and then commit the result.$ git status# On branch master# Unmerged paths:# (use "git add/rm <file>..." as appropriate to mark resolution)## both modified: main.js#no changes added to commit (use "git add" and/or "git commit -a") O que fazer? • Editar arquivos resolvendo os conflitos • git add ARQUIVOS • git commit21
    22. 22. HEADHEAD é o estado do histórico sobre o qual se está trabalhandoImplementado como referência a um branch (o branch atual) ou diretamente aum commit HEADgit checkout BRANCH master• HEAD referencia o branch, que por sua vez referencia o commit• HEAD é o commit mais recente do branch A B C• Ao fazer um commit, o branch avança HEADgit checkout <COMMIT ou BRANCH-REMOTO ou TAG>• HEAD referencia diretamente um commit A B C• Repositório fica em “detached HEAD”• Ao fazer um commit, HEAD avança• Cuidado! Garbage collector pode eliminar commits sem referência22
    23. 23. TagsMarcam uma versão do projetoSão implementadas como referências a commits SVN: implementação idêntica a branchesNão podem ser alteradasPodem ser assinadas com GPGListar• git tagCriar• git tag NOME [COMMIT]23
    24. 24. RepositóriosRemotos
    25. 25. Repositórios RemotosIdentificados por uma URL ou caminho:Sistema de arquivos local:• /git/projeto.git• ../outro-projeto• file:///home/fulano/projetoSSH (Git deve estar instalado no servidor):• ssh://usuario@servidor/caminho• usuario@servidor:caminhoOutros protocolos:• git://servidor/caminho – Serviço do Git no servidor• http[s]://servidor/caminho – Lento! Se for somente leitura, não precisa ter Git no servidor• ftp[s]://servidor/caminho• rsync://servidor/caminhoUsar um nome para referenciar um repositório remoto• git remote add NOME URL-OU-CAMINHOMúltiplos repositórios podem ser referenciados – Afinal Git é distribuído!Listar repositórios remotos:• git remote –v # Lista repositórios remotosClonagem de repositório• git clone [--bare] URL-OU-CAMINHO [DIRETÓRIO] SVN: comando checkoutAutomaticamente define o nome “origin” para referenciar o repositório remoto25
    26. 26. Operações com repositórios remotosSomente duas operações básicas envolvem comunicação comrepositório remotogit fetch [--tags] NOME• Obtém branches e tags (e seus commits) do repositório remoto• Não toca nos branches locais• Cada branch remoto é identificado por REPOSITÓRIO/BRANCH• Para listar branches remotos: – git branch –r # Lista somente branches remotos – git branch –a # Lista branches locais e remotos (o atual é marcado com ‚*‛)git push [--tags] NOME BRANCH-LOCAL:BRANCH-REMOTO• Atualiza (ou cria) o branch do repositório remoto com o estado do branch local• Só funciona se for um “fast-forward” (pois não há como fazer um merge remoto)Extra:git pull NOME BRANCH-REMOTO• Executa um fetch do branch remoto e faz merge com o branch atual26
    27. 27. Branches “seguidos” (track)Cada branch local pode estar associado a um branch remotoOperações simplificadas no branch atual:• git pull # Sem mais parâmetros!• git push # Sem mais parâmetros!Criar um branch a partir de um branch remoto faz a associaçãoautomaticamente:• git checkout -b NOVO-BRANCH-LOCAL REPOSITÓRIO/BRANCH-REMOTO• git branch NOVO-BRANCH-LOCAL REPOSITÓRIO/BRANCH-REMOTOAssociar branch já existente:• git branch --set-upstream BRANCH-LOCAL REPOSITÓRIO/BRANCH-REMOTOListar associações:• git branch -v -v # Mesmo parâmetro duas vezes!27
    28. 28. Usando Gitcomo clientede SVN
    29. 29. Git como cliente de SVNGit pode ser usado para interagir com servidor SVNTodas as funcionalidades locais do Git ficam disponíveisClonar repositório:• git svn clone [--username=USERNAME] [SUBDIRS] URL [DIRETÓRIO] # pode demorar!Atualizar informações de branches do SVN:• git svn fetch # similar a ‚git fetch‛Atualizar branch atual com commits do SVN:• git svn rebase # similar a ‚git pull‛Enviar commits do branch atual ao SVN:• git svn dcommit # similar a ‚git push‛Criar branch ou tag no SVN:• git svn branch NOME• git svn tag NOME29
    30. 30. Commits do SVN no GitCommits do SVN no Git incluem revisão relacionadaCommits feitos no Git são substituídos pelo commit do SVN ao serem enviadosao SVN• Após git commit: commit 70391454621da3b6463aa270c9b75f16268909b4 Author: Eduardo DAvila <erdavila@gmail.com> Date: Thu Aug 30 19:38:02 2012 -0300 Commit criado com git-svn• Após git svn dcommit: commit 1c566c0d83d0efbd6fa65256827be5f2e23e9b2d Author: erdavila <erdavila@871847d0-d1a7-405d-8ece-d9976fa2c25e> Date: Thu Aug 30 22:41:33 2012 +0000 Commit criado com git-svn git-svn-id: file:///home/erdavila/ll-git/svn-server@5 871847d0-d1a7-405d-8ece-d9976fa2c25e30
    31. 31. Cuidados e restriçõesManter histórico linearInformações de merge do Git e do SVN não são compatíveisDiretórios vaziosGit não versiona diretórios vazios.• Diretórios esvaziados no Git devem ser removidos do SVN com git svn dcommit --rmdir• Diretórios vazios do SVN podem ser criados com git svn mkdirsAssociação entre branches locais e remotosGit tenta associar pelo commit mais recente em comum nos branches local eremotoTags do SVNAparecem como branches remotos no Git31
    32. 32. Alteraçõesno Histórico
    33. 33. Alterações no históricoAlteração no último commitgit commit --amendRebaseDiversos usos:• Tornar linear parte do histórico• Alterar commits (editar, eliminar, juntar, separar) anteriores ao último• “Transplantar” commits para outro branchPode ser necessário resolver conflitos durante a operação origin/master origin/master C D C D E’ F’ A B A B E F master $ git checkout master master HEAD $ git rebase origin/master HEAD33
    34. 34. Alterações no histórico CUIDADO! Commits que já foram compartilhados com outros repositórios não devem ser alterados!Git vai achar que são commits novos e tentar fazer merge, aumentando osriscos de conflitos que cada usuário vai ter que resolver no seu repositório34
    35. 35. Comandose OpçõesDiversas
    36. 36. stashGuarda temporariamente alterações ainda não commitadasÚtil quando se começa uma tarefa e precisa-se alternar para outra tarefa noGit SVN: comando shelveFunciona como uma pilha previsto para versão 1.10.0Comandos• git stash [save [‘MENSAGEM’]]• git stash pop [--index] [STASH]• git stash apply [--index] [STASH]• git stash list• git stash drop [STASH]• git show STASHStashes são identificados como:• stash@{0} (ou simplesmente “stash”) – no topo da pilha. É o default para pop, apply e drop• stash@{1}• stash@{2}• ...37
    37. 37. logProvê MUITAS opções de visualização do histórico• git log [COMMIT ...] – Histórico a partir do commit mais recente (ou dos especificados)• git log COMMIT1..COMMIT2 - Histórico do que o COMMIT2 tem de novo em relação ao COMMIT1• git log -- ARQUIVO – Histórico de commits que incluem alterações no ARQUIVO• git log -S STRING – Seleciona commits que removeram ou incluíram STRING em algum arquivoAlgumas opções:• --stat – Inclui lista de arquivos que foram alterados em cada commit• -p – Inclui as alterações de cada arquivo (diffs)• --graph – Mostra grafo de branches e merges• --oneline – Mostra somente hash e mensagem de cada commit• --decorate – Identifica outras referências (branches e tags) no histórico38
    38. 38. Operações em linhas de arquivosO parâmetro -p em alguns comandos permite selecionarinterativamente partes de arquivosSeleciona partes a serem adicionadas ao index (e posteriormente commitadas)• git add -p ARQUIVOSeleciona partes a serem removidas do index• git reset -p ARQUIVOSeleciona partes alteradas a serem descartadas• git checkout -p ARQUIVO39
    39. 39. show / diff / blameshow – Exibe informações de um commit e/ou alterações econteúdo de arquivos• git show [COMMIT] – Mostra dados do commit e suas alterações de arquivo• git show COMMIT -- ARQUIVO – Mostra alterações feitas no ARQUIVO no commit especificado SVN: comando cat• git show COMMIT:ARQUIVO – Mostra conteúdo do ARQUIVO no commit especificadodiff - Mostra diferenças em conteúdos de arquivos• git diff – Mostra alterações que ainda não estão no index• git diff COMMIT1 [COMMIT2] – Mostra diferenças entre os commits• git diff -- ARQUIVO – Seleciona arquivo para mostrar diferençasblame – Exibe informações de quando cada linha de um arquivofoi alterada• git blame ARQUIVO40
    40. 40. cherry-pickCaso específico de rebase: re-aplica alterações de um únicocommit $ git checkout master new-feature $ git cherry-pick E D E F A B C E’ master HEADPode ser necessário resolver conflitos SVN: cherry-pick é um tipo de merge41
    41. 41. revertInverte as alterações feitas por um commit $ git checkout master $ git revert B HEAD master A B C D E B’Pode ser necessário resolver conflitos SVN: “git revert” não corresponde a “svn revert”42
    42. 42. bisectEfetua uma busca binária para ajudar a identificar commit queintroduziu um bugPode ser automatizadaFunciona com históricos não lineares good bad E F G H I J K L M N O good bad bad BUG!43
    43. 43. Ferramentas gráficasgitkCorrespondente ao comando git log, mas mais visual e navegávelgit guiProvê funcionalidades de commit, merge, gerência de branches e derepositórios remotos, entre outras opções44
    44. 44. Perguntas?Dúvidas?Sugestões?Críticas?Opiniões?
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×