Workshop de Git

Bernardo Belchior, Edgar Passos & Nuno Ramos

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!

Made with Slides.com