O fluxo do pull request


Você está trabalhando em uma funcionalidade na sua própria branch, e ela está pronta. O projeto é compartilhado: outras pessoas também fazem commits nele, então você não dá push direto para a main e espera que dê tudo certo. Você quer que a mudança seja revisada, discutida se for o caso, e integrada de um jeito que o resto do time possa acompanhar. Todo esse caminho, de uma branch na sua máquina até o código chegar na main, é o fluxo de pull request, e é assim que praticamente todo time no GitHub integra mudanças. O lado do Git nisso tudo usa só comandos de capítulos anteriores: uma branch, um commit e um push:
$ git switch -c add-five-day-forecast
Switched to a new branch 'add-five-day-forecast'
$ git add src/forecast.js
$ git commit -m "Add five-day forecast panel"
$ git push -u origin add-five-day-forecast
Branch 'add-five-day-forecast' set up to track 'origin/add-five-day-forecast'.Esse push envia sua branch para o GitHub. Nada foi mesclado ainda, e nada foi nem sequer proposto para revisão. O próximo passo, abrir o pull request, acontece no site do GitHub.
O que acontece quando você abre um pull request
No GitHub, depois de um push como esse, você geralmente vai ver um banner oferecendo comparar sua nova branch com a main. Clique nele, escreva um título e uma descrição curta do que mudou e por quê, e abra a página que ele cria. Essa página é um pull request, muitas vezes abreviado para PR: um pedido para mesclar uma branch em outra, com uma conversa em andamento anexada a ela.
Um pull request propõe um merge e espera aprovação. Alguém, talvez você mesmo, talvez um colega de time, lê a mudança, deixa comentários, e só faz o merge quando tudo estiver certo. Até isso acontecer, sua branch e a main continuam exatamente como estavam antes de você abrir a página.
Fork ou branch
Abrir um pull request a partir de uma branch funciona quando você tem acesso de escrita ao repositório, o que é o caso normal nos projetos do seu próprio time. Contribuir para um projeto ao qual você não tem acesso de escrita exige um passo extra: um fork, sua própria cópia do repositório na sua conta do GitHub.
Você cria branches e commits dentro do seu fork exatamente como faria em um projeto seu, dá push para o seu fork, e então abre o pull request da branch do seu fork de volta para o repositório original. O GitHub compara entre os dois repositórios do mesmo jeito que compara duas branches dentro de um único repositório, então o fluxo de revisão e merge parece idêntico nos dois casos.
Fazendo seu pull request passar pela revisão
Depois que um PR é aberto, ele se torna uma conversa em andamento sobre o diff. Um revisor lê a mudança, deixa comentários em linhas específicas, e aprova ou solicita mudanças. Quando mudanças são solicitadas, continue fazendo commits e dando push para a mesma branch: cada push atualiza o mesmo PR em vez de criar um novo. Depois que um revisor aprova e qualquer verificação obrigatória passa, o PR está pronto para o merge.
Por que um pull request não faz merge
Às vezes o botão de merge de um PR aparece acinzentado, e o GitHub mostra uma mensagem no lugar: "This branch has conflicts that must be resolved" ou "This branch is out of date with the base branch." As duas mensagens descrevem um estado normal e resolvível: a main avançou desde que você criou sua branch, geralmente porque o PR de outra pessoa foi mesclado nesse meio tempo, e sua branch precisa se atualizar antes que o GitHub consiga combinar as duas de forma limpa. Isso acontece em qualquer projeto com mais de um colaborador, então espere por isso em vez de temer.
Resolva isso localmente do mesmo jeito que você juntaria quaisquer duas branches:
$ git switch add-five-day-forecast
$ git fetch origin
From github.com:mara-chen/weather-app
9f8e7d6..b7c9e21 main -> origin/main
$ git merge origin/mainSe nada se sobrepõe, o merge se completa sozinho e você dá push, e o PR se atualiza e o botão libera. Se as mesmas linhas mudaram nos dois lados, o Git marca o conflito no arquivo para você resolver exatamente como visto em Merge e conflitos: abra o arquivo, edite os marcadores de conflito até chegar ao resultado que você quer, depois git add e git commit para terminar o merge, e dê push de novo.
Um pull request travado precisa se atualizar ou ter seu conflito resolvido.
main ou tem um conflito com ela. Nada está quebrado. Mude para sua branch, faça fetch, e mescle a main, resolvendo qualquer conflito do mesmo jeito que faria em qualquer outro lugar, depois dê push de novo. O que é um pull request, por dentro
Um pull request não é um objeto do Git, e não existe nenhum comando git que crie um. Git e GitHub não são a mesma coisa: o Git só conhece commits, branches e outras refs (uma ref é um nome que aponta para um commit). O GitHub constrói toda a página do PR, os comentários e o botão de merge por cima de duas refs que ele compara: sua branch (a head) e a branch para a qual você está mesclando (a base, geralmente a main). Essa comparação é o motivo de você abrir um pull request no site do GitHub (ou pela ferramenta de linha de comando ou API do próprio GitHub), e nunca com um comando git puro.

