Como posso manter meu fork em sincronia sem adicionar um controle remoto separado?

302

Vamos supor que exista um repositório someone/foobarno GitHub, para o qual eu bifurquei me/foobar.

Como puxo novas confirmações do repositório pai diretamente para o meu fork , sem precisar adicionar um controle remoto separado e lembre-se de extrair regularmente a partir daí ?

O objetivo é:

  • git pull buscar no repositório pai
  • git push enviar tudo para o meu garfo
1ace
fonte
26
A resposta surpreendente de @Olufemi parece fazer o que você deseja, exceto que, como observa ChristianGosch em um comentário, você acaba com um "commit de mesclagem" no topo de sua ramificação, e "nada para comparar" não aparecerá. Isso parece inaceitável para muitos projetos para os quais você deseja criar ramificações para eles. Portanto, não há realmente nenhuma maneira de fazer isso nos fluxos de trabalho de colaboradores mais básicos no github sem executar comandos arcanos git em um computador pessoal? Ou talvez eu deva apenas jogar fora todo o meu repo e re-fork toda vez que quiser contribuir?
Nealmcb
Possível duplicata do github, atualização do projeto bifurcada
mpromonet
Possível duplicata de Como atualizo um repositório bifurcado do GitHub?
Ciro Santilli escreveu
@nealmcb O problema com um "commit de mesclagem" na parte superior do seu ramo é evitado se você fizer uma nova recuperação?
Marko

Respostas:

586

Abra o repositório Git bifurcado me / foobar .

Clique em Comparar :

Aqui está uma imagem de amostra da página

Você receberá a notificação:

Não há nada para comparar.
alguém: mestre está atualizado com todos os commits de mim: mestre . Tente mudar a base para sua comparação.

Clique em mudar a base nesta página:

Aqui está um exemplo na página

Então você poderá ver todos os commits feitos a alguém / foobar após o dia em que você o bifurcou.

Clique em Criar solicitação pull :

Aqui está uma página de amostra

Atribua um título à solicitação pull e talvez uma descrição e clique em Criar solicitação pull .

Na próxima página, role até a parte inferior da página e clique em Mesclar solicitação de recebimento e Confirmar mesclagem .

Seu repositório Git me / foobar será atualizado.

Editar: as opções de rebase são mostradas aqui:

insira a descrição da imagem aqui

Olufemi Israel Olanipekun
fonte
50
Isso é confuso porque, quando você alterna o github base, lança-o na página do repositório original, então parece que você está abrindo uma solicitação de recebimento na bifurcação upstream. Mas funciona totalmente.
Eduardo Eduardo
8
Para evitar a situação confusa mencionada acima, é melhor clicar no Editbotão e alternar manualmente base forkpara me/foobare head forkpara someone/foobar. Desta forma é muito clara
macemers
26
Outro: Isso funciona bem se você já não fez isso antes, mas depois existe o "commit de mesclagem" no topo do seu histórico de commit. Assim, "nada para comparar" não aparecerá. Em vez disso, é preciso usar o botão "Editar" e trocar manualmente a base e o garfo para que isso funcione.
Christian Gosch
26
Não há como se livrar desse ridículo commit de mesclagem?
precisa saber é o seguinte
17
@kumar_harsh desde setembro de 2016 , agora existe uma opção "rebase and merge" para solicitações pull que evita a confirmação de mesclagem.
waldyrious
41
git remote set-url origin [email protected]:someone/foobar
git remote set-url origin --push [email protected]:me/foobar

Porém, há uma ressalva:
isso é perfeito se você for o único a fazer alterações no garfo.
No entanto, se ele for compartilhado com outras pessoas, talvez seja necessário puxar do garfo; nesse caso, um controle remoto separado é a única solução.

Edit:
Na verdade, você pode git pull [email protected]:me/foobar , o que remove a ressalva.
A escolha é sua quanto ao que é mais fácil de lembrar.

1ace
fonte
8

Eu usei um método bastante simples usando a interface da Web do GitHub para fazer isso:

  1. Abra o repositório Git original (não o repositório Git bifurcado me/foobar)
  2. Vá para a pasta src e abra o arquivo que deseja alterar
  3. Clique no ícone da caneta. Ele criará automaticamente um rótulo em seu fork pessoal chamado "patch-1", com base na versão atual do repositório principal: Digite a descrição da imagem aqui
  4. Aproveitar! Digite a descrição da imagem aqui
Nadir
fonte
3
Tentando isso, basicamente abre o editor no arquivo no repositório git original. Não tenho privilégio de gravação (por design) no repositório original do git. Parece que, para esse método, você deve alterar o arquivo, caso contrário, não há como "salvar" o arquivo. Sem salvar o arquivo, não consegui que seu equivalente da ramificação "patch-1" fosse exibido no meu repositório bifurcado. O que estou perdendo aqui?
11892 Electro-Bunny
5

O aplicativo "Pull" é uma solução de configuração e esquecimento automática. Ele sincronizará a ramificação padrão do seu fork com o repositório upstream.

Visite o URL, clique no botão verde "Instalar" e selecione os repositórios em que deseja ativar a sincronização automática.

A ramificação é atualizada uma vez por hora diretamente no GitHub. Na sua máquina local, você precisa puxar a ramificação principal para garantir que sua cópia local esteja sincronizada.

Também respondido em https://stackoverflow.com/a/58965171/946850 .

krlmlr
fonte
1

Outra opção é usar o Update from upstreamRepoName/masterbotão no GitHub para Mac (e eu assumo o GitHub para Windows).

Digite a descrição da imagem aqui

Steve Moser
fonte
TIL: que existem aplicativos para GitHub além da interface web :-) [e é uma pena que a experiência através deles não é unificado]
Tom Goodfellow
Eu não vejo isso no Windows
Denis
1
@ Denis este é o seu aplicativo antigo. Não tenho certeza de que o novo aplicativo o tenha.
Steve Moser
Aha. Isso funcionou no "GitHub Desktop" (para Mac, não tenho certeza sobre o Windows).
michaelok
0

Não sei como isso pode ser feito sem a adição de outro controle remoto; no entanto, sempre adiciono o repositório de que peguei como upstreamremoto, para que eu pudesse simplesmente fazer:

git branch -a|grep remotes/upstream| while IFS="/" read p r b; do echo Syncing $r/$b to origin/$b; git push origin $r/$b:refs/heads/$b; done

Isso sincronizará todos os ramos, inclusive. criando novos (remova a refs/heads/para atualizar apenas as ramificações existentes). Se algum dos seus ramos divergir, ocorrerá um erro nesse ramo.

Thomas Guyot-Sionnest
fonte