O histórico Git deste app até aqui

Prévia grátis 4 min de leitura

Commits recentes, deste app

$ git --version
git version 2.43.0
$ git log --oneline --no-merges -6
61b443d4 Add pt-BR connectors for Array#to_sentence
1ae6550d Finish style pass: Solid Cache: database caching
5de07ca0 Style and facts: Solid Cache: database caching, lessons 1-7
d4b6634e Finish style pass: Mailers: templates & async
0c106c1e Style and facts: Mailers: templates & async, lessons 1-7
95c1f622 Finish style pass: ActiveSupport: extensions & time

Os dois comandos rodaram neste projeto quando este curso foi revisado. Esses seis commits são o trabalho em si: reescritas de aulas e um pequeno conserto no app. O que o --no-merges esconde é como eles chegaram à main. Cada um veio por um pull request. A main registra isso com um commit de merge ("Merge pull request #266 ...") cujo segundo pai é o último commit da branch. git rev-list --count --merges main conta 174 commits de merge entre os 4.092 commits da main. Então este repositório junta branches com merge, mantendo visível no histórico a bifurcação de cada branch. O rebase é o outro jeito de juntá-las, e este curso mostra o que ele faz de diferente.

Um segundo fato, do mesmo repositório

$ git branch -a
  backup-before-reword
+ content/style-pass-junior-71
+ content/style-pass-junior-72
  dependabot/bundler/rspec-rails-8.0.4
* main
  revert-41-dependabot/bundler/pagy-43.3.2
  roadmap/phase-1-security
  vanilla-bookmarks-slice
  remotes/origin/HEAD -> origin/main
  remotes/origin/dependabot/bundler/rails-8.1.4
  remotes/origin/main

Este também rodou neste projeto, cortado nas linhas que valem ser apontadas. A main, marcada com *, é a branch em uso. As linhas marcadas com + são branches em uso em outra worktree. Esta revisão de estilo trabalha numa worktree por curso, cada uma numa branch content/style-pass-junior-N criada a partir da anterior, uma pilha de branches. git branch --merged main mostra que roadmap/phase-1-security, revert-41-dependabot/bundler/pagy-43.3.2 e dependabot/bundler/rspec-rails-8.0.4 já são alcançáveis a partir da main. Duas branches não são: git log main..backup-before-reword --oneline lista dois commits que a main não tem, e o mesmo comando lista um para vanilla-bookmarks-slice. Branches assim são o que o rebase e o merge existem para resolver um dia, e este curso volta a este repositório em vez de a um inventado.

O que "Git merging" já cobriu

Aquele curso anterior tratou de merges fast-forward e de três vias, de como ler e resolver marcadores de conflito <<<<<<< e de git merge --abort. Ele apresentou o git rebase <branch> como um segundo jeito de juntar branches, em que os commits são reaplicados em vez de mesclados e ganham hashes novos. Deu a regra de ouro: nunca faça rebase de commits que já foram enviados para algum lugar compartilhado. E deu uma primeira olhada, em tabela, no git rebase -i: pick, reword, squash, fixup, drop.

Este curso parte de tudo isso. Ele não ensina de novo a regra de ouro nem a tabela de pick/squash/fixup; ele constrói em cima delas.

O que este curso cobre

A aula 2 roda um rebase que esbarra num conflito, resolvido passo a passo, com uma surpresa sobre um commit cuja resolução o deixa sem nada a contribuir. A aula 3 trata de git commit --fixup com git rebase --autosquash, a parte da limpeza do rebase interativo que pode rodar sem editor. A aula 4 trata de git rebase --onto, para mover uma branch para outra base. A aula 5 trata de git stash, uma pilha separada dos commits que esta série só usou até agora num aparte de quatro linhas. A aula 6 trata da diferença entre git stash apply e git stash pop, que muita gente confunde. A aula 7 mostra o que acontece, marcadores de conflito incluídos, quando um git stash pop não consegue aplicar de forma limpa.

Como as demonstrações rodaram

As aulas 2, 3, 5, 6 e 7 rodam os comandos num repositório de rascunho descartável, nunca no deste app, então a saída de terminal citada é real. O comportamento do Git depende da versão, e este curso avisa onde isso importa. Esta máquina roda o Git 2.43.0, e a aula 3 usa um recurso que mudou no Git 2.44. A aula 4 usa exemplos do próprio manual do Git.

Aula 1 de 7 · grátis

Continue com a aula 2

O rebase reaplica um commit de cada vez, mostrado com um conflito

Um rebase para num conflito, é resolvido passo a passo e descarta sem aviso um commit de diff vazio.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...