Git

434 visualizações

Publicada em

Presentation introducing GIT source control in portuguese.

Publicada em: Software
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Git

  1. 1. GIT Source Control GLUA - Sessão Livre Ilan Pegoraro Igor Duarte Cardoso 12/03/2014
  2. 2. História ● Criado por Linus Torvalds em 2005; ● Controlo de versões distribuído; ● Multi-plataforma (Unix-like, Windows, etc.); ● Interface de linha de comandos, no entanto existem várias alternativas gráficas: ○ gitk; ○ tig (linha de comandos mas usa n-curses); ○ Integração com IDEs; ○ Source-tree (OS X e Windows). Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  3. 3. Inicialização do repositório Criação de um repositório local no diretório atual (pasta .git): ● $ git init Sessão livre sobre GIT ● $ git clone <url> Grupo Linux da Universidade de Aveiro
  4. 4. .gitignore É um ficheiro utilizado para especificar outros ficheiros que o git deve ignorar. Sintaxe: ● Cada linha especifica uma regra; ● Shell globbing; ● # para comentários; ● O caráter ! no início da linha inverte o sentido da regra; ● Recursivo (regras são aplicadas a partir do diretório actual). Nota: Só funciona para os ficheiros que o git não esteja a seguir, caso contrário é preciso removê-los com git rm <ficheiro>. Sessão livre sobre GIT Grupo Linux da Universidade de Aveiro
  5. 5. .gitignore <linha em branco> # comentário... não é reconhecido como regra *.class *.jar !lib/MyPrecious.jar *~ src/Test.java build/ Sessão livre sobre GIT Exemplo: Grupo Linux da Universidade de Aveiro
  6. 6. git config Permite configurar opções do repositório ou opções globais, como: ● Editor; ● Dados do autor; ● Interface com cores. $ git config core.editor vim $ git config color.ui true $ git config user.name Glua $ git config user.email “glua@ua.pt” Nota: Para remover basta usar a flag --unset $ git config --unset … Nota 2: Para configurações globais basta usar a flag --global. $ git config --global … Sessão livre sobre GIT Grupo Linux da Universidade de Aveiro
  7. 7. Adicionar um ficheiro git add permite adicionar um ficheiro à staging area. $ git add Main.java Nota: Após esta ação, o git irá criar um objeto na armazém de objetos que corresponde aos ficheiros criados e/ou alterados. Tecnicamente, as alterações são guardadas em disco. $ git status $ tree .git/objects Sessão livre sobre GIT Grupo Linux da Universidade de Aveiro
  8. 8. Staging Area ● É a área que permite organizar um commit antes de o escrever no histórico do projeto; ● Serve para o git não estar continuamente a manipular o repositório. # On branch master # Changes to be committed: # # new file: MyClass.java # # Changes not staged for commit: # # modified: Main.java # # Untracked files: # # Main.class Nota: para remover um ficheiro da staging area, git rm --cached <ficheiro> Sessão livre sobre GIT Grupo Linux da Universidade de Aveiro
  9. 9. Mensagem de commit (opcional) ...mas recomendado! Titulo <linha em branco> Corpo da messagem... As mensagens de commit do git têm um formato de conveniência, contudo não é obrigatório segui-lo. Nota: consultem as boas práticas para mensagens de commit: http://sethrobertson.github.io/GitBestPractices/ Sessão livre sobre GIT Grupo Linux da Universidade de Aveiro
  10. 10. Guardar alterações (commit) git commit cria um novo objeto (commit object) com conteúdo da staging area e atualiza as referências HEAD e master. ● ID - função hash (sha1) de: ○ Conteúdo; ○ Autor; ○ Data; ○ Mensagem de log; ○ ID do commit antigo. $ git commit Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  11. 11. Guardar alterações (commit) $ git add Main.java $ git commit HEAD master $ git add MyClass.java ... $ git commit Sessão livre sobre GIT A HEAD B master A HEAD master A Grupo Linux da Universidade de Aveiro
  12. 12. Manipulação de ficheiros ● git rm <fich> ○ Remove o ficheiro do repositório; ● git rm --cached <fich> ○ Remove o ficheiro do repositório quando já foi adicionado; ● git mv <antigo> <novo> ○ Altera o nome do ficheiro <antigo> por <novo>; ○ git é tão inteligente que detecta a alteração do nome do ficheiro, mesmo sem usar o comando git mv. Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  13. 13. Consulta de commit git log permite visualizar a listagem de todos os commits existentes no repositório. $ git log $ git log --graph --decorate $ git log --stat $ git log <fim>..<inicio> $ git shortlog Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  14. 14. Ramos git branch cria uma nova linha de desenvolvimento. ● São armazenados em .git/refs/heads Isolamento Trabalho Atualização Integração $ git branch feature HEAD master A Sessão livre sobre GIT feature B Grupo Linux da Universidade de Aveiro
  15. 15. Ramos Sessão livre sobre GIT ● Permanent Branches ○ Ramo de integração, por exemplo master; ○ Ramo de desenvolvimento, por exemplo develop; ○ Persistem no repositório. ● Topic Branches ○ Surgem dois tipos: hotfixes, feature (por convenção); ○ São utilizados para corrigir falhas ou desenvolver pequenas funcionalidades. Dicas Nota: git flow simplifica a utilização deste modelo de branching. http://nvie.com/posts/a-successful-git-branching-model/ Grupo Linux da Universidade de Aveiro
  16. 16. Ramos git checkout atualiza os ficheiros do diretório de trabalho com a versão existente na base de dados referente ao ramo pretendido. Nota: git checkout -b <branch> cria o ramo e faz checkout para o mesmo. $ git checkout feature HEAD A Sessão livre sobre GIT feature master B Grupo Linux da Universidade de Aveiro
  17. 17. Ramos git checkout atualiza os ficheiros do diretório de trabalho com a versão existente na base de dados referente ao ramo pretendido. Nota: git checkout -b <branch> cria o ramo e faz checkout para o mesmo. $ git checkout feature HEAD master A Sessão livre sobre GIT feature B Grupo Linux da Universidade de Aveiro
  18. 18. Ramos git checkout pode ainda ser usado para atualizar os ficheiros do diretório de trabalho para um determinado commit do histórico, temporariamente. $ git checkout c02293177dd5db9d458f20a6fd27bf8849d0c01f Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  19. 19. Ramos git branch também permite visualizar os ramos existentes no repositório # mostra os ramos locais $ git branch # mostra os ramos remotos $ git branch -r # mostra todos os ramos $ git branch -a # remove o ramo $ git branch -d feature # força a remoção do ramo cuidado! $ git branch -D feature Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  20. 20. Ramos Sessão livre sobre GIT A master HEAD B feature C D após commits em feature Grupo Linux da Universidade de Aveiro
  21. 21. Ramos B Sessão livre sobre GIT após commits em master A HEAD master feature C D E $ git checkout master Grupo Linux da Universidade de Aveiro
  22. 22. Merging Merging é o processo de integrar commits de um ramo noutro. ● fast-forward merge; ● 3-way merge; ● Octopus. Todas as estratégias utilizam o comando git merge. ● A estratégia utilizada é detectada automaticamente pelo git. $ git checkout master $ git merge feature Nota: O merge é feito no ramo master, deixando o outro inalterado. Sessão livre sobre GIT Grupo Linux da Universidade de Aveiro
  23. 23. Merging Fast-forward merge $ git checkout master Sessão livre sobre GIT A HEAD master B feature C D Grupo Linux da Universidade de Aveiro
  24. 24. Merging Fast-forward merge $ git merge feature Sessão livre sobre GIT A HEAD master B feature C D Grupo Linux da Universidade de Aveiro
  25. 25. Merging 3-way merge $ git checkout master Sessão livre sobre GIT A master B feature C D E HEAD Grupo Linux da Universidade de Aveiro
  26. 26. Merging 3-way merge $ git merge Sessão livre sobre GIT A master B feature C D E HEAD F Grupo Linux da Universidade de Aveiro
  27. 27. Conflitos Ao fazer o merge podem surgir conflictos entre alterações ao mesmo ficheiro. ● $ git checkout --ours Main.java ○ Checkout do nosso ficheiro, ignorando as alterações feitas por outros; ● $ git checkout --theirs Main.java ○ Checkout do ficheiro alterado por outros, ignorando as nossas alterações; ● $ git mergetool; ● Resolver conflitos manualmente. Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  28. 28. Reset Permite navegar pelo histórico, voltando para um commit em que o estado do projeto esteja correto. # Limpa a staging area $ git reset $ git reset HEAD # Para além de limpar faz checkout do ponto desejado (cuidado!) $ git reset --hard master~ Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  29. 29. Remote ● Inicialização com git clone já configura o remote. ● São armazenados em .git/refs/remotes ● Pelo contráraio a inicialização com git init não o faz. $ git remote add <nome> <url> ● Listagem ○ git remote ○ git remote -v ● Remoção ○ git remote remove <nome> ● Operações que utilizam remote ○ $ git fetch ○ $ git pull ○ $ git push Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  30. 30. Desenvolvimento em grupo git fetch descarrega as referências juntamente com os objetos necessários para completar o histórico. $ git fetch remote refs exemplo: $ git fetch origin develop Este comando irá descarregar o branch develop e criar um novo branch com o nome origin/develop. Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  31. 31. Desenvolvimento em grupo git pull é a combinação do comando fetch com o merge. git pull origin develop, traduz-se para: $ git fetch origin develop $ git merge origin/develop Nota: As operações sobre branches são sempre feitas relativamente ao branch atual. Sessão livre sobre GIT - criação implicita do origin/develop - merge tipicamente fast-forward, mas não necessariamente Grupo Linux da Universidade de Aveiro
  32. 32. Desenvolvimento em grupo git push operação oposta ao fetch, isto é, envia as referências juntamente com os objetos necessários. $ git push origin master Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  33. 33. Alias É possível configurar alias para evitar escrever comandos longos. $ git config alias.st status $ git config alias.ci commit $ git config alias.l “log --decorate --graph” $ git config alias.ll “log --pretty=oneline --abbrev-commit” Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  34. 34. Tags git tag cria uma referência, ou seja, dá um nome a um objeto de commit. ● São armazenadas em .git/refs/tags; ● Gestão de tags é feita através do comando ○ $ git tag ● Enviadas para o remote ○ $ git push origin --tags ● Utilizando a opção -a dizemos ao git para criar uma tag anotada, ou seja, permite armazenar uma mensagem junto com a tag; ● Para além da mensagem ainda é possível assinar as tags criptográficamente. Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  35. 35. Tags A B Sessão livre sobre GIT feature C D E HEAD F master v0.3 beta-1 Grupo Linux da Universidade de Aveiro
  36. 36. Comandos úteis Sessão livre sobre GIT ● git revert ○ Dado um ou mais commits, cria um novo objeto commit, para cada, com o patch inverso da alteração; ● git cherry-pick ○ Dado um ou mais commits, aplica as alterações criando um novo objeto commit para cada uma; ● git rebase ○ Permite modificar o histórico (não se deve fazer se já foi partilhado!); ● git ls-files ○ Mostra os ficheiros do repositório; ● git stash ○ Armazenar as alterações sem modificar o historico (área de stash); Grupo Linux da Universidade de Aveiro
  37. 37. Comandos úteis Sessão livre sobre GIT ● git rev-parse ○ Resolve o ID entre referências e ID abreviados; ● git bisect ○ Encontrar o commit que introduz um bug; ● git fsck ○ Verificação de erros no repositório; ● git gc --prune ○ Limpar objetos do git que não são necessários. Grupo Linux da Universidade de Aveiro
  38. 38. Referências ● man pages são nossas amigas: ○ git help <comando> , por exemplo git help add ● Site oficial: ○ http://git-scm.org - contém documentação muito boa! ● Um modelo de branching: ○ http://nvie.com/posts/a-successful-git-branching-model/ ● Teste online: ○ http://try.github.io/ ● Outros: ○ Boas práticas de mensagens de commit no git: http://sethrobertson. github.io/GitBestPractices/ ○ Um projeto interessante (baseado em git) para guardar, sincronizar e versionar ficheiros de configuração linux entre máquinas: https: //github.com/RichiH/vcsh Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
  39. 39. Obrigado! Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT

×