Contribuindo para o projeto no github, como “rebase minha solicitação pull em cima do mestre”

98

Ok, então estou contribuindo para um projeto no github. O projeto no github é upstream, meu repositório bifurcado no github é origine meu localrepositório no meu computador.

git checkout -b feature
# Working on feature
git commit -a -m 'only commit on feature'

então eu envio uma solicitação pull

git push origin master

A solicitação pull é revisada e uma mudança não relacionada precisa ser feita. Alguém faz um commit e mescla emupstream/master

Agora sou solicitado pelo upstreammantenedor para "realocar minha solicitação de pull em cima do mestre"

Esta é a minha história (insira o efeito sonoro Law and Order) .....

Não fiz nenhuma alteração na solicitação pull e ainda é o mesmo recurso de commit no branch.

git checkout master
git fetch upstream
git checkout feature
git rebase master
=> "Current branch feature is up to date."
git push origin feature
=> "Everything up-to-date"

Não entendo. Como isso é possível quando eu sei que alguém se comprometeu e mesclou upstream/masterdepois que eu enviei minha solicitação pull para origin/feature?

Alguém pode me dizer qual deve ser o procedimento correto nesta situação?

fontno
fonte

Respostas:

109

Você só mostra uma busca no repositório upstream. Isso não atualiza nenhum de seus branches locais. Isso apenas atualiza seu conhecimento sobreupstream . Você precisaria garantir que upstream/masterestá totalmente mesclado com o seu master, como com a git pull, antes de fazer o rebase em master, ou mais simplesmente apenas rebase em upstream/master.

Ie:

git checkout master
git pull upstream master
git checkout feature
git rebase master

ou

git checkout feature
git rebase upstream/master

Atualizar:

Depois de consertar seu featurebranch local , você precisará empurrá-lo de volta originpara terminar de atualizar a solicitação pull. Como você já fez push featureuma vez, não pode simplesmente pushvoltar, porque um rebase muda o histórico e não é mais um avanço rápido. Normalmente, quando um push falha com um "não-fast-forward", você resolveria fazendo um pull, mas um pull apenas combinará as duas histórias divergentes, o que definitivamente não é o que você deseja. Isso significaria que seu featurebranch antigo (pré-rebase) seria combinado com o novo (pós-rebase). Você deseja sobrescrever origin/feature com o estado do novo featurebranch, descartando qualquer registro do antigo. Isso significa que você deseja forçar o push a acontecer, mesmo que não seja um avanço rápido, usando git push -f origin feature. Nota:perigoso , e você pode perder compromissos com ele. Use-o apenas se você tiver certeza absoluta de que sabe o que está fazendo, como aqui mesmo, onde deseja intencionalmente descartar os commits antigos e inúteis no featurebranch pré-rebase .

Ryan Stewart
fonte
1
Ok, entendo, obrigado pelo esclarecimento. Vejo que deveria ter puxado em vez de buscado. Agora eu tenho outro problema, quando git push origin featurerecebo um erro não-fast-forward, falha ao enviar etc. O git pull --rebase resolveria esse erro e enviaria para o meu branch de recursos ou isso causaria problemas para o mantenedor e outros?
fontno
1
Atualizei minha resposta para cobrir o empurrão.
Ryan Stewart
No meu caso, adicionei o repositório upstream como um remoto, mas esqueci de buscar nele. git fetch upstreambaixei as alterações mais recentes e, finalmente, git rebase upstream/developfuncionou.
Alberto Chiusole
9

Agora sou solicitado pelo mantenedor do upstream para "realocar minha solicitação de pull em cima do mestre"

Observe que desde setembro de 2016, o mantenedor pode acionar o rebase por conta própria.

Consulte " Rebase e mesclar solicitações pull "

Quando você seleciona a nova opção "Rebase e mesclagem", os commits do branch da solicitação de pull são realocados para a ponta do branch base e, em seguida, o próprio branch base é encaminhado rapidamente para esse cabeçote recém-realocado. Rebases definem automaticamente o committer dos commits rebase para o usuário atual, enquanto mantém as informações de autoria intactas. O branch da solicitação pull não será modificado por esta operação.

Se um rebase não puder ser executado devido a conflitos, avisaremos você para que possa resolvê-los manualmente, se necessário.

https://cloud.githubusercontent.com/assets/2195/18671961/a03fa9b6-7f35-11e6-8fa0-e16b2fede8ca.gif

VonC
fonte