Recentemente, eu bifurquei um projeto e apliquei várias correções. Criei então um pedido de puxar que foi então aceite.
Alguns dias depois, outra mudança foi feita por outro colaborador. Então o meu garfo não'não contém essa mudança.
Como posso meter essa mudança no meu garfo? Preciso de apagar e recriar o meu garfo quando tiver mais alterações para contribuir? Ou existe um botão de actualização?
Em seu clone local do seu repositório bifurcado, você pode adicionar o repositório GitHub original como um "remoto". ("Remotos" são como apelidos para as URLs dos repositórios - origin
é um, por exemplo). Então você pode pegar todos os ramos desse repositório upstream, e rebase seu trabalho para continuar a trabalhar na versão upstream. Em termos de comandos que podem ser parecidos:
# Add the remote, call it "upstream":
git remote add upstream https://github.com/whoever/whatever.git
# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:
git fetch upstream
# Make sure that you're on your master branch:
git checkout master
# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:
git rebase upstream/master
Se você não quiser reescrever a história do seu ramo mestre, (por exemplo porque outras pessoas podem tê-lo clonado) então você deve substituir o último comando por git merge upstream/master
. No entanto, para fazer mais pedidos que estejam o mais limpos possível, é provavelmente melhor rebasear.
Se você rebaseou seu ramo para o upstream/master
você pode precisar forçar o push para empurrá-lo para o seu próprio repositório bifurcado no GitHub. Você faria isso com:
git push -f origin master
Você só precisa utilizar o `-f' na primeira vez depois de ter rebaixado.
A partir de maio de 2014, é possível atualizar um garfo diretamente do GitHub. Isto ainda funciona a partir de setembro de 2017, MAS levará a um histórico de commit sujo.
Update from original
).Agora você tem três opções, mas cada uma levará a um histórico de compromissos menos limpo.
Este ramo é X commits à frente, Y commits atrás <original fork>
.Então sim, você pode manter seu reporte atualizado com seu upstream usando o GitHub web UI, mas fazendo isso vai manchar seu histórico de comprometimento. Fique com a linha de comando ao invés disso - é fácil.
Aqui está o documento oficial do GitHub sobre Sincronização de um garfo:
A Configuração
Antes de poder sincronizar, você precisa adicionar um controle remoto que aponte para o repositório upstream. Você pode ter feito isso quando você originalmente bifurcou.
Dica: A sincronização do garfo apenas atualiza sua cópia local do repositório; ele não atualiza seu repositório no GitHub.*
$ git remoto -v
Liste os controles remotos atuais
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
$ git remoto add upstream https://github.com/otheruser/repo.git
Definir um novo controle remoto
$ git remoto -v
Verificar novo controle remoto
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
upstream https://github.com/otheruser/repo.git (fetch)
upstream https://github.com/otheruser/repo.git (push)
Syncing
Existem dois passos necessários para sincronizar seu repositório com o upstream: primeiro você deve ir buscar do remoto, depois você deve fundir o ramo desejado no seu ramo local.
Fetch
Buscar no repositório remoto trará em suas filiais e seus respectivos commits. Estes são armazenados no seu repositório local sob ramos especiais.
$ git fetch upstream
Agarra os ramos do controle remoto a montante
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
* [new branch] master -> upstream/master
Temos agora o ramo principal do upstream armazenado em um ramo local, upstream/master
ramo -va
Listar todas as filiais locais e de rastreamento remoto
* master a422352 My local commit
remotes/origin/HEAD -> origin/master
remotes/origin/master a422352 My local commit
remotes/upstream/master 5fdff0f Some upstream commit
Merging
Agora que já fomos buscar o repositório a montante, queremos fundir as suas alterações na nossa sucursal local. Isto trará esse ramo em sincronia com o upstream, sem perder as nossas alterações locais.
mestre da caixa de $ git
Confira a nossa sucursal principal local
Switched to branch 'master'
$ git fundir upstream/master
Fundir o mestre do upstream no nosso próprio
Updating a422352..5fdff0f
Fast-forward
README | 9 -------
README.md | 7 ++++++
2 files changed, 7 insertions(+), 9 deletions(-)
delete mode 100644 README
create mode 100644 README.md
Se a sua sucursal local não teve nenhum compromisso único, o git fará um "fast-forward":
$ git fundir upstream/master Atualização 34e91da..16c56ad Rápido README.md | 5 ++++... 1 arquivo alterado, 3 inserções(+), 2 exclusões(-)
Dica: Se você quiser atualizar seu repositório no GitHub, siga as instruções aqui*.