Contribuindo com Projetos Open Source
Tags: opensource, github, git, hacktoberfest
Published: 2021-09-29 22:54:38

Para quem está começando à descobrir o incrível mundo do código aberto (*open source*), quer ser relevante e contribuir de alguma forma mas, não sabe por onde começar.

Neste tutorial, eu tento passar de forma simples os mecanismos básicos para um bom PR (*pull request*).

Alguns pontos importantes devem ser levados em consideração:

1. Ambiente Git;
2. Conta no Github;
3. [Conhecer e curtir a proposta do projeto](#conhecer-e-curtir-a-proposta-do-projeto);
4. [Fork Clone Branch Add Commit Push PR](#fork-clone-branch-add-commit-push-pr);
5. [Sincronizar o fork](#sincronizar-o-fork).

Este tutorial vai ser focado nos pontos 3, 4 e 5. Os dois primeiros são pré requisitos para os seguintes, mas não serão os pontos-chave.

## Conhecer e curtir a proposta do projeto

Antes de tudo, é legal se identificar com a ideia do projeto, gosto de pensar que "sempre curti utilizar as ferramentas A, B ou C. Vi que elas têm código aberto, vai ser massa contribuir!". Até nos repositórios mais simples, é sempre bom estar em harmonia com a finalidade do projeto e gostar de ajudar.

Outro ponto importantíssimo é ler a documentação e os guias de contribuição, cada repositório tem seus *guidelines*, *how do I contribute?*, *contributing.md*... Então, antes de sair abrindo PRs, é essencial consultar como o *pull request* deve ser feito.

Aqui vamos tratar apenas do  fluxo básico (caminho feliz).

## Fork Clone Branch Add Commit Push PR

Estas são as etapas básicas para trabalhar com repositórios, que vai desde a duplicação, modificação até a solicitação de alterações no código original.

### Fork

Escolhido o repositório, é hora de fazer o seu **Fork**!

Um fork/bifurcação nada mais é que uma cópia de um repositório, logo é possível trabalhar e fazer alterações em um repositório bifurcado ("forkado" hahahaha), sem que estas mudanças altere o repo original diretamente.

![fork image](https://i.ibb.co/9g4QSJP/fork-image.jpg)

Feito o fork, haverá um novo repositório criado a partir do original.

É hora de clonar este novo repo!

### Clone

Para trabalhar localmente no projeto, é necessário cloná-lo para o seu ambiente (É possível fazer alterações diretamente no browser pelo github, na maioria das vezes não é tão recomendado).

Dentre as opções, dá para clonar via HTTP, SSH ou GitHub CLI. Escrevi um outro material sobre [como criar e vincular chaves ssh com o github.](https://gist.github.com/gfda/858e71dad5765c564c8a1a7c5f812d5e)

![clone image](https://i.ibb.co/tZzgRbb/clone-image.jpg)

* Clone via ssh:

```console
gustavo@linux:~$ git clone <link-repo-fork>
```

> gustavo@linux:~$ git clone git@github.com:gfda/gfda.git

### Branch

Geralmente, em projetos compartilhados, alterações de código não são feitas diretamente na branch principal (*main*). Então, uma boa prática é criar uma branch(ramificação) específica para receber as mudanças. Cada projeto tem suas regras para criação, padrões de nomenclatura, uso de branchs... Isto reforça a necessidade de estar em sincronia com os guias do repo.

Para entender mais sobre branches, fica o link da documentação do [git](https://git-scm.com/book/pt-br/v2/Branches-no-Git-Branches-em-poucas-palavras).

* Criando a branch:

```console
gustavo@linux:~$ git branch <nome-da-nova-branch>
```

* Mudando para branch:

```console
gustavo@linux:~$ git chcekout <nome-da-nova-branch>
```

> Dica:
> É possível combinar os dois comandos acima em um único comando git.

```console
gustavo@linux:~$ git checkout -b <nome-da-nova-branch>
```

### Add -> Commit -> Push -> PULL REQUEST

Já na nova branch, é hora de trabalhar no código!

Cada repositório tem suas regras de *commits* (ressalto a importância de ler a documentação), mas não é uma boa prática ter grandes mudanças em um único commit/PR. Muitos projetos adotam um *pull request* por commit, então se houver a necessidade de grande alteração de código, quebrar em commits menores (separando por lógica) facilita para quem vai revisar e aumenta as chances de ser aceito.

Após a inserção do novo código, deve ser feita a sequência para aplicar tais mudanças.

Adicionar o(s) arquivo(s) modificado(s) (*Add*), *Commit* com mensagem que sintetize, de forma clara, a mudança.
Por último, é hora de enviar as alterações para o repo remoto (*push*).

```console
gustavo@linux:~$ git add <arquivo(s) alterado(s)>

gustavo@linux:~$ git commit -m <Mensagem da mudança>

gustavo@linux:~$ git push origin <nome-da-nova-branch>
```

Já no GitHub, a alteração será reconhecida e irá trazer a opção de comparar e abrir o PR (*pull request*).

![pull request image](https://i.ibb.co/W5rZwvp/compare-pull-request.png)

Para mais detalhes sobre o [Pull Request](https://blog.da2k.com.br/2015/02/04/git-e-github-do-clone-ao-pull-request/).

## Sincronizar o fork

Agora que já fez o *pull request* (e ele foi aceito! :D), sabendo que já curtiu a proposta do projeto, é interessante manter o fork sincronizado com as atualizações do repositório principal.

O primeiro passo é adicionar o repo principal, com um nome diferente do fork (após clonar o fork com **git clone**, o repositório remoto é nomeado de *origin*), é comum nomear como *upstream*.

```console
gustavo@linux:~$ git remote add upstream <link-repo-principal>
```

Então, basta sincronizar o repo local/fork com o principal:

```console
gustavo@linux:~$ git fetch upstream
```

E, por fim, fazer o *merge* entre as branchs:

```console
gustavo@linux:~$ git merge upstream/<branch-principal>
```

**É ISTO!**

## Dica

Já tá rolando a contagem regressiva para o [hacktoberfest 2021](https://hacktoberfest.digitalocean.com/).

## Autor

[Gustavo Dias A.](https://www.linkedin.com/in/gustavo-dias-alexandre-543568157/)

## Referências

* [Blog DA2k - Git e Github - Do clone ao pull request](https://blog.da2k.com.br/2015/02/04/git-e-github-do-clone-ao-pull-request/)
* [Blog DA2k - Manter repositório do Github forkado sincronizado com o original](https://blog.da2k.com.br/2014/01/19/manter-repositorio-github-forkado-sincronizado-com-o-original/)
* [Github Docs - Fork a repo](https://docs.github.com/pt/free-pro-team@latest/github/getting-started-with-github/fork-a-repo)