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?


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

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? ".



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.


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.

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.


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.


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.


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.

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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.