Programação para Web II

Aula 10 : Controle de Versão

Aula 10 - Controle de Versão

Apresenta os conceitos relacionados à controle de versão de código e a ferramenta GIT

Controle de Versão

Controle de Versão
  • Gerenciamento do código-fonte
  • Contribuições de diferentes programadores
  • Desfazer alterações problemáticas
  • Resolução de conflitos de código
git

O Git é um sistema de controle de versão, criado pelo finlandês Linus Torvalds (o mesmo criador do Linux). O sistema Git é utilizado principalmente nos projetos de desenvolvimento de software, sendo capaz de manter a organização das edições de código, além de permitir que diversos pessoas trabalhem simultaneamente em um mesmo projeto.

Instalação do Git

Windows:

  1. Faça o download do instalador para windows no [site](https://gitforwindows.org/) do Git.
  2. Prossiga com a instalação nas opções padrão. Para usuários avançados, há a possibilidade de alterar algumas opções.
  3. Inicie um Git Bash, recém instalado.
  4. Execute os seguintes comandos:
    $ git config --global user.name "Alan Turing"
    $ git config --global user.email "alan@turing.com"

GNU/Linux:

  1. Instale o git a partir do repositório de sua distribuição (ex.: em distribuições debian):
    $ sudo apt-get update
    $ sudo apt-get install git
  2. Prossiga com a instalação nas opções padrão. Para usuários avançados, há a possibilidade de alterar algumas opções.
  3. Inicie um Git Bash, recém instalado.
  4. Execute os seguintes comandos a partir do bash:
    $ git config --global user.name "Alan Turing"
    $ git config --global user.email "alan@turing.com"

Os comandos acima configuram o nome e conta de email do usuário que fara contribuições na máquina. Caso compartilhe a máquina com outros usuários, realize a configuração por repositório digitando o mesmo comando sem a opção --global dentro da pasta do repositorio.

Arquitetura do Git

Áreas do Git
Areas do Git

  • STASH: Área alternativa de armazenamento de alterações.
  • WORKSPACE: Área de trabalho que mantém o estado real/atual de todos os arquivos do projeto.
  • STAGE AREA (INDEX): Área de trabalho intermediária para organização das modificações a serem armazenadas no repositório local através do commit.
  • LOCAL REPOSITORY: Repositório de todas as versões geradas pelo comando commit. Esta área representa o estado mais estável do desenvolvimento.
  • REMOTE REPOSITORY: Repositório remoto que reune as contribuições dos repositórios locais.

Estágios de Arquivo no Git
Tipos de arquivo no Git

  • UNTRACKED: Arquivo que não está sendo versionado.
  • UNMODIFIED: Arquivo que não foi modificado quando comparado à ultima versão.
  • MODIFIED: Arquivo que foi modificado quando comparado à ultima versão.
  • STAGED: Arquivo alterado que foi adicionado ao INDEX e está pronto para o versionamento.

Operações com Git

Comandos Básicos Git

Há duas maneiras distintas de iniciar o terminal de comandos do Git:

  1. Através da interface gráfica, entre na pasta onde deseja criar/abrir o repositório do Git e selecione a opção Git Bash Here.
  2. Abra a aplicação Git Bash e navegue até a pasta desejada usando o comandocd [caminho da pasta](Ex.: cd Downloads/pascalzim6031/pascalzin)

Navegando pelo Bash

Para navegar no bash, utilize os seguintes comandos como referência:

  • cd caminho - Acessa a pasta do caminho
  • ls - Mostra arquivos no diretório atual
  • pwd - Mostra o caminho do diretório atual

git init

Para iniciar um novo repositório Git, basta executar os seguintes passos:

  1. Certifique-se de que está na pasta correta no bash usando o comando pwd ou consultado a barra de título
  2. Execute o comando: git init

Repare que é possível iniciar um novo repositório em qualquer pasta que não possua um repositório ativo. Isso inclui pastas que já possuem conteúdo.

git status

Para verificar o estado do repositório, utilize o comando:

git status

A saída do comando deve mostrar se há alterações no projeto desde o último commit, incluindo também informações sobre o branch e estado atual dos arquivos modificados

git add

O Git é um sistema de controle de versão, criado pelo finlandês Linus Torvalds (o mesmo criador do Linux). O sistema Git é utilizado principalmente nos projetos de desenvolvimento de software, sendo capaz de manter a organização das edições de código, além de permitir que diversos pessoas trabalhem simultaneamente em um mesmo projeto.

git commit

Com as alterações adicionadas à staging area, elas estão prontas para serem efetivas. O comandogit commit torna as alterações persistentes no repositório.

git commit -m "Descrição da alteração"

A descrição da alteração é importante para organizar a versão e manter outros programadores cientes de que tipo de alterações foram realizadas naquele commit.

Caso a opção -m não seja inserida, o git deverá abrir o editor de texto principal (variável core.editor da configuração do git), onde um texto mais longo pode ser inserido.

Mais Recursos

Branches Git
Branches no Git

Um branch é linha individual de histórico que contém arquivos que podem diferir de outras ramificações.

// Cria um novo branch chamado developer git branch developer // Deleta um branch chamado developer git branch -d developer // Exibe os branchs ativos git branch -a // Altera o branch atual para developer git checkout developer // Cria um branch vazio chamado developer git checkout --orphan developer
git checkout

O comando checkout permite navegar entre branches ou commits de um repositório Git, substituindo os arquivos do workspace atual pelas suas respectivas versões do commit desejado.

O uso do checkout pode ser feito indicando um branch, como neste exemplo:

$ git checkout developer

Ou usando o hash de um commit, que pode ser consultado pelo comando git log:

bash cmd

    $ git log
commit 721f5ae51632203e9df09dfd80ffbe021caa641c
Author: rvenson <ramon.venson@gmail.com>
Date:   Fri Sep 25 00:00:00 2020 -0300

First commit
$ git checkout 721f5ae51632203e9df09dfd80ffbe021caa641c

O uso do checkout não pode ser realizado em commits quando temos alguma alteração no workspace atual. Os commits criados a partir do checkout diretamente em um outro commit serão removidos quando o usuário volta ao topo do branch atual

git merge

O comando merge é responsável por incorporar as modificações de outro branch.

// Incorpora as modificações do branch developer no master git checkout master git merge developer

Ao realizar um merge entre dois branches, o git irá unificar todas os commits realizados no branch original, gerando um único commit no branch de destino.

git rebase

Além do merge, podemos utilizar também o comando rebase que, ao contrário do merge, não gera novos commits no branch destino. Ao usar o git rebase, todos os commits do branch original são adicionados ao destino na mesma ordem em que foram criados.

git reset

O comando reset pode ser utilizado para desfazer alterações adicionadas ao índice (reverso do comando add).

git reset

Ao utilizar este comando, retornamos ao estado inicial do indíce (sem alterar as modificações no workspace). Para retornar todos as modificações realizadas no workspace para o ultimo estado gravado nos commits, podemos usar o seguinte comando:

git reset --hard

E por fim, também podemos usar o comando reset para retornar definitivamente ao estado de um commit a partir de seu hash (USE COM MUITO CUIDADO!)

git reset 9f35748df387a1485b14daf98eac9b62a0d544e0
.gitignore

O arquivo .gitignore, geralmente presente na pasta raiz do projeto, é responsável por especificar os arquivos e pastas que não devem ser versionados pelo projeto. Este arquivo é de extrema importância para que arquivos residuais, temporários e builds não sejam integrados ao controle de versão. Para utilizar o gitignore, basta criar um arquivo com este mesmo nome na pasta principal do projeto. Dentro do arquivo, deve-se especificar linha por linha quais arquivos, tipos de arquivos e pastas devem ser recusados pelo git.

# Ignora toda a pasta bin dentro do projeto bin/ # Ignora todos os arquivos com final .import *.import # Ignora o arquivo project.config project.config

Cada IDE geralmente possui conjunto de arquivos e pastas que podem ser ignoradas, para saber quais são estes arquivos, você pode consultar o site https://www.gitignore.io/ e gerar o arquivo .gitignore padrão.

Materiais Complementares

Operações Remotas

Operações Remotas Git

Uma das funções do git é a possibilidade de estender a utilização do repositório git para um endereço remoto, oferecendo um local centralizado para compartilhamento e gerencia do código do projeto.

De maneira inicial, podemos realizar três tipos de operações usando o Git:

  • Copiar um repositório (clone)
  • Atualizar um repositório local (fetch e pull)
  • Atualizar um repositório remoto (push)

git clone

Para copiar um projeto git a partir de um endereço remoto, usaremos o comando clone:

git clone https://gitlab.com/rVenson/linguagemdeprogramacao.git

Também podemos realizar a mesma operação informando o endereço no sistema de arquivo local da máquina

A clonagem de um repositório traz algumas vantagens em relação à cópia feita pelo sistema operacional. Ao realizar o clone, o git faz a configuração dos endereços do repositório remoto, além de permitir uma cópia mais flexível dos dados do repositório remoto.

git remote

Ao clonar um repositório remoto, o git configura automaticamente o endereço do projeto. No entanto, para inserir o endereço de repositórios já existentes ou iniciar um novo projeto, é necessário realizar a configuração do endereço manualmente. Para isso, podemos utilizar o comando remote:

git remote add origin https://gitlab.com/rVenson/linguagemdeprogramacao.git

Além do comando git remote add, que especifica que estamos tentando adicionar um novo endereço de repositório remoto no nosso repositório local, também precisamos passar como parâmetro o apelido (alias) do endereço (por padrão, usamos origin) e o URI do projeto remoto.

Podemos visualizar os repositórios já configurados usando o comando git remote -v.

git pull e git fetch

Para atualizar seu repositório git local com as alterações mais recentes do repositório remoto, podemos utilizar os seguintes comandos:

  • git fetch: este comando atualiza as referências do projeto local, no entanto, não executa nenhuma mudança
  • git pull: este comando atualiza as referências do projeto local e executa as mudanças (merge)

Para usar qualquer um dos dois comandos, podemos informar também qual o endereço do repositório remoto (que pode ser o apelido definido, como por exemplo origin) e o branch que estamos trabalhando:

git pull origin master
git push

Na via inversa, podemos atualizar o repositório remoto com as alterações do repositório local. Para isso vamos usar o comando push, também declarando o endereço do repositório remoto e o branch que deverá ser atualizado:

git push origin master

Mão na Massa

Exercício: Iniciando Repositório Git

Inicie um novo repositório git local e em seguida:

  1. Crie um arquivo README.md contendo uma descrição do GIT;
  2. Crie uma pasta chamada img e insira esta imagem dentro desta pasta;
  3. Realize um novo commit com a descrição Estado inicial;
  4. Altere o arquivo README.md e insira a imagem da etapa anterior dentro do arquivo usando desta maneira:
    ![./img/gitflow.png](Imagem do Gitflow)
  5. Realize um novo commit com a descrição Inserida a imagem do git;
  6. Verifique o log usando git log, compacte a pasta do projeto e envie ao professor

Exercício: Merges

Faça o clone deste repositório https://gitlab.com/rVenson/exercicio_git e em seguida:

  1. Crie e mova-se para um novo branch para desenvolvimento das alterações chamado dev
  2. Você deverá realizar duas alterações no projeto, que devem ser efetivadas em dois commits diferentes:
    1. Adicionar a estilização CSS às páginas index.html e profile.html
      <link rel="stylesheet" href="style.css">
    2. Implementar a função validateUser(), dentro do arquivo index.js. Essa função deve retornar verdadeiro apenas caso o usuário digitado seja o seu email de estudante da unesc, com a senha samsepiol. Caso o resultado da validação seja falso, a função showSnackbar() deve ser chamada com uma mensagem de erro.
  3. Após realizar os dois commits, retorne ao branch master e aplique à ele as alterações realizadas no branch dev
  4. Retorne ao branch dev e desfaça apenas o último commit realizado (que deve ser a implementação da validação)
  5. A partir do branch dev, crie um novo branch chamado prod
  6. Delete o branch dev
  7. Mova-se para o branch prod e adicione um novo arquivo chamado README.md contendo seu nome
  8. Aplique as alterações realizadas no branch prod ao branch master. (Repare que aqui existem diferenças entre usar o comando git merge e git rebase)

Exercícios Complementares

Exercício: Lista de Comandos Git

Identifique a finalidade dos seguintes comandos:

  • git init
  • git config --global user.name "turing"
  • git add EXERCICIO.txt
  • git add .
  • git commit -m "Adicionado nova interface"
  • git commit
  • git reset --hard HEAD
  • cd Downloads
  • pwd
  • cd ..
  • ls
  • git pull
  • git push
  • git clone https://gitlab.com/rVenson/meurepositorio

Exercício: Clonando Repositório

Escolha um repositório disponível no gitlab.com ou github.com e faça a clonagem do mesmo, identificando qual foi o autor do último commit realizado no projeto e a(s) linguagem(s) utilizadas.

Exercício: Organizando Exercícios

Clone o repositório https://gitlab.com/rVenson/unesc-git-exercicios para a máquina local. Crie uma pasta chamada exercicios e dentro dela uma pasta para cada exercícios da disciplina (Ex.: exe01, exe02, exe03...). Em seguida adicione a solução dos exercícios em suas respectivas pastas, junto com um arquivo adicional README.md contendo a definição do exercício.