Puxe novas atualizações do repositório GitHub original para o repositório GitHub bifurcado

615

Eu peguei o repositório de alguém no GitHub e gostaria de atualizar minha versão com confirmações e atualizações feitas no repositório original. Estes foram feitos depois que eu peguei minha cópia.

Como posso extrair as alterações feitas na origem e incorporá-las ao meu repositório?

porque
fonte
1
Possível duplicada, ou talvez apenas relacionada: mesclando garfos no GitHub .
Caso haja tags adicionais que você queira sincronizar, faça git push --force origin --tagsapós as soluções propostas!
MediaVince
1
Possível duplicata de Como atualizo um repositório bifurcado do GitHub?
Ciro Santilli escreveu

Respostas:

716

Você precisa adicionar o repositório original (o que você bifurcou) como um controle remoto.

Na página do manual do fork do GitHub :

garfo

Após a conclusão do clone, seu repositório terá um controle remoto chamado " origin" que aponta para o seu fork no GitHub.
Não deixe o nome confundi-lo, isso não indica o repositório original do qual você foi bifurcado. Para ajudar você a acompanhar esse repositório, adicionaremos outro controle remoto chamado "upstream":

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

Você também tem uma gema de rubi que pode facilitar essas operações do GitHub .

bifurcado

Veja também " Git fork é git clone? ".

VonC
fonte
14
Veja também bassistance.de/2010/06/25/git-fu-updating-your-github-fork para um bom resumo.
VonC
2
@syedrakib Prefiro um git rebase upstream/master, mas adicionei as duas possibilidades na resposta.
VonC 31/03
1
@PaBLoX se você tiver bifurcado um repo, você está trabalhando no seu repo, em seu ramo: faça uma nova reformulação e force um empurrão: não há confusão. Mesmo uma solicitação de recebimento em andamento seria atualizada corretamente.
VonC
2
@PaBLoX, você não cria uma bagunça: você git push --force, substituindo o histórico de sua filial no GitHub pela filial local que você acabou de refazer. Como apenas você está usando um ramo triste, nenhuma bagunça está envolvida.
VonC
2
Compreendo. Ainda acho difícil, não trivial e não intuitivo. Ainda assim, é estranho que minhas alterações estejam sempre no topo (por último), enquanto na verdade elas foram feitas antes. A solução que eu publiquei antes parece melhor (ainda não trivial também). O problema é que a confirmação de hashes muda (obviamente, já que há um novo pai) e gera muito ruído no github quando problemas estão sendo chamados. Ainda me surpreende que não exista uma maneira de manter-se atualizado com o upstream e gerenciar seu próprio fork sem criar commits de mesclagem sem sentido ou "mentir" sobre a história.
Pablo Olmos de Aguilera C.
99

Além da resposta do VonC, você pode ajustá-lo ainda mais.

Após buscar na ramificação remota, você ainda precisará mesclar as confirmações. Eu substituiria

$ git fetch upstream

com

$ git pull upstream master

já que o git pull é essencialmente git fetch + git merge.

n00shie
fonte
E se eu souber que o ramo upstream não possui alterações nos arquivos existentes, mas apenas alguns arquivos de recursos foram adicionados - ainda preciso mesclar?
Azec-pdx
4
Certamente ele fará um avanço rápido nesse caso
Domness
como é que se faz mestre montante sobrescrever todos os arquivos locais (de modo que não há conflitos de mesclagem) mestre montante é líder no código neste caso, para nós confio que 100% ... conseguiram fazer isso
snh_nl
1
@snh_nl git rebase upstream masterObserve que isso não está livre de conflitos se você tiver divergido o suficiente upstream/master. Veja git-scm.com/docs/git-rebase (tl; dr: isso redefine seu mestre local para o upstream e, em seguida, tenta ressurgir todos os commits locais do ponto de divergência para a frente)
cowbert
68

Este vídeo mostra como atualizar um fork diretamente do GitHub

Passos:

  1. Abra seu garfo no GitHub.
  2. Clique em Pull Requests.
  3. Clique em New Pull Request. Por padrão, o GitHub irá comparar o original com o seu fork, e não deve haver nada para comparar se você não tiver feito alterações.
  4. Clique em switching the base. Agora o GitHub irá comparar seu fork com o original, e você deverá ver todas as alterações mais recentes.
  5. Clique Create a pull requestnesta comparação e atribua um nome previsível à sua solicitação de recebimento (por exemplo, Atualização do original).
  6. Clique em Create pull request.
  7. Role para baixo, clique Merge pull requeste, finalmente, Confirmmescle. Se o seu garfo não teve nenhuma alteração, você poderá mesclá-lo automaticamente.
Dmitry Pavlov
fonte
3
Infelizmente, esse bom método gráfico cria um ruído adicional no seu fork, conforme mencionado acima nos comentários da resposta aceita. Portanto, recomenda o método de linha de comando: help.github.com/articles/syncing-a-fork
Jonathan Cruz
Não consegui encontrar a switching the baseopção
alper
64

Usar:

git remote add upstream ORIGINAL_REPOSITORY_URL

Isso configurará seu upstream para o repositório de onde você foi bifurcado. Então faça o seguinte:

git fetch upstream      

Isso buscará todos os ramos, incluindo o mestre, do repositório original.

Mesclar esses dados em sua filial principal local:

git merge upstream/master

Envie as alterações para o seu repositório bifurcado, ou seja, para a origem:

git push origin master

Voila! Você terminou de sincronizar o repositório original.

ARCA
fonte
como é que se faz mestre montante sobrescrever todos os arquivos locais (de modo que não há conflitos de mesclagem) mestre montante é líder no código neste caso, para nós confio que 100% ... conseguiram fazer isso
snh_nl
Uma maneira é simplesmente excluir a cópia local, e fazer uma nova clonagem :)
ARK
1

Se você estiver usando o aplicativo de desktop GitHub, há um botão de sincronização no canto superior direito. Clique nele e Update from <original repo>próximo ao canto superior esquerdo.

Se não houver alterações a serem sincronizadas, isso ficará inativo.

Aqui estão algumas capturas de tela para facilitar isso.

sudo bangbang
fonte
1

Se não houver nada a perder, você também pode simplesmente excluir o seu fork, vá para as configurações ... vá para a seção zona de perigo abaixo e clique em excluir repositório. Ele solicitará que você insira o nome do repositório e sua senha depois. Depois disso, você apenas bifurca o original novamente.

Chan
fonte
1

Se você quiser fazer isso sem cli, poderá fazê-lo totalmente no site do Github.

  1. Vá para o seu repositório de bifurcações.
  2. Clique em New pull request.
  3. Certifique-se de definir seu fork como repositório base e o repositório original (upstream) como repositório principal. Normalmente você deseja apenas sincronizar a ramificação principal.
  4. Create new pull request.
  5. Selecione a seta à direita do botão de mesclagem e escolha rebase em vez de mesclar. Depois clique no botão Dessa forma, não produzirá consolidação desnecessária de mesclagem.
  6. Feito.
cakraww
fonte
0

Para sincronizar automaticamente seu repositório bifurcado com o repositório pai, você pode usar o aplicativo Pull no GitHub.

Consulte o Leia-me para mais detalhes.

Para configuração avançada em que você deseja preservar as alterações feitas no repositório bifurcado, consulte minha resposta em uma pergunta semelhante aqui .

Saurabh P Bhandari
fonte