O fluxo de pull request


Você esteve trabalhando em uma funcionalidade em seu próprio branch e ela está pronta. O projeto é compartilhado: outras pessoas também fazem commits nele, então você não faz push direto para main e espera pelo melhor. Você quer que a alteração seja revisada, discutida se necessário, e integrada de uma forma que o resto do time possa ver. Todo esse caminho, desde um branch em sua máquina até o código chegar em main, é o fluxo de pull request, e é assim que quase todos os times no GitHub fazem mudanças. O lado do Git disso usa apenas comandos dos capítulos anteriores, um 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 seu branch para o GitHub. Nada foi integrado ainda, e nada foi 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, após um push como o acima, você geralmente verá um banner oferecendo para comparar seu novo branch contra main. Clique nele, escreva um título e uma breve descrição do que mudou e por quê, e abra a página que ele cria. Essa página é um pull request, frequentemente abreviado como PR: uma solicitação para integrar um branch em outro, com uma conversa em andamento anexada a ele.
Um pull request propõe um merge e espera aprovação. Alguém, talvez você, talvez um colega de time, lê a mudança, deixa comentários, e apenas faz merge uma vez que parece certo. Até que isso aconteça, seu branch e main permanecem exatamente como eram antes de você abrir a página.
Fork versus branch
Abrir um pull request a partir de um branch funciona quando você tem acesso de escrita ao repositório, que é o caso normal em projetos de seu próprio time. Contribuir para um projeto ao qual você não tem acesso de escrita precisa de um passo extra: um fork, sua própria cópia do repositório em sua própria conta do GitHub.
Você faz branch e commit dentro de seu fork exatamente como faria em um projeto que você possui, faz push para seu fork, e então abre o pull request do branch do seu fork de volta ao repositório original. O GitHub compara através dos dois repositórios da mesma forma que compara dois branches dentro de um repositório, então o fluxo de revisão e merge parece idêntico de qualquer forma.
Obtendo seu pull request através da revisão
Uma vez que um PR está 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 commitando e fazendo push para o mesmo branch: cada push atualiza o mesmo PR em vez de criar um novo. Uma vez que um revisor aprova e qualquer verificação necessária passar, o PR está pronto para fazer merge.
Por que um pull request não fará merge
Às vezes o botão de merge em um PR fica acinzentado, e o GitHub mostra uma mensagem em seu lugar: "This branch has conflicts that must be resolved" ou "This branch is out of date with the base branch." Ambas as mensagens descrevem um estado normal e corrigível: main avançou desde que você fez branch, geralmente porque o PR de outra pessoa foi integrado enquanto isso, e seu branch precisa acompanhar antes que o GitHub possa combinar os dois de forma limpa. Isso acontece em qualquer projeto com mais de um colaborador, então espere por isso em vez de temê-lo.
Corrija isso localmente da mesma forma que você faria para trazer quaisquer dois branches juntos:
$ 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 por si só e você faz push, e o PR se atualiza e o botão desbloqueia. Se as mesmas linhas mudaram dos dois lados, o Git marca o conflito no arquivo para você resolver exatamente como coberto em Merging and conflicts: abra o arquivo, edite para remover os marcadores de conflito para o resultado que você quer, então git add e git commit para terminar o merge, e faça push novamente.
Um pull request travado precisa acompanhar ou seu conflito resolvido.
main ou tem um conflito com ele. Nada está quebrado. Mude para seu branch, busque, e faça merge de main, resolvendo qualquer conflito da mesma forma que você faria em qualquer outro lugar, depois faça push novamente. O que um pull request é, sob o capô
Um pull request não é um objeto do Git, e não há nenhum comando git que crie um. Git e GitHub não são a mesma coisa: Git só conhece commits, branches e outras refs (uma ref é um nome apontando para um commit). O GitHub constrói toda a página do PR, os comentários, e o botão de merge em cima de duas refs que ele compara: seu branch (a head) e o branch em que você está fazendo merge (a base, geralmente main). Essa comparação é por que você abre um pull request no site do GitHub (ou através da ferramenta de linha de comando do GitHub ou API), e nunca com um comando git simples.

