6.1.3. Trabalhando com o git e o GitHub
6.1.3.1. Instalando o git
Para seguir os passos desta seção, você precisará ter o git
instalado. Consulte esta página para baixar o instalador para sua plataforma. Se você quiser se apronfundar no uso do git
, veja [9].
O macOS já vem com o git
instalado.
Na maioria das distribuições Linux, você pode utilizar o próprio gerenciador de pacotes para instalar o git
. Por exemplo, no Linux Ubuntu o seguinte comando realiza a instalação do git
:
sudo apt-get install git
6.1.3.2. Clonando o repositório ser-347
Para trabalharmos com o nosso código, precisamos de uma cópia do repositório remoto, localizado no endereço https://github.com/gilberto-queiroz/ser-347
, em nosso sistema local. Para isso, podemos utilizar o comando git clone
para realizar essa cópia. Abra um terminal de comandos e vá para uma pasta onde você possa copiar o repositório. Em seguida, utilize o comando git clone
como indicado abaixo:
git clone https://github.com/gilberto-queiroz/ser-347
Nota
Substitua no endereço acima, o nome de usuário gilberto-queiroz
pelo seu, bem como o nome do seu repositório.
Ao clonar o repositório, você terá uma cópia completa em sua máquina local. Utilize o comando ls
para listar os arquivos da sua pasta corrente:
ls
Nota
No Microsoft Windows, você poderá utilizar o comando dir
.
O comando acima apresentará uma saída similar à apresentada abaixo:
ser-347
O diretório ser-347
conterá uma cópia local completa do seu repositório remoto do GitHub. Utilize o comando cd
para alterar o diretório corrente para a pasta ser-347
, como mostrado abaixo:
cd ser-347
Neste diretório, podemos verificar os arquivos existentes:
ls
O comando acima apresentará uma saída similar à mostrada abaixo:
LICENSE README.md
Para obter a lista completa de arquivos, inclusive os ocultos, utilize a opção -a
como indicado abaixo:
ls -a
Nota
No Microsoft Windows, você poderá utilizar o comando dir /ah
.
Dessa vez, o comando ls
apresentará a seguinte saída:
. .. .git .gitignore LICENSE README.md
Na listagem acima:
O diretório
.git
contém informações de configuração e da estrutura do seu repositório local, informações essas usadas pelo própriogit
. Não iremos discutir a estrutura desse diretório.O arquivo
.gitignore
é um arquivo texto comum, que contém em cada linha o nome de um arquivo, diretório ou padrão de nomenclatura dos arquivos e diretórios qua não devam ser tratados pelogit
. Como escolhemos umtemplate
para repositórios de código baseados na linguagemPython
, temos este arquivo com um conteúdo semelhante ao apresentado abaixo:# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ ... # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/
O arquivo
License
contém uma declaração baseada em umtemplate
de licençaMIT
.O arquivo
README.md
contém texto utilizando a sintaxe Markdown:
# ser-347
Projeto da Disciplina SER-347
A Figura 6.7 mostra um resumo dos comandos utilizados até aqui.
6.1.3.3. Verificando o status
do repositório
O comando git status
apresenta como se encontra nosso repositório em relação à possíveis modificações:
git status
No repositório ser-347
, o comando acima produzirá uma saída como mostrada abaixo:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
6.1.3.4. Modificando um arquivo no repositório ser-347
Se modificarmos o conteúdo do arquivo README.md
, conforme mostrado na listagem abaixo:
# SER-347 - Projeto Final
Este repositório contém o código fonte do trabalho
final da disciplina SER-347.
## Contexto e Objetivos
Uma breve descrição do projeto e seus objetivos...
## Organização do Repositório
Nesta seção explicamos a organização usada para
os códigos e dados disponibilizados neste trabalho.
## Referências
Alguns links e textos interessantes sobre o projeto...
Ao verificarmos o status
do nosso repositório, através do seguinte comando:
git status
obtemos a informação abaixo:
1On branch master
2Your branch is up to date with 'origin/master'.
3
4Changes not staged for commit:
5 (use "git add <file>..." to update what will be committed)
6 (use "git checkout -- <file>..." to discard changes in working directory)
7
8 modified: README.md
9
10no changes added to commit (use "git add" and/or "git commit -a")
Vamos discutir a saída acima:
Na
linha 01
ogit
nos informa que estamos trabalhando numramo
(branch
) chamadomaster
. O conceito deramos
(branches
) é muito importante para operação com ogit
. Todo o conteúdo do nosso repositório pode ser visto em uma árvore (tree
) com ramificações (branches
) contendo diferenças (ou modificações) no conteúdo dos arquivos. Todo repositório criado irá possuir um ramo principal, denominadomaster
. Podemos criar novosramos
derivados de qualquer ponto da árvore com o histórico do nosso repositório.A
linha 02
indica que nosso repositório está atualizado em relação à suaorigem
no ramomaster
(origin/master
).A
linha 08
indica que o arquivo chamadoREADME.md
encontra-se modificado em relação à versão existente no repositório local mantido pelogit
. Se quisermos desfazer a modificação, basta utilizar o comandogit checkout
como indicado nalinha 06
. Para informar que o arquivo deve ser atualizado no repositório local, devemos usar o comandogit add
(sugestão dalinha 05
).
Vamos utilizar o comando git checkout
para desfazer a modificação do arquivo README.md
e voltar o seu conteúdo para o que existia no repositório local:
git checkout -- README.md
O comando acima fará com que o conteúdo do arquivo README.md
volte a ser:
# ser-347
Projeto da Disciplina SER-347
Repare também, que o status
do seu repositório é de que nada foi modificado:
git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Altere mais uma vez o conteúdo do arquivo README.md
para o seguinte:
# SER-347 - Projeto Final
Este repositório contém o código fonte do trabalho
final da disciplina SER-347.
## Contexto e Objetivos
Uma breve descrição do projeto e seus objetivos...
## Organização do Repositório
Nesta seção explicamos a organização usada para
os códigos e dados disponibilizados neste trabalho.
## Referências
Alguns links e textos interessantes sobre o projeto...
O status
do seu repositório irá indicar que o arquivo README.md
foi modificado:
git status
1On branch master
2Your branch is up to date with 'origin/master'.
3
4Changes not staged for commit:
5 (use "git add <file>..." to update what will be committed)
6 (use "git checkout -- <file>..." to discard changes in working directory)
7
8 modified: README.md
9
10no changes added to commit (use "git add" and/or "git commit -a")
Desta vez, vamos incluir este arquivo na lista a ser confirmada sobre atualizações para o nosso repositório local:
git add README.md
git status
Como pode ser visto:
1On branch master
2Your branch is up to date with 'origin/master'.
3
4Changes to be committed:
5 (use "git reset HEAD <file>..." to unstage)
6
7 modified: README.md
O arquivo README.md
agora faz parte da lista de arquivos a serem confirmados (committed
) sobre sua modifcação.
Nesse ponto, podemos usar o comando git commit
para confirmar e salvar todas as modificações realizadas até aqui na estrutura dos arquivos do nosso repositório:
git commit -m "Primeira versão do arquivo README.md"
No comando acima, a opção -m
permite adicionar uma descrição que será associada ao registro da moficação realizada. Em geral, colocamos um texto que nos ajude a lembrar a modificação realizada.
A saída do git commit
será algo parecido com:
[master 2c270dc] Primeira versão do arquivo README.md
1 file changed, 17 insertions(+), 2 deletions(-)
rewrite README.md (100%)
mostrando que as diferenças entre o arquivo atual e sua última versão no repositório local foram devidamente registradas.
Se novamente verificarmos o status
do repositório:
git status
veremos que não há mais nada modificado na cópia do nosso repositório local, mas que ele está à frente do orginal (origin/master
), em 01 commit
:
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
6.1.3.5. Sincronizando sua cópia local com o repositório remoto
Agora que nosso repositório local contém uma modificação que ainda não se encontra no repositório remoto do GitHub
, vamos sincronizar nossa cópia com a do GitHub.
Primeiro devemos garantir que nossa cópia local esteja realmente atualizada com a remota. Podemos fazer isso com o comando git pull
:
git pull
Se nada tiver sido alterado no repositório remoto, o comando acima produzirá uma mensagem como a mostrada abaixo:
Already up to date.
Agora, podemos atualizar o repositório remoto com as nossas modificações locais:
git push
O comando acima pedirá seu usuário e senha do GitHub:
Username for 'https://github.com': gilberto-queiroz
Password for 'https://gilberto-queiroz@github.com':
Em seguida à informação das credenciais, o comando irá informar o seguinte:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 533 bytes | 533.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/gilberto-queiroz/ser-347
e8c3404..2c270dc master -> master
Ao final, você poderá ir ao GitHub e ver as modificações no seu repositório remoto, conforme mostrado na Figura 6.8:
6.1.3.6. Adicionando um novo arquivo ao repositório ser-347
Vamos criar um novo arquivo, chamado fatorial.py
, com o seguinte conteúdo:
def Fatorial(num):
produto = 1
while(num > 0):
produto = produto * num
num = num - 1
return produto
Agora, verifique o status
de seu repositório local:
git status
O programa produzirá uma saída como a mostrada abaixo:
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
fatorial.py
nothing added to commit but untracked files present (use "git add" to track)
Como mostrado, seu repositório local continua sincronizado com o remoto, porém o git
já detectou a existência de um novo arquivo chamado fatorial.py
. Você deverá decidir se deseja incluí-lo como parte do seu repositório. Se quiser incluí-lo, precisará utilizar o comando git add
como mostrado abaixo:
git add fatorial.py
O status do seu repositório estará agora como indicado abaixo:
git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: fatorial.py
Agora, podemos confirmar a inclusão desse arquivo no repositório local:
git commit -m "Adicionando uma função para cálculo do fatorial"
Saída:
[master 1e6c2e8] Adicionando uma função para cálculo do fatorial
1 file changed, 9 insertions(+)
create mode 100644 fatorial.py
O status
do repositório agora é o seguinte:
git status
1On branch master
2Your branch is ahead of 'origin/master' by 1 commit.
3 (use "git push" to publish your local commits)
4
5nothing to commit, working tree clean
Para levar as modificações do repositório local para o repositório remoto no GitHub, podemo usar o comando indicado na linha 03
acima:
git push
O comando acima pedirá suas credneciais do GitHub:
Username for 'https://github.com': gilberto-queiroz
Password for 'https://gilberto-queiroz@github.com':
E, em seguida, apresentará o resultado da operação:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 379 bytes | 379.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/gilberto-queiroz/ser-347
2c270dc..1e6c2e8 master -> master
6.1.3.7. Visualizando o histórico de modificações de um arquivo
TO BE DONE!
6.1.3.8. Trabalhando com forks
de um repositório
TO BE DONE!
6.1.3.8.1. Fazendo o fork
de um repositório
TO BE DONE!
6.1.3.8.2. Sincronizando seu fork
TO BE DONE!
6.1.3.8.3. Fazendo um pull-request
TO BE DONE!