Guia de Git do Beej
(beej.us)- Uma página de guia que oferece versões distribuídas em HTML e PDF em vários formatos para leitores que querem aprender ou consultar Git
- O próprio guia parte do princípio de que pode conter erros, e sugestões de correção sobre conteúdo incorreto de Git são recebidas por e-mail
- As versões em HTML podem ser escolhidas de acordo com o ambiente de leitura: dividida, página única, widescreen, ZIP etc.
- Os PDFs podem ser baixados em combinações de US Letter e A4, frente única e frente e verso, com destaque de sintaxe ou em preto e branco
- Tradutores e autores podem clonar todo o material no GitHub e seguir o README para trabalhar nele
Formatos de distribuição para leitura
-
HTML
-
PDF
- US Letter, frente única, destaque de sintaxe
- US Letter, frente e verso, destaque de sintaxe
- A4, frente única, destaque de sintaxe
- A4, frente e verso, destaque de sintaxe
- US Letter, frente única, preto e branco
- US Letter, frente e verso, preto e branco
- A4, frente única, preto e branco
- A4, frente e verso, preto e branco
Sugestões de correção e materiais-fonte para trabalho
- O guia reconhece a possibilidade de conter erros e recebe sugestões de correção por e-mail
- Tradutores e autores podem clonar o repositório no GitHub e seguir o README
1 comentários
Comentários do Hacker News
Se encontrarem algo errado, mandem. Eu mesmo organizo e corrijo — Beej
:cq. Ele sai com um status de encerramento diferente de 0, o que pode impedir o Git de concluir o commit ou a operaçãoEm https://beej.us/guide/bggit/html/split/branches-and-fast-for..., diz que “o branch padrão é main” e que “antigamente era master, e repositórios antigos ainda têm master”, mas isso não está correto. O Git ainda usa
mastercomo padrão, apenas permitindo que isso seja alterado para futurosgit initviagit config --global init.defaultBranchFonte: https://github.com/git/git/blob/bc204b742735ae06f65bb20291c9...
Além disso, a expressão “repositórios antigos” passa a mensagem errada. Foi o GitHub que decidiu essa mudança, outros lugares acompanharam, e o próprio Git passou a permitir a configuração acima; não é uma questão de repositórios novos/antigos, mas mais uma questão de preferência
É uma boa forma de manter branches sem se embolarem entre si, sem o incômodo de lidar com stash
Beej's Guide to Network Programming e Beej's Guide to Unix IPC, que li quando era adolescente, eram acessíveis e ao mesmo tempo profundos, e tiveram grande influência no tipo de programador que eu me tornei depois
[0] https://beej.us/guide/bgnet/
[1] https://beej.us/guide/bggit/
Comprei de segunda mão um Slackware Linux Unleashed que vinha com CD-ROM, e ele tinha exemplos de networking em C; aqueles códigos me deixaram confuso, o que me levou a encontrar o site de networking do Beej. A partir daí me aprofundei ainda mais, entrando numa toca de coelho enorme, e eu vivia indo a várias livrarias atrás de livros de programação
Depois que comprei o excelente livro de referência do Richard Stevens, não olhei mais para trás, e até hoje sou grato ao Beej por ter ajudado a tornar essa paixão possível
select, traduzi o guia de redes do Beej para o italiano porque queria deixar algum port scanner — talvez “grabb”? — mais rápido. Bons temposEra a época em que eu salvava páginas para ler offline para meu pai não ficar bravo com a conta de telefone, e quando o código funcionava parecia uma validação que superava fracassos e rejeições anteriores da vida. Havia uma alegria enorme em enviar mensagens de um computador para outro
Ao ver “comando antigo:
git checkout”, eu nem sabia que existiagit switch, nem quegit checkoutera considerado uma alternativa antiga. Me senti velhoFaz quase 10 anos que comecei a aprender Git, então vá lá, mas é estranho pensar que alguém aprendendo Git hoje possa ficar confuso sobre por que eu uso
git checkout. Parece que estou usando uma expressão antiquadaVoltando ao texto, acho que este guia teria sido muito útil quando eu estava aprendendo. É fácil de acompanhar e aborda bem as perguntas comuns
Também guardo com carinho a lembrança de ter me assustado com meu primeiro conflito de merge, desistido, e depois dado voltas para evitar conflitos
git switché um comando relativamente novo e foi lançado pela primeira vez em 2019Há uma discussão de 2021 e outra de algumas semanas atrás; nesta última, também é mencionado que, na documentação,
git switchainda é considerado um recurso experimentalhttps://news.ycombinator.com/item?id=28024972
https://news.ycombinator.com/item?id=42649858
git checkoutainda é visto como uma “alternativa antiga”. Da última vez que verifiquei,switchainda era experimental, e eu nem cogitei sair do fluxo de trabalho e dos comandos que aprendi quando comecei a usar Git, há cerca de 15 anosTudo que quero fazer ainda funciona exatamente igual,
git checkoutcontinua fazendo as mesmas coisas de antes, e não tenho problemas para colaborar com outras pessoas usando Git; então não vejo motivo para mudar meu fluxo de trabalhoO simples fato de ser necessário um guia com mais de 30 partes explicando como usar Git já faz parecer que o Git perdeu de vista o panorama geral
Commits são snapshots de uma árvore e têm uma lista de ancestrais. Normalmente é um, mas nem sempre. Tags são rótulos imutáveis para commits, e branches são rótulos mutáveis para commits. O índice é um pequeno proto-commit em andamento que você preenche com
addantes de fazer o commitIsso é Git. Se quiser saber mais, não leia um guia; pesquise coisas como “como mudar para um commit específico do Git sem afetar a árvore”, “como commitar apenas alguns dos arquivos alterados”, “como copiar commits de outro lugar para a árvore atual”
As abstrações básicas são minimalistas e fáceis. O que você quer fazer com essas abstrações é que é sofisticado e complexo. Aprenda as primeiras e pesquise o segundo; não precisa ler um guia
git clone,git checkout,git pull,git add+commit+push,git reset/rebaserebase -ivem com instruções sobre o que cada comando faz, e bastam alguns parágrafos para explicar como formatar a saída degit logconforme preferências e compromissos. Em geral, considero que os comandos voltados ao usuário também incluem coisas bem variadas comogit gc,git fsckegit rev-parseOs comandos de baixo nível são definitivamente mais obscuros e, por si só, fazem muitas coisas que nem sempre são fáceis de realizar com comandos voltados ao usuário otimizados para casos de uso comuns
Em resumo, o Git é grande, até gigantesco, mas para a maioria dos desenvolvedores uma parte considerável do que ele oferece fica longe do caminho principal
O assustador é o guia ser tão longo assim
Sei que os guias do Beej em geral são abrangentes, mas eu não tinha uma noção real da enorme quantidade de sutilezas do Git até ver isso
Com Jujutsu, acho que seria um guia muito mais fino, ou pelo menos um guia em que uma pessoa conseguiria descobrir e aprender as coisas com mais facilidade
Sinto que este guia cobre só uns 10% do Git, mas espero que cubra 90% do uso comum
No trabalho, uma ou duas vezes por ano, conduzo um curso de 2 horas de introdução ao modelo de dados do Git
Entramos de fato no diretório
.git, descompactamos arquivos e mostramos que tudo é apenas uma representação em texto puro das estruturas de dados básicas. É muito legal ver o momento em que isso encaixa na cabeça das pessoasCompartilhamos um documento básico de receitas de Git para que novos funcionários comecem a commitar código, mas a maioria só segue os passos sem entender o que está acontecendo
Já quem faz a aula, mesmo sem conhecer todos os comandos, passa a ter uma compreensão prática bastante razoável do que realmente acontece no Git. Como os comandos são fáceis de pesquisar, se o modelo mental estiver correto, os comandos em si não são um grande problema. Ainda assim, quase toda discussão sobre Git no HN acaba virando conversa sobre linha de comando
Curiosamente, essa aula soa parecida com o texto alternativo de https://xkcd.com/1597/. A diferença é que, para leitores técnicos, essa é de fato a maneira correta de ensinar Git, e uma vez entendido, dá uma compreensão fundamental que não se esquece
Sinceramente, acho que o retorno sobre o tempo investido é tão alto que é estranho não fazer isso
No último slide da apresentação, coloquei perguntas para os colegas responderem com base no modelo de dados do Git. Por exemplo: “é possível mover um commit para outro branch?” e “o que garante que não haja ciclos no grafo de commits?”
Foi muito satisfatório ver as pessoas não apenas usando Git, mas pensando em Git
Felizmente, no início vi um vídeo explicando parte do modelo interno do Git e percebi que, na prática, não é preciso ter tanto conhecimento interno nem tão profundo para fazer uma grande diferença. Só saber uns 5% de como o Git funciona já me fez entender muito melhor o que os comandos fazem e como usá-los
Se ele foi baseado em algum material público e conciso o bastante para caber em 2 horas, seria ótimo se você compartilhasse nesta thread ou em um post no HN. Acredito que, mesmo sobre o mesmo tema, quanto mais materiais de aprendizagem com pressupostos, analogias e focos diferentes, melhor
Consigo lidar razoavelmente com o fluxo comum do Git, merges, rebases etc., mas estou pensando seriamente em migrar para jujutsu em vez de tentar ficar melhor no Git.
jjé compatível com Git, e posso usá-lo sozinho enquanto meus colegas continuam usando GitSinto que há um truque que muitos guias e a maioria das GUIs de Git deixam passar. Como exceção, o magit lida bem com isso
É definir o branch upstream não como
origin/feature/foodefeature/foo, mas como o destino para o qual você quer fazer merge, ou seja, o branch de integraçãomasterouorigin/masterIsso simplifica muita coisa. Ao executar
git status, ele informa o quanto você divergiu do branch de integração, o que é útil; e, ao executargit rebasesem argumentos, ele já faz o rebase diretamente sobre o upstreamTer
origin/feature/foocomo upstream é menos útil. Em geral, os desenvolvedores também “possuem” seu próprio branch remoto, então saber o quanto ele divergiu dali não tem muito significado, e você também não costuma querer fazer rebase para eleSe definir
push.defaultcomo"current", ogit pushtambém faz o esperado: enviafeature/fooparaorigin/feature/fooFico me perguntando por que essa configuração não é mais comum
A seção de colaboração não trata de branches de funcionalidade. Acho que é um fluxo de trabalho bastante comum
Seria útil contrastá-lo com o modo “cada um usa seu próprio branch” do guia. Além disso, na seção 17, valeria abordar a forma de reutilizar branches em pull requests do GitHub e a forma de criar um branch novo para cada PR
Ainda não conferi o texto, mas parece bom. Outra recomendação é o curso de Git da boot.dev, ministrado pelo Primeagen
Ele é interativo e vai fundo a ponto de manipular diretamente os arquivos dentro do diretório
.git. Depois de fazer esse curso, passei a ter um modelo mental completamente novo de como o Git funciona