Fonte: https://medium.com/cs-note/git-and-github-for-beginners-i-tutorial-263caa01f9c3/

O que é o git e Github ?

O Git

  • É um sistema de controle de versão distribuído gratuito e de código aberto projetado para lidar com tudo, de projetos pequenos a muito grandes, com velocidade e eficiência, além de ser fácil de aprender Ele usa recursos como ramificação local barata, áreas de preparação convenientes e vários fluxos de trabalho.

Curiosidade: A microsoft migrou o seu sistema de controle de versão interna para o Git com o Github, pois somente para o windows há cerca de 4 mil desenvolvedores em todo mundo e o controle de versão da microsoft não estava dando conta.

O Github

  • É um conjunto de repositórios publicados no Git e na internet, ou seja, além de o usuário poder fazer o controle de versão na máquina com o GitHub ele também pode fazer esse controle de versão online em um único repositório protegido por usuário e senha, isso é o Github, ou seja, é um local na internet onde estão os diversos repositórios do Git em todo mundo. O github é usado por 28 milhões de pessoas, a plataforma é o maior repositório de código de programas do mundo.

Em 2018 a Microsoft comprou GitHub por US$ 7,5 bilhões.

Configurando o git

O git guarda suas informações em três lugares.

  * git config (do sistema como um todo)
  * git config (do usuário)
  * git config (do projeto)

Configure informações de usuário para todos os repositórios locais, como o nome e o email que você quer ligado às suas transações de commit.

Definindo configurações

de usuário

git config --global user.name "nome do usuario"

de e-mail

git config --global user.email "endereco-de-email"

do editor

git config --global core.editor "nome do editor"

Retornando as configurações

do usuário

git config user.name

do e-mail

git config user.email

de tudo

git config --list

Iniciando uma repo

Agora que já temos o git instalado e configurado iremos criar um repositório (repo, pasta) no qual colocaremos os arquivos de nosso projeto.

Criando uma repo.

mkdir git-learn

entrando na repo git-learn

cd git-learn

reconhecendo a repo.

O comando git init faz com que a repo criada seja parte do ecossistema do git, ou seja, ele inicializa a repo e é o responsável por fazer com que o ecossistema do git enxergue todas as mudanças que ocorrerão na repo.

git init 

o que há dentro do diretório git-learn ?

ls -la

Como abamos de inicializá-lo o diretório possui apenas um subdiretório .git.

o que há dentro do diretório .git ?

ls 

Aqui estão algumas pastas responsáveis por:

  • config : Configuração do Repositório.
  • HEAD : Branch padrão.
  • branches: Branches existentes do projeto.
  • description: Descrição das branches.
  • hooks: Catilhos para fazer certas ações,

e toda vez que inicializamos uma repo o git irá criar essas pastas para guardar todas as informações importantes para o bom gerenciamento da repo.

Workflow dos arquivos.

Depois de algum tempo trabalhando com o git “+” github, você irá perceber que há um fluxo de trabalho no qual o usuário o compreende naturalmente, pois trata-se de estágios bem defindos que estabelecem um tipo de ciclo de vida dos arquivos.

O workflow dos arquivos pode ser entedido como um ciclo de vida dos arquivos em quatros estágios bem definidos.

  • Untracked
  • Unmodified
  • Modified
  • Staged
Fonte: https://git-scm.com

Figure 1: Fonte: https://git-scm.com

Untracked

É o momento em que o arquivo acabou de ser adicionado no repositório, mas ainda não foi visto pelo git, ou seja, o git não reconhece em seu repositório em nenhuma versão a existência deste arquivo.

Unmodified

Depois que um arquivo é adicionado ele passa a ser considerado como não modificado, ou seja, ele já existe no git mas ainda não sofreu modificações.

Modified

Após um arquivo ser reconhecido pelo git podemos então editá-lo e todo arquivo editado passa ao status de modificado.

Staged

Depois do arquivo ser modificado podemos colocá-lo em uma área onde será criada uma versão, a qual é chamada de staged.

Commit

Os arquivos comitados passam ao status de unmodified, pois uma vez que a versão de um arquivo foi criada e comentada nada foi alterado.

Workflow + comandos

Na Figura (2) PJ Wang mostra como os comandos básicos do git, git add, commit, push, fetch, merge, pull e rebase, fazem os arquivos transitarem dentro do workflow.

Imagem retirada do site https://medium.com/cs-note

Figure 2: Imagem retirada do site https://medium.com/cs-note

Além disso, da Figura (2) entendemos qual comando utilizar para levar um arquivo de um determinado estágio a outro até o momento em que é utilizado o comando git push para transição do repositório local (git) para o repositório que está remoto na web (github).

Status do arquivo

Antes de fazer modificações nos arquivos da repo, é altamente recomendado que você dê o comando git status que irá retornar os arquivos de acordo com o estágio no(s) qual(is) se encontra(m) no worflow. Por exemplo, suponha que após digitarmos git status observemos que há um arquivo no estágio untracked o que implica que ainda não podemos commitá-lo, sendo necessário primeiramente subir esse arquivo para o git usando o git add [nome do arquivo].

git status

Serve pra reportar como está o meu repositório neste momento.

git status

Se não existir nada ainda em seu repositório irá aparecer a seguinte mensagem:

git stauts

Figure 3: git stauts

  • On branch master: significar que você está na branch master

  • Inicial commit : ainda não tive nenhum commit

  • nothing to commit: não tenho nada para commitar

Como ainda não há arquivos em nosso repositório, iremos criá-lo usando um editor de texto vim.

vim Readme.md
Criando um arquivo

Figure 4: Criando um arquivo

  • Criado o arquivo Readme.md criado vamos agora inserir um texto nele.
  • Pressione a tecla i para passarmos ao modo de inserção.
  • Digite a frase Curso básico de gite github.
  • Pressione ESC para voltar ao modo de comando.
  • Digite :wq e sem seguida pressione o Enter.

Obs: O comando (:wq) é utilizado para salvar (salve) o arquivo e sair (quit) do Vim.

Agora podemos verificar novamente o status

git status
status untracked cycle life

Figure 5: status untracked cycle life

Observe que o arquivo Readme.md está com seu status em untracked, ou seja, ele acabou de ser criado porém o git ainda não o reconhece, iremos adicioná-lo usando o comando git add [nome do arquivo] e em seguida digitaremos novamente o git status.

git add

Faz o snapshot de um arquivo na preparação para versionamento.

git add Readme.md
git add new file

Figure 6: git add new file

A figura mostra que Temos um novo arquivo reconhecido pelo git e que ele está no estágio unstage, isto significa que agora o arquivo já pode ser commitado e preparado para criarmos uma versão dele, a snapshot.

Commitando arquivos

O comando commit é usado no momento em que você quer avisar ao git que ele já pode criar uma image (snapshot,versão) do(s) arquivo(s) que está(ão) no repositório.

Na Figura (7) observe que o git nos mostra os arquivos de acordo com o estágio dentro do ciclo de vida do arquivo, os arquivos

  • commit_ars.png
  • very_status.png
status and cycle file

Figure 7: status and cycle file

estão no estágio untracked, ou seja, ainda não foram reconhecidos pelo ecossistema do git e, para isto, precisamos adicioná-los através do comando git add [nome do arquivo]. Já os arquivos,

  • Readme.md
  • github.Rmd

são reconhecidos pelo git, porém como foram modificados precisam ser adicionados git add e commitados git commit -m [nome do arquivo] .

Arquivos a serem commitados

Figure 8: Arquivos a serem commitados

Primeiro commit

No texto do commit é importante escrever o que realmente ocorreu com o arquivo, para que caso tenha que retornar a uma determinada versão você se lembre facilmente da alteração que foi feita, isso contribui em muito para o desenvolvimento de código em equipe.

Commitando o arquivo Readme.md.

git commit -m "Add Readme" Readme.md  

Na Figura (9) Observe que o commit foi criado na [branch master] com a hash 11ed80d e com o seguinte comentário “primeiro commit”.

primeiro commit

Figure 9: primeiro commit

Após o commit de todos os arquivos, sobrou apenas o arquivo github.Rmd, como é mostrado na Figura (10).

status depois do primeiro commit

Figure 10: status depois do primeiro commit

Visualizando os logs

A visualização dos logs nos permite ter acesso ao histórico das modificações realizadas em todos os arquivos da(s) repo(s).

Git log

O comando git log lista os arquivos que foram versionados.

git logs

A Figura (11) mostra o output após o comando git log e com isso podemos ver quais os arquivos sofreram modificações, neste caso são:

  • swp
  • github latex-referencias
  • imagens
  • projeto
  • gitignore
  • primeiro commit
visualizando os logs

Figure 11: visualizando os logs

Perceba que após o termo commit há um código alpha numérico denominado por hash, ele será útil quando desejamos verificar a(s) modificação(ões) ocorrida(s) em um determinado arquivo. Além disso, também é retornado o usuário que realizou a(s) modificação(ões) e em qual(ais) data(s) ela(s) ocorreu(am).

Filtrando os logs

Uma das formas de filtrar os logs é selecionando o author através do comando git shortlog. No exemplo abaixo observa-se que ao setar author = “sergio” há seis itens.

$ git shortlog --author="sergio"
Sergio (6):
      primeiro commit
      gitignore
      projeto
      imagens
      github latex-referencias
      swp

Na figura (12) Outra forma interessante de visualizar os logs é utilizar o comando git log –graph, observe.

Visualizando os logs com git log --graph

Figure 12: Visualizando os logs com git log –graph

Nesta forma são retornados todos os logs e as hash’s do usuário o que irá facilitar na busca de verificações de commits usando a hash, como será mostrado na figura (13).

Revise o histórico

Verifique a evolução dos arquivos do projeto.

git log --follow [arquivo]

Liste o histórico de versões para o branch atual.

git log --follow [arquivo]

Lista o histórico de versões para um arquivo, incluindo mudanças de nome

Usando a hash para ver o commits

O comando git show seguido pela hash de determinado commit nos mostra qual a alteração que houve ao commitar o arquivo.

git show [hash]
Verificações de commit

Figure 13: Verificações de commit

Usando o git diff

O comando git diff permite a nós visualizarmos as mudanças feitas nos arquivos antes de fazer o commit e salvar a versão, ou seja, quando o arquivo encontrar-se no estágio staged.
## Exemplo:

Pelo git bash iremos criar o arquivo Comando_diff.md e vamos trabalhar nele.

git subl Comando_diff.md 

Agora digite: ‘entendendo o comando diff.’

O que foi mudou ?

git diff
Verificações de commit

Figure 14: Verificações de commit

Observe que git coloca um sinal de ‘+’ indicando que houve alguma modificação isso nos ajuda no sentido de que podemos visualizar e revisar as mudanças antes de enivar para que o git salve uma versão, por isso é sempre interesse utilizar o git diff antes de realizar o commit.

Opções do git diff

git diff --name-only

Nesta opção o git retorna somente o nome do arquivo modificado.

git diff --staged

Mostra a diferença entre arquivos preparados e suas últimas versões.

git diff [primerio-branch]...[segundo-branch]

Mostra a diferença de conteúdo entre dois branches

Faça mudanças

No git há uma série de comando que permite ao usuários realizar mudanças quando for necessário, tais mudanças vão desde um commit até a remoção completa do arquivo independente de qual estágio esteja dentro do workflow.

Git checkout

O git checkout é utilizado para nos ajudar a desfazer coisas, por exemplo, suponha que acabamos de realizar alguma modificação em um arquivo e ai, antes de commitar digitamos o comando git diff, na hipótese de termos feito algo errado ou que apenas não gostamos da modificação realizada podemos resetar o arquivo com o comando git checkout que o arquivo voltará ao seu status de conteúdo antes da modificação.

git diff checkout [nome do arquivo]

Git reset

O comando git reset tem três variações:

  • git reset –soft: reset o commit mas deixar o arquivo no staged para ser commitado novamente.
  • git reset –mixed: reset o commit mas volta o arquivo para antes do unstaged, modified.
  • git reset –hard: reset todo o arquivo como se o commit sido feito.

As três formas de uso do git reset, soft, mixed e hard, são acompanhadas da hash que indica que o reset será dado nas modificações posteriores a ela.

Altere arquivos versionados

Remove o arquivo do diretório de trabalho e o prepara a remoção.

git rm [arquivo]

Remove o arquivo do controle de versão mas preserva o arquivo localmente.

git rm --cached [arquivo]

Muda o nome do arquivo e o prepara para o commit

git mv [arquivo-original] [arquivo-renomeado]

Mudanças em grupo

No git é possível utilizar as branches para nomeaar uma série de commits e combinar os esforços completos.

Liste as Branches.

git branch

Lista todos os branches locais no repositório atual.

Cria uma nova branch

git branch [nome-do-branch]

Muda de branch

git checkout [nome-do-branch]

Muda para o branch especificado e atualiza o diretório de trabalho.

Junta as branches

git merge [nome-do-branch]

Combina o histórico do branch especificado ao branch atual.

Exclua a Branch

git branch -d [nome-do-branch]

Exclui o branch especificado

O repositório remoto Github

No github,

  • Crie um repositório com o mesmo nome do nosso repositório local
  • Em seguida, gere uma chave SSH em nosso computador de trabalho e adicioná-la ao github.

Obtenha uma URL existente

Com o Git Bash criamos o repositório learning_git em ~/documents/estudos de analytics.

O git clone

Se um projeto já foi configurado em um repositório central, o comando git clone é a maneira mais comum para os usuários obterem um clone de desenvolvimento local. Como git init, a clonagem é geralmente uma operação única. Depois que um desenvolvedor obtiver uma cópia de trabalho, todas as operações de controle de versão serão gerenciadas por meio de seu repositório local.

git clone [repo url]

Suprima o monitoramento

Ignore arquivos e diretórios temporários

  • *.log
  • build/
  • temp-*

Um arquivo de texto chamado .gitignore suprime o versionamento acidental de arquivos e diretórios correspondentes aos padrões especificados.

git ls-files --others --ignored --exclude-standard

Lista todos os arquivos ignorados neste projeto.

Sincronize mudanças

Registre um repositório remoto e troque o histórico de versão.

git fetch [nome-remoto]

Baixe todo o histórico de um repositório remoto.

git merge [nome-remoto]/[branch]

Combina o branch remoto ao branch local atual.

git push [alias] [branch]

Envia todos os commits do branch local para o GitHub.

git pull

Baixa o histórico e incorpora as mudanças.

Avatar
Sérgio Carvalho
Cientista de Dados