Skip to content

Desafio do dede #13

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "conclusion"]
path = conclusion
url = https://github.com/lucianopf/git-workshop-conclusion
23 changes: 22 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,23 @@
# git-workshop
git-workshop

Workshop de git básico e intermediário para pessoas de TI.

## Pre-requisitos
1. Ter o git instalado na máquina. [Download](https://git-scm.com/downloads)
2. Ter uma conta no github.
3. Ter o git configurado com o seu usuário e email. [Tutorial](https://docs.github.com/pt/github/using-git/setting-your-username-in-git)
4. Criar chave SSH e adicionar no github. [Tutorial](https://docs.github.com/pt/github/authenticating-to-github/connecting-to-github-with-ssh)


## Aulas

1. [Aula 1 - fork, clone e trocar de branches](lessons/lesson-1.md)
2. [Aula 2 - comandos básicos de leitura (status, log)](lessons/lesson-2.md)
3. [Pula 3 - comandos básicos de escrita (add, diff, commit, push)](lessons/lesson-3.md)
4. [Aula 4 - comandos de manipulação de branches (rebase, merge)](lessons/lesson-4.md)
5. [Aula 5 - comandos de manipulação de branches (cherry-pick)](lessons/lesson-5.md)
6. [Aula 6 - comandos de manipulação de branches (revert)](lessons/lesson-6.md)
7. [Aula 7 - comandos de manipulação de branches (fetch, pull)](lessons/lesson-7.md)
8. [Aula 8 - comandos de manipulação de branches (stash)](lessons/lesson-8.md)
9. [Aula 9 - comandos de manipulação de branches (submodule)](lessons/lesson-9.md)
10. [Aula 10 - guia básico sobre interface do Github (aula extra)](lessons/lesson-10.md)
1 change: 1 addition & 0 deletions conclusion
Submodule conclusion added at bccbd2
Binary file added images/clone.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/fork.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/fork_detalhe.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/lesson_7_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/lesson_7_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/lesson_7_3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/rebase_i_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/rebase_i_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/rebase_i_3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/rebase_i_4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 27 additions & 0 deletions lessons/lesson-1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Aula 1 (fork, clone e trocar de branches)

Nessa primeira aula iremos abordar como será a estutura do curso e o como iremos seguir com as aulas.

Para iniciar o curso é necessário criar um fork do repositório e após isso clonar em seu computador.

1. Clicar no botão fork no canto superior direito
![fork](../images/fork.png)

**🚨🚨ATENÇÃO PARA NOSSO WORKSHOP É SUPER IMPORTANTE DESMARCAR A OPÇÃO DE COPIAR APENAS A MAIN 🚨🚨**

![fork](../images/fork_detalhe.png)

2. Clicar no botão Code e copiar o link para clonar (repare que estou usando ssh e não http porém para nosso curso não fará diferença)
![clone](../images/clone.png)

3. Com esa URL em mãos deve-se abrir o terminal e executar o comando `git clone <URL>` e isso irá criar uma nova pasta onde vc está com o nome `git-workshop`.

4. Agora devemos entrar na pasta com `cd git-workshop`.

Agora estamos numa cópia local de um fork de um repositório onde temos total liberdade para interagir e fazer o que quiser. Repare que agora temos uma pasta dentro da atual chamada `.git` e essa pasta é onde o git guarda todas as informações do repositório localmente.

Nesse repositório temos diversas branches já criadas e cada uma representa uma aula do curso.

Para navegar entre as branches podemos usar o comando `git checkout <branch>` e para listar todas as branches podemos usar o comando `git branch`.

Para iniciar a aula 2 devemos executar o comando `git checkout lesson-2` e lá teremos no README a referencia pra próxima aula.
25 changes: 25 additions & 0 deletions lessons/lesson-10.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Aula 10 (Github)

Apesar do foco do workshop ser de git e não de Github, é importante entender como a plataforma funciona e como podemos utilizá-la para colaborar com outros desenvolvedores.

Abaixo estão listados alguns links que podem ajudar na compreensão de como interagir com a interface do Github:


## Básico
- [Criando um novo repositório](https://docs.github.com/pt/repositories/creating-and-managing-repositories/creating-a-new-repository)
- [Clonando um repositório](https://docs.github.com/pt/repositories/creating-and-managing-repositories/cloning-a-repository)
- [README](https://docs.github.com/pt/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-readmes) e [CODEOWNERS](https://docs.github.com/pt/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners)

## Intermediário
- [Lidando com merges](https://docs.github.com/pt/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/about-merge-methods-on-github)
- [Como criar Pull Requests](https://docs.github.com/pt/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request?tool=webui)
- [Dicas sobre Pull Requests](https://docs.github.com/pt/pull-requests/collaborating-with-pull-requests/getting-started/best-practices-for-pull-requests)
- [Como solicitar revisões](https://docs.github.com/pt/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/requesting-a-pull-request-review)
- [Como realizar as revisões](https://docs.github.com/pt/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests)

Revisão de pull requests é um assunto importante de ser estudado e levado em conta para quem deseja trabalhar de forma colaborativa. É importante ter em mente que o processo de revisão envolve pessoas que não necessariamente contem o mesmo contexto do autor do código, portanto é importante ser claro e objetivo nas mensagens e comentários.
Existem diversos artigos na internet que tentam auxiliar na construção e revisão de pull requests mas para um breve resumo acredito que [esse guia de de PRs e revisões](https://github.com/mawrkus/pull-request-review-guide?tab=readme-ov-file) seja um bom caminho a ser seguido.

# Prática 10

Agora que concluímos todas aulas do workshop que tal abrir um pull request do seu fork para o repositório original compartilhando a conclusão com outras pessoas?
27 changes: 27 additions & 0 deletions lessons/lesson-2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Aula 2 (status, log)

Agora que estamos em uma versão do repositório, local é interessante começar a conseguir visualizar o que temos de informação básica pra consulta.

## Status

De forma geral, esse comando da um resumo do estado atual do repositório, ele mostra se temos arquivos modificados, se temos arquivos novos, se temos arquivos deletados, se temos arquivos prontos para realizar commit, se temos arquivos prontos para serem enviados para o repositório remoto, etc...

Para executar o comando, basta executar `git status`. Como não temos nada modificado no momento, não é esperado ter muita informação como resultado desse comando. Mas, logo logo iremos utiliza-lo bastante pra ajudar a compreender o estado do repositório.


## Log

Esse comando é um dos mais importantes do git, ele mostra o histórico de commits do repositório, ele mostra quem fez o commit, quando foi feito, qual foi a mensagem do commit e qual foi o hash do commit.

Para executar o comando basta executar `git log`.

Temos diversas variações desse comando que podemos consultar usando o help `git log --help`.

Atualmente o comando de visualizar logs que mais uso é o `git log --one-line` que traz de forma mais resumida o histórico de commits.
Temos também o comando `git log --graph` que renderiza no terminal uma representação gráfica do histórico de commits e branches.

Obs: é possível configurar o padrão do log usando `git config --global format.pretty oneline` e daí em diante qualquer `git log` será `--one-line`

---

Podemos seguir para a próxima aula na branch `lesson-3`.
61 changes: 61 additions & 0 deletions lessons/lesson-3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Aula 3 (add, diff, commit, push)

Nessa aula iremos aprender os comandos básicos de escrita do git, são eles: `add`, `commit` e `push`.

**No fim desse arquivo teremos um exercício prático antes de seguir para a próxima aula.**

## Add

Quando queremos adicionar um arquivo novo ou modificado ao repositório local precisamos usar o comando `add`, esse comando adiciona o arquivo ao que chamamos de `staging area` que é uma área de preparação para o commit.
Para adicionar o commit basta executar `git add <nome do arquivo>`.
Existem diversas formas de trabalhar com o add e podemos consultar todas elas usando o help `git add --help`.

Por exemplo:
- `git add .`
- `git add -A`
- `git add --edit <arquivo>`


## Diff

Esse comando é usado para visualizar as diferenças entre o `working directory` e o `staging area`, para isso basta executar `git diff`.

De forma geral, usamos muito esse comando pra comparar o estado anterior vs o que estamos modificando. Para instruções avançadas de como usar o diff, podemos consultar a documentação oficial do git [aqui](https://git-scm.com/book/pt-br/v2/Git-Essencial-Visualizando-Mudan%C3%A7as-no-Repository).

## Commit

Após usar o comando `add` para adicionar os arquivos que queremos ao `staging area`, precisamos usar o comando `commit` para criar um commit com essas alterações. Conseguimos utilizar o comando `git status`, aprendido na aula anterior, para inclusive conferir quais arquivos estaremos adicionando no commit em questão.
Um commit é uma forma de agrupar alterações em um ponto específico do tempo, ele é composto por um hash, autor, data, mensagem e um ponteiro para o commit anterior.

Pra mais informações sobre commits, podemos consultar a documentação oficial o git [aqui](https://git-scm.com/book/pt-br/v2/Git-Essencial-Gravando-Altera%C3%A7%C3%B5es-no-Reposit%C3%B3rio).

A forma mais simples de criar um commit, é utilizando o comando `git commit`. Porém, isso irá abrir um editor de texto integrado no terminal e isso pode num primeiro momento, ser um pouco confuso. para evitar que isso aconteça, podemos usar o comando `git commit -m "mensagem do commit"`, dessa forma o commit será criado com a mensagem que passamos como parâmetro, sem a necessidade de usar o editor integrado.

Assim como os demais comandos, o `git commit` também possui algumas opções que podemos consultar usando o help `git commit --help`.

## Push

O comando `push` é utilizado para enviar os commits criados para o repositório remoto. Para isso, basta executar `git push <remote> <branch>`, por exemplo: `git push origin main`.

Obs: por padrão, quando clonamos um repositório, o nome do remote é `origin`. Podemos consultar isso com o comando `git remote -v`.

# Prática 3

Se abrirmos o arquivo `README.md`, podemos perceber que ele está com um erro de digitação na linha da aula 3.
```markdown
3. [Pula 3 - comandos básicos de escrita (add, diff, commit, push)](lessons/lesson-3.md)
```

Vamos corrigir esse problema!
1. Com seu editor de preferencia, abra o arquivo `README.md` e corrija o erro de digitação.
2. Pra visualizar o status em funcionamento digite `git status`
3. Veja o diff das alterações usando `git diff` e confira se está alterando o que planeja.
4. Adicione o arquivo ao `staging area` usando o comando `git add README.md`.
5. Execute o `git diff` e `git status` novamente pra validar que não há mais diferenças entre o `working directory` e o `staging area`.
6. Crie um commit com a mensagem `feat: fix readme typo` usando o comando `git commit -m "feat: fix readme typo"`. Mas para isso, se lembre de adicionar a alteração realizada, com o comando `git add`.
7. Podemos visualizar o histórico de commits usando o comando `git log` ou `git log --oneline` (eu sempr prefiro o --one-line).
8. Com as mudanças realizadas localmente, precisamos enviar elas para o repositório remoto. Para isso, basta executar `git push origin lesson-3`.

---

Podemos seguir para a próxima aula na branch `lesson-4`.
68 changes: 68 additions & 0 deletions lessons/lesson-4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Aula 4 (rebase, merge)

Nessa aula iremos aprender um pouco mais sobre comandos de manipulação de branches, que são os comandos que nos permitem manipular o histórico do repositório.

Pra entendimento básico sobre esses comandos, precisamos entender primeiro como o git armazena as alterações. O git armazena as alterações como um grafo direcionado acíclico, ou seja, um grafo que não possui ciclos e que possui direção, isso significa que cada commit possui um ponteiro para o commit anterior.

Dado o cenário de trabalho em paralelo, é comum que as branches que utilizamos fiquem desatualizadas. isso acontece porque o git não atualiza as branches automaticamente. Para atualizar uma branch, precisamos usar o comando `git merge` ou `git rebase`.

Esse artigo descreve bem a diferença entre os dois comandos: https://medium.com/@lovepreet013singhhundal/git-merge-vs-git-rebase-d386e1f3cda7

De forma geral, pra visualizar a diferença entre eles, podemos usar o seguinte exemplo:

![merge-rebase](https://miro.medium.com/v2/resize:fit:720/format:webp/1*s9vhZ0Arc0ViAnl9ksy_Ew.png)

No caso do comando `git merge develop`, copiamos com um novo commit as mudança que aconteceram na branch develop, para a branch corrente (no caso feature/login).
No caso comando `git rebase develop`, ajustamos o histórico da linha branch e atualizamos a referência de onde a branch corrente se inicia.

**No fim desse arquivo teremos um exercício prático antes de seguir para a próxima aula.**

## Rebase

O comando git rebase é usado para atualizar o histórico de uma branch, ele é usado para atualizar o histórico de uma branch com base em outra branch.

A sua forma mais comum é `git rebase <branch>`, onde o git irá utilizar o histórico da branch corrente e aplicar as mudanças da branch passada como parâmetro.

O comando rebase também tem algumas variações. A que considero mais importante, seria a `git rebase --interactive <branch>` (ou `git rebase -i <branch>`). Que nos permite manipular o histórico de uma branch de forma interativa, onde podemos escolher quais commits queremos manter, quais queremos editar e quais queremos remover.

Usar o rebase interativo nos permite manipular commits do passado, editar ordem de commits, alterar a mensagem de commits, agrupar diversos commits em um só e até mesmo remover commits.

Exemplo:

![rebase_1](../images/rebase_i_1.png)
![rebase_1](../images/rebase_i_2.png)
![rebase_1](../images/rebase_i_3.png)
![rebase_1](../images/rebase_i_4.png)

[Guia que pode ser útil pra quem quiser se aprofundar no uso de rebase interativo](https://medium.com/@lukz/git-rebase-interactive-e-amend-para-uma-melhor-hist%C3%B3ria-no-seu-projeto-cb2f5c09b161)

## Merge

O comando git merge é utilizado para atualizar o histórico de uma branch, usando como base outra branch.
O uso dele é bem simples, basta usar o comando `git merge <branch>` e o git irá criar um novo commit com as mudanças da branch passada como parâmetro.
Apesar de mais simples que o rebase, o merge pode gerar um histórico de commits mais poluído. Isso acontece, pois ele cria um novo commit com as mudanças da branch passada como parâmetro, mais conhecido como `merge commit`. Por isso para gestão de branches ,eu aconselho o uso do rebase ao invés do merge.

# Prática 4

Obs: é necessário a conclusão da prática 3 para a realização dessa prática.

Na aula passada, tivemos que fazer uma correção no arquivo README.md. Entretanto, essa branch `lesson-4` em que estamos foi, originada da branch `lesson-3` antes da correção. Portanto, não possui o commit de correção que fizemos. Para realizar a correção, iremos atualizar a branch `lesson-4` com as mudanças da branch `lesson-3`, usando o comando `git rebase`.

Para isso, precisamos fazer o seguinte:
1. Vamos executar inicialmente o comando `git log --one-line`, pra visualizar o estado atual do nosso histórico de commits.
Fora as hashes diferentes deve estar proximo a esse modelo:
```text
(HEAD -> lesson-4) feat: lesson-4
(lesson-3) feat: lesson-3
(origin/lesson-2, lesson-2) feat: lesson-2
(origin/main, origin/HEAD, main) feat: lesson-1
Initial commit
```
2. Pra conseguir atualizar a referencia da branch `lesson-3`, precisamos executar o comando `git rebase lesson-3` ou `git rebase origin/lesson-3`.
3. Agora podemos executar novamente `git log --one-line` e conferir se agora o commit `feat: fix readme typo` aparece na `branch lesson-3`, antes da `branch lesson-4`.
4. Para explorar o rebase interativo, podemos também executar o comando `git rebase -i lesson-3` e fazer o reword do commit `feat: lesson-4` para `feat: lesson-4 (rebase, merge)`. (usar como referencia o exemplo do rebase interativo acima)
5. Agora que ajustamos as nossas referencias, podemos fazer o `git push origin lesson-4` para enviar as mudanças para o repositório remoto.

---

Podemos seguir para a próxima aula na branch `lesson-5`.
36 changes: 36 additions & 0 deletions lessons/lesson-5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Aula 5 (cherry-pick)

Eventualmente precisamos reaproveitar commits de outras branches sem fazer merge ou rebase, só trazendo um commit específico de outra branch. Para isso, temos o comando `cherry-pick`.

Referencia mais avançada: https://git-scm.com/docs/git-cherry-pick

**No fim desse arquivo teremos um exercício prático antes de seguir para a próxima aula.**

## Cherry-pick
Esse comando nos permite recuperar um commit específico de outra branch e aplicar na branch atual.
É um comando eventualmente usado quando queremos só trazer algumas poucas mudanças de uma branch.

Por exemplo, quando temos 2 pessoas desenvolvedoras trabalhando em features semelhantes que dependem da mesma base e uma delas termina primeiro, podemos usar o `cherry-pick` para trazer só o commit que cria a base da outra pessoa para a branch atual.

```bash
git cherry-pick <hash do commit>
```

Como esse é um comando que manipula o histórico de commits das branches, é importante ter cuidado ao usá-lo. Pois ele pode gerar conflitos que precisam ser resolvidos manualmente assim como rebase e merge.

Doc exemplificando quando isso acontece: https://www.themoderncoder.com/fix-git-cherry-pick-merge-conflicts/

# Prática 5

Ao fim desse arquivo temos a instrução errada pra seguir pra `lesson-5`, onde o correto deveria ser `lesson-6`. Vamos buscar a correção disso na branch `lesson-5.1` e trazer para a branch atual usando `cherry-pick`.

1. Vamos primeiro usar o `git log --one-line` pra ver o histórico de commits e vamos perceber que só temos 1 commit nessa branch atual
2. Iremos pra branch lesson-5.1 usando o comando `git checkout lesson-5.1`
3. Vamos usar o `git log --one-line` pra ver o histórico de commits e vamos perceber que temos 2 commits a frente da branch `lesson-5` e queremos recuperar o commit `fix: lesson 5 reference` que é o primeiro commit dessa branch.
4. Vamos copiar o hash do commit `fix: lesson 5 reference` e voltar pra branch `lesson-5` usando o comando `git checkout lesson-5`
5. Agora vamos usar o comando `git cherry-pick <hash do commit>` pra trazer o commit `fix: lesson 5 reference` pra branch `lesson-5`
6. Vamos usar o `git log --one-line` pra ver o histórico de commits e vamos perceber que temos 2 commits e o estado correto da branch `lesson-5` com o `lesson-5.md` apontando pra branch `lesson-6`

---

Podemos seguir para a próxima aula na branch `lesson-5`.
Loading