• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Git
 

Git

on

  • 854 views

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!

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!

Statistics

Views

Total Views
854
Views on SlideShare
854
Embed Views
0

Actions

Likes
2
Downloads
32
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • 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

Git Git Presentation Transcript

  • 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ções Diversas2
  • Repositórios
  • 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
  • Workflows repositório compartilhado ditador repositório público desenvolvedores tenentes desenvolvedores5
  • 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
  • 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
  • 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
  • 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
  • Commits
  • 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
  • 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
  • Comando status index / staging area / cache SVN: “git checkout -- ARQUIVO” corresponde a “svn revert ARQUIVO”13
  • Branchese Tags
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • RepositóriosRemotos
  • 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
  • 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
  • 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
  • Usando Gitcomo clientede SVN
  • 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
  • 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
  • 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
  • Alteraçõesno Histórico
  • 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
  • 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
  • Comandose OpçõesDiversas
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • Perguntas?Dúvidas?Sugestões?Críticas?Opiniões?