Primeiros passos em Git e GitHub
Tags: git, github, beginners, linux
Published: 2022-08-16 17:28:26

Link para visualizar no notion: [Notion Link](https://gold-radius-440.notion.site/Git-afee7312c60747f2871110d0098f4412)

# O que é Git e GitHub?

## 1. Git

   Criado pelo Linus Torvalds, mesmo criador do kernel Linux. o Git é um Sistema (open source) de Controle de Verões Distribuído (DVCS). Ele permite que o programador tenha acesso a versões anteriores de um código, visto que armazena todas as alterações feitas nesse código. Isso é muito útil em um trabalho em equipe, pois permite o acesso ao código por qualquer pessoa em qualquer lugar. Ou seja, O Git armazena o histórico desse código.

## 2. **GitHub**

   O GitHub, que é considerado como uma rede social de programadores, é uma plataforma que usa o sitema Git como sistema de controle. É usado para gerenciar códigos e manter a comunicação entre programadores.

### Como criar uma conta no GitHub:

Acesse [https://github.com](https://github.com/) e Inscreva-se / Sign Up.

# Utilizando o Git

## 1. Instalando o Git

Abra seu terminal (Ctrl+Alt+T) e rode o comando: `sudo apt-get install git`

## 2. Configurando o Git

Ainda no terminal, execute:

`git config --global user.name "Seu Nome Aqui"`

e em seguida:

`git config --global user.email “seuemailaqui@email.com”`

## 3. Inicializando um repositório

`mkdir git-course` // cria um novo diretório/pasta chamado git-course

`cd git-course/`  // muda de diretório para git-course

`git init`  // inicializa o repositório git no diretório git-course

## 4. Editar um arquivo

Podemos fazer isso usando o terminal ou um editor de textos do sistema. Meu exemplo será usando o terminal:

`vi Readme.md`

i: começa a editar

Esc: sai do modo de inserção

: (dois pontos): inicia algum comando

w: escrever e salvar

q: sair

wq: salvar e sair

## 5. Add e Status

`git add Readme.md`

outras opções:

`git add .` // adiciona todos os arquivos modificados no stage

`git status` // mostra que o [Readme.md](http://Readme.md) já pode ser comitado

// se você modificar o [Readme.md](http://Readme.md) nesse momento e rodar o comando git status novamente, o git irá apontar uma modificação no arquivo. Nesse caso, rode git add Readme.md novamente.

`git commit -m "Add Readme.md"` // comitar: criar um snapshot/versão do arquivo.

// -m: indicação de mensagem sobre o que você fez no arquivo, para melhor organização.

outra opção: `git commit -am` // adiciona todos os arquivos modificados na área de stage e faz commit dos mesmos.

## 6. Git Log

`git log` // mostra o log do commit (alterações, informações)

`git log —author==”Nome”` // mostra os commits com autor “Nome”

`git shortlog` // mostra autores, quantos commits fizeram e quais foram

`git shortlog -sn` // mostra autores e quantos commits fizeram

- Ao rodar o git log, é possível ver o “commit” e ao lado dele, o hash deste mesmo commit. Com esse mesmo hash, é possível rodar o comando “git show <hash>”, que mostrará o commit indicado.

## 7. Checkout

`git checkout Readme.md` // reseta a mudança feita em Readme.md sem rodar o git add depois.

Se o arquivo [Readme.md](http://Readme.md) for alterado e em seguida executarmos o add, (note que ao rodar um diff aqui, não haverá diferenças), ainda é possível voltar atrás e tirar esse arquivo do stage com:

`git reset HEAD Readme.md` 

Ao rodar um `git diff` agora, será possível visualizar as modificações feitas. 

## 8. Git Reset

`git reset --soft` // Desfaz um commit e retorna o arquivo a staged

`git reset --mixed` // Desfaz um commit e retorna o arquivo a modified

`git reset --hard` // Desfaz um commit (ignora as totalmente modificações feitas) (deve ser usado com bastante cuidado)

## 9. Git remote add

Após criar um repositório no GitHub:

`git remote add origin <endereço-do-repositório-git-hub>`

## 10. Git push

Envia os arquivos, logs, informações presentes para o repositório do GitHub

`git push -u <endereço-final> <endereço-inicial>`

ou seja:

`git push -u origin master`

obs: leia:

[About remote repositories - GitHub Docs](https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls)

[Creating a personal access token - GitHub Docs](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)

ou assista: 

[Willian Justen - 15. Criando chave SSH](https://www.youtube.com/watch?v=7YVQLZp1jb0&list=PLlAbYrWSYTiPA2iEiQ2PF_A9j__C4hi0A&index=15)

como checar sua chave após ter gerado a mesma:

`cd ~/.shh`

`ls`

`cat *.pub`

No GitHub, em settings > SSH and gpg keys, adicione uma nova SSH key

Se após isso modificarmos os arquivos (e commitarmos), devemos rodar o push de novo:

`git push origin master`

## 11. Git clone

No repositório que deseja clonar, vá em Code > SSH > copie o ssh

`git clone <ssh> nome-diretório`

Obs: Ao clonar um repositório de terceiros, você não poderá mandar as atualizações pro GitHub. Apenas se o Repositório tiver sido criado por você.

## 12. Fork

Permite você copiar um projeto, fazer alterações nele e depois enviar um pull request para o criador do repositório, que pode aceitá-lo ou não.

## 13. Branch

Um branch no git é um ponteiro para as alterações feitas nos arquivos do projeto. Branch, do inglês ramo, indica essa ramificação que ocorrerá no arquivo, sem que um ramo necessariamente interfira no outro. Por exemplo: alguém pode estar trabalhando no master enquantro você corrige algum bug no branch x.

`git checkout -b <nome-do-branch>` // criando um novo branch

`git branch` // mostra quais são os branchs do projeto atual e indica em qual branch você está com um asterístico

`git checkout <nome-do-branch>` // troca para o branch indicado

`git branch -D <nome-do-branch>` // apaga o branch indicado

**União dos Branchs:**

1. Merge

Não altera as informações já existentes, pois cria um commit extra para juntar branchs. (Geralmente mais utitizados nos casos de pull request)

1. Rebase

Deixa os branches lineares (aplicando todas as mudanças pra frente da fila). O ruim dele é que reescreve o histórico, mudando a ordem dos commits, o que pode gerar conflitos

[hWillian Justen - 22. Entendendo o Merge](https://www.youtube.com/watch?v=R_kxAnuyQss&list=PLlAbYrWSYTiPA2iEiQ2PF_A9j__C4hi0A&index=22)

## 14. Arquivo .gitignore

É um arquivo que indica ao Git quais arquivos ele deve ignorar.

## 15. Git Stash

- Guarda modificações não comitadas de modo que podem ser acessadas depois.
- Após modificar um arquivo, e rodar:

`git stash`

A modificação será salva como wip (work in progress)

Para aplicar as mudanças:

`git stash apply`

Obs:

`git stash list` // mostra a lista dos stashs

`git stash clear` // limpa o que estiver no stash

## 16. Tags

São usadas para indicar um commit que represente alguma mudança grande no projeto 

- Tag Leve: Aponta para um commit em específico
- Tag Anotada: armazenam um objeto completo no banco de dados do git

Criando uma tag anotada:

`git tag -a <nome> -m <mensagem>`

Versionar uma tag:

`git push origin <nome>`

Versionar todas as tags:

`git push origin --tags`

Deletar uma tag:

`git tag -d <nome>`

Criando uma tag após já ter feito o commit:

`git tag -a <nome> <checksum-do-commit>`

## 17. Git Revert

Como uma alternativa ao reset, o git revert pode ser usado quando você quer desfazer as alterações mas ainda quer manter o commit com o erro, para posteriores estudos.

`git revert <commit-hash>`

## 18. Pull

`git pull`

Checa se o repositório na rua máquina está atualizada em relação ao repositório correspondente no github, e se não, faz a atualização.

## 19. Apagar tags e branches no repositório

`git push origin :<tag-ou-branch>`

Bibliografia:

[Willian Justen: Git e Github para Iniciantes](https://youtube.com/playlist?list=PLlAbYrWSYTiPA2iEiQ2PF_A9j__C4hi0A)

[Receitas de código: Git - O que é um branch](https://receitasdecodigo.com.br/devops/git-o-que-e-um-branch)