Workshop de Git
António Melo, Miguel Duarte & Rui Alves
Pré-requisitos
Comandos Básicos da Bash
$ ls
listar conteúdo do diretório
$ cd <nome-do-diretorio>
mudar para um diretório
$ touch <nome-do-ficheiro>
criar um ficheiro vazio
$ rm <nome-do-ficheiro>
remover um ficheiro
$ rm -r <nome-do-diretorio>
remover um diretório e o seu conteúdo
$ mkdir <nome-do-diretorio>
criar um diretório
$ pwd
ver o caminho do diretório atual
Configuração Básica do Git
Configurar o email
$ git config --global user.email "ni@aefeup.pt"
Configurar o nome
$ git config --global user.name "Núcleo de Informática da AEFEUP"
O email e o nome serão configurados globalmente, portanto só é necessário fazer uma vez por computador.
Para configurar apenas no repositório, deve ser retirada a flag --global.
O que é?
- Sistema de Controlo de Versões
- Permite controlar alterações a ficheiros
- Distribuído
- Cada computador tem toda a história do que aconteceu a cada ficheiro
Como funciona?
Repositório
O repositório é a história das alterações a todos os ficheiros.
Criar um repositório
Hipótese 1: Repositório Local
Criar um repositório local:
$ git init
Conectar a um repositório remoto*:
$ git remote add origin https://github.com/niaefeup/workshop-git.git
* Um repositório local funciona perfeitamente. Contudo, o habitual é haver um repositório remoto, onde a história dos ficheiros é guardada na "cloud". O repositório remoto já deverá estar criado numa plataforma, como o GitHub.
Hipótese 2: Repositório Remoto
Criar um repositório no GitHub
Hipótese 2: Repositório Remoto
Preencher o formulário
Hipótese 2: Repositório Remoto
Obter o link do repositório remoto
$ git clone https://github.com/niaefeup/workshopgit.git
Clonar o repositório remoto
Registar Alterações
Registar Alterações
Criar um ficheiro
$ touch workshop.txt
Verificar o estado do repositório
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
workshop.txt
nothing added to commit but untracked files present (use "git add" to track)
O estado do ficheiro é untracked, ou seja, as suas alterações ainda não estão a ser registadas.
Registar Alterações
Adicionar as alterações ao ficheiro*
$ git add workshop.txt
Verificar novamente o estado do repositório
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: workshop.txt
* Além de editar o conteúdo de um ficheiro, a sua criação e eliminação também são alterações que precisam de ser registadas.
O ficheiro já se encontra no estado to be commited, ou seja, as suas alterações serão efetivadas quando lhe for enviado o comando commit.
Tornar as Alterações Persistentes
Tornar as Alterações Persistentes
Verificar o estado do repositório
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: workshop.txt
As alterações estão prontas para serem efetivadas.
Tornar as Alterações Persistentes
Efetivar as alterações
$ git commit -m "First commit."
[master (root-commit) 1b8354a] First commit.
1 file changed, 0 insertions(+), 0 deletions(-)
As alterações já são persistentes!
Tornar as Alterações Persistentes
Verifiquem o vosso repositório do GitHub
As alterações já são persistentes
localmente...
Tornar as Alterações Persistentes
O que aconteceu?
As alterações apenas foram feitas no repositório local, mas ainda não foram enviadas para o repositório remoto, isto é, o repositório que está no GitHub.
Qual é a solução?
Enviar as alterações locais para o repositório remoto*.
$ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 214 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/niaefeup/workshopgit.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
A flag -u só é necessária porque se quer criar um ramo no repositório remoto igual ao local. Quando o ramo remoto já tiver sido criado, basta utilizar o comando git push.
Tornar as Alterações Persistentes
Verifiquem o vosso repositório do GitHub
As alterações já são persistentes
desta vez a sério!
Atualizar o Repositório Local
Editar o ficheiro no GitHub
Alterar o conteúdo e clicar commit changes
Atualizar o Repositório Local
O repositório remoto está à frente do local, portanto é preciso atualizá-lo
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/niaefeup/workshopgit
a85c330..9ab5edf master -> origin/master
Updating a85c330..9ab5edf
Fast-forward
workshop.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
O repositório já está sincronizado com o local
Atualizar o Repositório Local
O Workshop de Git é muito bom!
Repositório Local
O Workshop de Git é excelente!
Repositório Remoto
$ git pull
Atualizar o repositório local
E se alterarmos os mesmos ficheiros?
Atualizar o Repositório Local
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/niaefeup/workshopgit
9ab5edf..0f23c31 master -> origin/master
Updating 9ab5edf..0f23c31
error: Your local changes to the following files would be overwritten by merge:
workshop.txt
Please, commit your changes or stash them before you can merge.
Aborting
E se alterarmos os mesmos ficheiros?
Acontece um conflito. O Git tem um sistema de resolução de conflitos, mas nem sempre os consegue resolver.
Quando existe um conflito, a sincronização é abortada.
Atualizar o Repositório Local
Porque é que houve um conflito?
- O Git não sabe qual é o ficheiro que o utilizador quer manter.
- Para não perder informações, é preferível abortar a sincronização e deixar que o utilizador decida o que fazer.
Ramos
Ramos são uma alteração da história a partir de um certo ponto. São úteis quando há várias alterações a ser feitas ao mesmo tempo e as queremos manter independentes.
master
update-workshop
criação de um ramo
$ git branch update-workshop
junção de um ramo noutro
commit
$ git checkout master
$ git merge update-workshop
Ramos
Criar um novo ramo chamado update-workshop
$ git branch update-workshop
Listar os ramos locais
$ git branch
* master
Verificar os ramos locais
$ git branch
* master
update-workshop
O ramo atual é definido pelo asterisco (*) colocado antes do seu nome.
Ramos
Tornar as alterações permanentes
$ git commit -am "Updated workshop description."
Mudar para o novo ramo
$ git checkout update-workshop
M workshop.txt
Switched to branch 'update-workshop'
(Opcional) Enviar para o repositório remoto
$ git push -u origin update-workshop
A flag -a diz para adicionar ao commit todas as alterações feitas. Assim evita-se a utilização do comando git add.
Ramos
O Git ainda não sabe resolver conflitos, mesmo utilizando ramos. A diferença que é agora está a ser estabelecida uma base a partir da qual as alterações serão analisadas. Esta base é o ramo atual.
$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
Mudar para o ramo master
$ git pull
Updating 9ab5edf..0f23c31
Fast-forward
workshop.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Atualizar o ramo local com as alterações no repositório remoto
Resolver Conflitos
$ git merge update-workshop
Auto-merging workshop.txt
CONFLICT (content): Merge conflict in workshop.txt
Automatic merge failed; fix conflicts and then commit the result.
Juntar o ramo update-workshop
O Git tenta efetuar uma junção automática, mas não conseguiu. Neste caso, é preciso intervenção manual. Um conflito normalmente parece-se com isto:
<<<<<<< HEAD
O Workshop de Git é excelente!
=======
O Workshop de Git é muito bom!
>>>>>>> update-workshop
marca o início das alterações feitas no ramo atual que causaram conflito
marca o final das alterações conflituosas causadas pelo ramo que está a ser integrado
separador das alterações
$ git merge update-workshop
Resolver Conflitos
Definir como ficará o ficheiro após a junção
O Workshop de Git é excelentemente bom!
Tornar as alterações permanentes
$ git commit -am "Corrected workshop description."
Enviar para o repositório remoto
$ git push
Não é necessária a flag -u porque o ramo já existe no repositório remoto.
Guardar Alterações Temporárias
O Git implementa um sistema de stashing (esconder). A lógica é colocar numa stack as alterações feitas e, quando for necessário, retirá-las.
Como guardar as alterações que fiz?
Colocar as alterações no topo da stash
$ git stash
Saved working directory and index state WIP on master: 53b9908 First commit.
HEAD is now at 53b9908 First commit.
$ git stash list
stash@{0}: WIP on master: 53b9908 First commit.
Verificar as alterações guardadas
Guardar Alterações Temporárias
Retirar da stash e aplicar as alterações no ramo atual
$ git stash pop
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: workshop.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (b749a8b7971b1e81c2b187404f8c6afac1a98518)
$ git stash drop
Dropped refs/stash@{0} (6beb595bbfe4ed393e5060c31c01cce87afc6c1b)
Descartar alterações no topo da stash
Guardar Alterações Temporárias
Guardar as alterações num novo ramo
$ git stash branch new-branch
Switched to a new branch 'new-branch'
On branch new-branch
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: workshop.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (ccdc80349446c0fd43c4117328f04ed6f5b3f8fa)
$ git branch new-branch
$ git checkout new-branch
$ git stash pop
O comando acima é equivalente a
Obrigado a Todos!
Se tiverem dúvidas, contactem-nos!
Copy of deck
By Bernardo Belchior
Copy of deck
- 604