bsky: leandronsp.com Profile picture
Dec 4, 2022 36 tweets 18 min read Read on X
Entender os fundamentos de Git é necessário para quem não quer se deixar dominar pela ferramenta.

Nesta 🧵 vou tentar explicar as estruturas fundamentais do Git e como estas se relacionam com os comandos que usamos no dia-dia.
Os principais componentes do Git são:

.git/objects
.git/refs
HEAD
Começamos pelo Object database, que é basicamente onde o Git armazena todos os seus objetos.
Mas que tipo de database é este? SQL? NoSQL?

Vamos primeiro persistir um objeto utilizando o comando `git hash-object`, que:

* permite input do STDIN ou arquivo normal
* retorna uma hash SHA-1
* persiste com a opção `-w`
Podemos reparar que Git persistiu nosso objeto em .git/objects como era esperado, utilizando a hash que foi devolvida como "chave" de acesso
Se temos a hash, conseguimos resgatar o valor original do objeto?

Sim, com o comando `git cat-file`.

Temos no Git, então, um database baseado em chave-valor, com suas chaves em formato SHA-1.
O comando `cat-file` permite passar a opção `-t` que devolve o tipo do objeto, que neste caso, é um blob.
Uma vez com os blobs persistidos, como podemos agrupá-los, adicionar metadados e criar snapshots?

Precisamos promover estes blobs para um uma área de "Stage", com o comando `git update-index`
Podemos adicionar quantos blobs quisermos ao índice utilizando o `update-index`.

Mas como agrupá-los para que sejam promovidos? O Git permite criar uma "árvore" com esses blobs, através do comando `write-tree`.

Note que novos objetos foram criados, que tipos são esses objetos?
Estes objetos são do tipo "tree", que servem para agrupar diferentes blobs e inclusive outras trees quando utilizada a opção `prefix`
E se quisermos adicionar metadados a partir das trees, como por exemplo o autor do trabalho, a data e uma mensagem descritiva?

Sim, estamos falando do comando `git commit-tree`, que promove uma tree de modo a que esta possa ter metadados.
Commits também são objetos, e portanto, possuem uma chave SHA-1 para representar cada commit.
É possível também criar commits com referência a outros commits (parents).

Repare que o objeto commit tem referência para a tree e para o parent (outro commit criado a partir dele).
Como percorrer toda a "rede" de commits a partir do último commit, indo pelos parents, trees até chegar nos blobs?

O comando `git log <sha1>` faz exatamente isso, percorrendo todo o grafo e trazendo tudo de acordo com a linha do tempo.
Git é baseado em grafos.

Manipular objetos no Git é como manipular ponteiros em grafos.

Blobs representam arquivos. Trees representam conjuntos de blobs e outras trees. Commits representam metadados com referência a trees e outros commits.
Executar toda hora `git log <sha1>` não é eficiente pois temos de decorar as hashes.

Mas Git traz uma facilidade para isto, que são referências para commits, que ficam em .git/refs.

Através do comando `update-ref`, criamos referências que são basicamente commits "com nomes".
Soa familiar? Estamos falando de branches.
Mas o quê acontece se não passar argumento (sha-1) para o comando `git log`?

Como o Git sabe que a minha branch atual é a "main"?
Acertou, é aqui que entra o tal do HEAD.

Com o comando `git symbolic-ref` podemos mudar o ponteiro do HEAD, que é uma referência simbólica para a branch atual de trabalho.

O HEAD pode ser qualquer branch ou até mesmo um SHA-1 (no modo detached)
Trocar o HEAD é uma simples chamada ao `symbolic-ref`.

Neste exemplo, fico intercalando entre a branch "main" e branch "fix".
Agora que sabemos que tudo em Git é manipulação de ponteiros, vamos associar este conhecimento com os comandos do dia-dia.

Começando pelo `git add`, que basicamente é a junção do `hash-object` com `update-index`.
O `git commit` é basicamente o `write-tree` (uma vez que há objetos no index) seguido do `commit-tree`, que adiciona informações como autor, date e message.
Já o `git checkout` é literalmente o `symbolic-ref`, que muda o ponteiro (branch) do HEAD.

Com algumas opções adicionais que trazem mais versatilidade.
O comando `git reset` permite mudar o ponteiro da branch, tal como o `update-ref`.

Sem a opção `--hard`, todos os arquivos que divergem ficam em stage a espera de novo commit.
E o merge?

Bem, é super tranquilo entender. Supondo que temos uma branch main e outra "fix", onde fix está 1 commit à frente.

O merge basicamente faz move a branch main para o mesmo commit da branch fix (fast-forward).
E quando a main tem algum commit à frente da branch fix? Neste caso, não é possível fazer fast-forward.
Mas o Git é bem inteligente e trata desta forma:

* Tira snapshot do parent em comum com ambas as branches
* Tira snapshot do commit da branch de destino
* Tira snapshot do commit da branch de origem

E, por fim, cria um commit adicional de "merge". Sim, é o "three-way" merge.
Onde entra o cherry-pick? Com cherry-pick de um commit da branch main, o Git:

* move o ponteiro da branch fix
* aplica o commit da branch main como último commit na branch fix
E quando queremos aplicar as mudanças por cima de outra branch?

Entra o rebase.

Neste cenário, com rebase a partir da branch fix, basicamente:

* muda o ponteiro p/ o HEAD da main
* faz cherry-pick dos commits q sobraram
* por último muda ponteiro para o último do cherry-pick
E as branches remote?

Também são referências.

O comando `git fetch` faz download da branch do server e sincroniza com uma branch "upstream" relacionada à tracking branch (local).
Por serem branches, é possível fazer merge a partir das branches upstream com as locais.

Geralmente, por estarem sempre "atrás", merges com branches upstream são feitos no modo fast-forward.

O comando `git pull` facilita a vida, fazendo fetch + merge para nós.
"Okay, fiz meu trabalho e agora quero mandar de volta para o server. Como atualizo a branch upstream?"

Não precisa, o comando `git push`, além de atualizar o server, também sincroniza a branch tracking local com a upstream.
Assim como branches, tags também são referências com "nome".

Mas são imutáveis, ou seja, para mudar a referência de uma tag é preciso apagá-la e criar outra com mesmo nome.
Como o @coproduto destacou, nesta thread foram apresentados os comandos "plumbing", que foram os building blocks do Git, e como se relacionam com os comandos "porcelain", usados no dia-dia.

@coproduto E pra quem tiver interesse, o próprio guia oficial do Git é bem completo, se ler os primeiros capítulos já cobre muita coisa boa para dominar mais o Git.

Com destaque ao capítulo 10 que fala dos "internals" que eu trouxe à thread.

git-scm.com/book/en/v2/Get…

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with bsky: leandronsp.com

bsky: leandronsp.com Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @leandronsp

Jan 24
Não costumo dar dica de inglês pq não sou professor, mas tá aqui oq funcionou pra mim lá atrás qdo tudo era mato e não tinha internet nem dinheiro pra pagar cursinho de inglês.

Short🧵

(tldr; imagem já é pequeno spoiler) Image
Disclaimer

Assumindo que vc, assim como
eu, não nasceu com o c# virado pra lua e nao teve acesso a bons cursos de ingles com a devida frequencia. +
Basics

Pra correr atras do preju, esse livro é gold. Mesmo.

Ajuda a dar o up necessario na gramatica.

Cada pagina é uma lesson diferente com explicacao e exercicios. That’s enough, tudo oq nós mortais precisamos. Next.

+ Image
Read 11 tweets
Sep 6, 2023
Alguns ajustes no NGINX e PostgreSQL e minha versão Ruby ganha um aumento de tput que garante 46k inserts.

"Ajuste pra cima", eles dizem.

Não. É pra baixo.
As queries são rápidas, ñ preciso floodar a stack toda com mtos requests à espera: latência gera custo.

Detalhes na 🧵
Image
Image
TL;DR

- API com I/O assíncrono
- NGINX com 256 worker connections
- NGINX com least_conn para não jogar mais requests em upstream muito ocupado
- PostgreSQL com 30 max connections e tbm com 30 acessos simultâneos ao I/O
- Connection pool de 15 em cada API
Image
Image
Configuração do NGINX

Se eu abrir a torneira no NGINX pra sei lá, 10 mil conexões, ele vai tentar jogar o máximo possível no socket.

Eu teria que ter capacidade de vazão na API... +
Read 19 tweets
Aug 26, 2023
pessoal, apesar da zuera do Java não ter estado no TOP 15 da @rinhadebackend (kkkkk), queria deixar aqui algumas impressões sobre aspectos de concorrência em sistemas,

e que a natureza do desafio não coloca nenhuma lang em demérito, apesar da _zuera never ends_™️

as always, 🧵
quando um programa ou processo precisa realizar alguma computação, este é colocado pelo sistema operacional (SO) em uma fila,

tão logo a CPU fica disponível, o processo é atribuído à CPU e ganha uma fatia de utilização definida pelo escalonador do SO, que faz +
a troca de contexto entre diferentes processos na CPU.

processos não compartilham memória a princípio, e acontece que dentro de certos processos, podem ainda ser utilizadas outras estruturas menores de concorrência no SO, que compartilham memória, tbm chamadas de threads +
Read 23 tweets
Jul 11, 2023
xargs for the rescue

nesta pequena 🧵, iremos ver como utilizar xargs pra resolver o problema ali proposto pelo Seraphini. sem precisar de ferramentas adicionais, xargs funciona out-of the-box em qualquer sistema UNIX-based.

cada opção do comando será explicada ao detalhe 🔎 https://t.co/MLAVd4XLyI
um background super simples

vamos partir com a premissa que temos uma função simples que dorme meio segundo e será nosso "background job"
pretty neat. agora, vamos utilizar brace expansion no Bash para gerar um range, por exemplo, de 1 a 10.

cara número no range será usado posteriormente como argumento na função `process $1`
Read 15 tweets
Apr 17, 2023
Já ouviu falar de concorrência e paralelismo, mas os conceitos ainda dão nó quando as pessoas falam de threads, coroutines, canais, async etc?

Nesta 🧵, vou tentar trazer alguns pontos essenciais, passando por breve história dos computadores modernos e sistemas operacionais.
🔵 Cartões Perfurados

Nos anos 40 surgiram computadores capazes de interpretar programas que eram "persistidos" em cartões físicos perfurados.

Esses computadores eram lentos e executavam um programa por vez, ou seja, não permitiam o enfileiramento de programas. +
Algumas décadas mais tarde, computadores ficaram menores e mais rápidos.

Cartões perfurados foram substituídos por métodos mais sofisticados de armazenamento, tais como fita magnética. +
Read 42 tweets
Feb 22, 2023
Finalizei minha saga aprendendo (e escrevendo sobre) Tekton CI/CD.

Esta série de artigos é um ciclo completo e automatizado de entrega de uma aplicação simples que tá no Github.

Aqui nesta 🧵 vou dar um overview de cada artigo com o devido link.

0/6

#Kubernetes #Docker
Um pequeno disclaimer

Embora Tekton sirva para rodar o próprio CI no Kubernetes, os conceitos aqui apresentados podem ajudar a *entender melhor* de sistemas CI/CD no geral, inclusive os que trabalhamos no dia-dia, tais como Github, Gitlab, CircleCI etc

+
O primeiro foi uma introdução aos 3 principais componentes do Tekton: Step, Task e Pipeline.

São peças importantes que têm sua lógica fundamentada em diversos outros sistemas de CI/CD.

1/6

dev.to/leandronsp/tek…
Read 14 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(