Boas praticas com Git
Tags: git, productivity, devops, braziliandevs
Published: 2023-03-16 12:17:03

Nesse post trago algumas reflexões sobre práticas e ferramentas git que tem ajudado o meu dia a dia, espero que te ajudem também.

## Simplifique os históricos de commits com git rebase

Quando você tem duas ramificações em um projeto (por exemplo, uma ramificação de desenvolvimento e uma ramificação principal), ambas com alterações que precisam ser combinadas, o git merge é a maneira natural e direta de unificá-las. A *merge* adiciona o histórico de desenvolvimento de uma ramificação como uma confirmação de mesclagem para a outra. Embora isso preserve os dois históricos em detalhes completos, pode dificultar o acompanhamento do histórico geral do projeto. Em alguns casos, você pode querer um resultado mais simples e limpo.

O git rebase também mescla duas ramificações, mas de maneira um pouco diferente. A git rebase reescreve o histórico de commit de uma ramificação para que a outra ramificação seja incorporada a ela a partir do ponto em que foi criada. Isso cria um commit menos ruidoso e mais linear para essa ramificação. Mas também significa que detalhes potencialmente úteis sobre a outra ramificação e o processo de mesclagem são removidos.

Para esse fim, *rebase* é melhor usado quando você tem várias ramificações privadas que deseja consolidar em um único commit limpo antes de mesclá-lo com uma ramificação pública. Dessa forma, você obtém todos os benefícios de  rebase— tornar um histórico de commits mais linear e menos ruidoso — sem ocultar detalhes cruciais sobre o histórico de commits do seu projeto.

## Limpar mesclagens com git merge --squash

Outra maneira de fazer merges e subseqüentes commits menos ruidosos é usando a opção --squash no git merge. --squash pega todos os commits de uma ramificação de entrada e os compacta em um único commit consolidado.

A beleza de uma mesclagem compactada é que você pode escolher como aplicar os arquivos preparados resultantes. Você pode apenas confirmar todo o conjunto de alterações como um ou confirmar alguns arquivos de cada vez em que as alterações estão intimamente relacionadas. Uma mesclagem compactada também é útil se o histórico de confirmação do branch de entrada for útil apenas no contexto desse branch ou se for de um branch privado que será descartado de qualquer maneira.

Assim como no rebase, essa técnica funciona melhor para enviar ramificações internas para o main, mas também é adequada para solicitações pull, se necessário.

## Acelere as buscas de bugs com git bisect

Regressões sutis no código são as mais difíceis de descobrir. Imagine que você acabou de adicionar um teste à sua base de código para perseguir um bug, mas não tem certeza de quando o bug apareceu pela primeira vez e você tem centenas ou até milhares de commits em seu repositório. O git bisect comando permite reduzir bastante a quantidade de código que você precisa pesquisar para encontrar o commit que criou o bug.

Ao habilitar bisect ( git bisect start), você especifica dois pontos em sua base de código para limitar sua pesquisa: um onde você sabe que as coisas estão ruins ( HEAD, normalmente) e outro onde você sabe que as coisas ainda estão boas. bisect verificará um commit no meio do caminho entre o commit ruim e o bom, e permitirá que você execute seus testes. Esse processo de subdivisão binária se repete até que apareça o commit que quebrou as coisas.

git bisect é uma dádiva de Deus para grandes bases de código com históricos de commits longos e complexos, poupando você do trabalho de ter que vasculhar até o último commit na esperança de encontrar seu bug mais cedo ou mais tarde. No mínimo, reduz pela metade a quantidade de pesquisas e testes que você precisa fazer.

## Reaplicar commits com git cherry-pick

Muitos comandos avançados são úteis apenas em circunstâncias estritamente específicas e ignorados com segurança mesmo por usuários moderadamente avançados. Mas quando você se depara com uma dessas circunstâncias específicas, vale a pena conhecê-las.

Considere git cherry-pick. Ele permite que você pegue um determinado commit — qualquer commit, de qualquer branch — e aplique-o a um branch diferente, sem ter que aplicar nenhuma outra alteração do histórico desse commit. Isso é útil em algumas circunstâncias importantes:

- Você fez um commit no branch errado e quer aplicá-lo rapidamente no branch certo.
- Você deseja aplicar uma correção de uma ramificação ao tronco antes de continuar com outro trabalho no código do tronco.

Observe que você tem algumas opções além de aplicar diretamente o commit quando o fizer cherry-pick. Se você passar a --no-commit, por exemplo, o commit escolhido a dedo é colocado na área de preparação do branch atual.

## Organize projetos elegantemente com submódulos Git

Assim como a maioria das linguagens de programação fornece uma maneira de importar pacotes ou módulos, o Git oferece uma maneira de incluir automaticamente o conteúdo de um repositório dentro de outro, um submódulo. Você pode criar um subdiretório dentro de um repositório e preenchê-lo automaticamente com o conteúdo de outro repositório, geralmente referindo-se a um hash de confirmação específico para fins de consistência.

Observe que os submódulos do Git funcionam melhor nas seguintes condições:

- Os submódulos em questão não mudam com frequência ou estão bloqueados para um commit específico. Qualquer trabalho em um submódulo, em vez de um submódulo, deve ser gerenciado separadamente.
- Todo mundo está usando uma versão do Git que suporta submódulos e entende as etapas necessárias para trabalhar com eles. Por exemplo, os diretórios do submódulo nem sempre são preenchidos automaticamente com o conteúdo do repositório do submódulo. Pode ser necessário usar o git submodule update no repositório para atualizar tudo.

## Debugging no Git

Existem várias maneiras de depurar com Git, mas algumas das mais comuns incluem:

- Utilizando o comando "git bisect" para encontrar a commit específica que introduziu um bug no código.
- Utilizando o comando "git revert" para desfazer uma alteração que introduziu um bug.
- Utilizando o comando "git stash" para salvar as alterações atuais sem commitá-las e depois voltar para uma versão anterior do código.
- Utilizando o comando "git log" para verificar o histórico de commits e encontrar a commit específica que introduziu um bug.
- Utilizando o comando "git diff" para comparar as diferenças entre commits e encontrar o que mudou que causou o bug

Esses são apenas alguns exemplos de como o Git pode ser usado para depurar um código. O importante é que o Git é uma ferramenta poderosa e versátil que permite aos desenvolvedores trabalhar de forma colaborativa e garantir a qualidade do código.

## Salvando a vida com git revert

O comando git revert é usado para desfazer as alterações de um commit específico em seu repositório. Ele cria um novo commit com as modificações opostas às do commit original, o que é útil para corrigir erros ou reverter alterações indesejadas. Isso mantém a integridade do histórico do seu repositório, permitindo que você volte a um estado anterior sem perder qualquer trabalho.

Exemplo de uso: git revert <commit> onde <commit> é o código do commit que deseja desfazer.

É importante ter em mente que este comando não remove o commit original, apenas cria um novo commit com as modificações inversas. Além disso, se o commit que você deseja reverter foi feito em uma branch diferente da sua branch atual, é necessário fazer um merge antes de usar o comando git revert.