Sincronizando um repositório Git local com um remoto

297

Desejo sincronizar meu repositório local com um remoto, para que meu repositório local se torne uma cópia 100% do remoto - o que significa que, se certos arquivos diferirem nesses repositórios, substituímos os locais pelos remotos e, se houver Nos repositórios locais que não existem no controle remoto, os arquivos locais são removidos.

Existe alguma maneira de conseguir isso além de fazer um novo clone do repositório remoto?

Pergunta semelhante à Sync repo git local com controle remoto em um tiro descartando alterações / confirmações locais .

Axl
fonte
4
Sempre quando eu venho aqui, eu estou olhando para a sincronização de um garfo
Martin Thoma
1
git fetch --prune
hassanzadeh.sd 11/03

Respostas:

342
git fetch --prune

-p, --prune
Após a busca, remova quaisquer ramificações de rastreamento remoto que não existem mais no controle remoto. opções de remoção

jobwat
fonte
6
Era isso que eu estava procurando! PS Da próxima vez eu vou ler páginas man mais cuidado antes de cavar stackoverflow :-)
Sergiy Sokolenko
5
Sim, git pull -pfaz o mesmo - 'git pull executa git fetch com os parâmetros fornecidos e chama git merge para mesclar as cabeças de ramificação recuperadas na ramificação atual' - git-scm.com/docs/git-pull
jobwat
2
Use git fetch <remote> --prune, caso alguém precise apenas de --pruneum controle remoto específico. por exemplo. git fetch upstream --prune.
Fery Wardiyanto 4/03/16
git fetch origin --prunesincronizar você repo local com o garfo de um upstreamprojeto
Stuart Cardall
2
@SergiySokolenko é o que todos dizemos, mas no fundo sabemos que SO se tornou mais conveniente que as páginas de manual:
Marcello Romani
144

Estas etapas o farão:

git reset --hard HEAD
git clean -f -x -d -n

então sem -n

Isso cuidará de todas as alterações locais. Agora os commits ...

git status

e observe a linha como:

Your branch is ahead of 'xxxx' by N commits.

Anote o número 'N' agora:

git reset --hard HEAD~N
git pull

e finalmente:

git status

não deve mostrar nada para adicionar / confirmar. Tudo limpo.

No entanto, um novo clone pode fazer o mesmo (mas é muito lento).

=== Atualizado ===

À medida que meu conhecimento sobre o Git melhorou um pouco ao longo do tempo, criei outra maneira mais simples de fazer o mesmo. Aqui está como (com explicação). Enquanto estiver no seu ramo de trabalho:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

Embora as confirmações e alterações locais desapareçam após isso, é possível recuperar as alterações confirmadas, se necessário.

FractalSpace
fonte
1
agradecimentos tanto para a atualização funciona perfeitamente bem com github e bitbucket :)
CommonSenseCode
esta resposta foi a mais confiável das soluções aqui para mim.
AlanH 17/01
95

Você precisa entender que um repositório Git não é apenas uma árvore de diretórios e arquivos, mas também armazena um histórico dessas árvores - que podem conter ramificações e mesclagens.

Ao buscar em um repositório, você copiará todas ou algumas das ramificações para o repositório. Eles estão no seu repositório como "ramificações de rastreamento remoto", por exemplo, ramificações nomeadas como remotes/origin/masteressas.

A busca de novas confirmações no repositório remoto não altera nada na sua cópia de trabalho local.

Sua cópia de trabalho normalmente recebe um commit, chamado HEAD. Esse commit geralmente é a dica de uma de suas filiais locais.

Eu acho que você deseja atualizar sua ramificação local (ou talvez todas as ramificações locais?) Para a ramificação remota correspondente e, em seguida, confira a ramificação mais recente.

Para evitar conflitos com sua cópia de trabalho (que pode ter alterações locais), limpe primeiro tudo o que não possui versão (usando git clean). Em seguida, verifique a ramificação local correspondente à ramificação remota para a qual deseja atualizar e use-a git resetpara alternar para a ramificação remota buscada. ( git pullincorporará todas as atualizações da ramificação remota na sua local, que pode fazer o mesmo, ou criará uma confirmação de mesclagem se você tiver confirmações locais.)

(Mas você realmente perderá as alterações locais - tanto na cópia de trabalho quanto nas confirmações locais. Certifique-se de que realmente deseja isso - caso contrário, use melhor uma nova ramificação, isso salvará as confirmações locais. E use git stashpara salvar as alterações que ainda não foram confirmadas .)


Editar: se você possui apenas uma filial local e está acompanhando uma filial remota, tudo o que você precisa fazer é

git pull

de dentro do diretório de trabalho.

Isso buscará a versão atual de todas as ramificações remotas rastreadas e atualizará a ramificação atual (e o diretório de trabalho) para a versão atual da ramificação remota que está sendo rastreada.

Paŭlo Ebermann
fonte
Se eu mudar NADA no meu repositório local, apenas a.) Deseja ter uma cópia de tudo do controle remoto e b.) Deseja a possibilidade de mostrar diferenças entre as versões. Então, eu NÃO comprometendo, não alterando nada = sem atualizações / alterações locais. Quais comandos devo usar periodicamente (por exemplo, a cada semana mais ou menos) para alcançar as duas funcionalidades acima? Por favor, responda KISS (Keep It Simple Stupid) - eu também sou um git noob e ofc irá RTFM - mas, para começar, preciso de ajuda. ;)
kobame
No seu caso simples, a git pulldeve ser suficiente, eu acho. (Eu atualizei a resposta.)
Paulo Ebermann
e se eu tiver algumas alterações locais que eu não quero confirmar. Agora, quando eu faço um puxão, diz-me para cometê-los ou escondê-los. Então, neste caso, como posso dizer ao git para substituí-los e fazer o pull?
Harshana
89

Você quer fazer

git fetch --prune origin
git reset --hard origin/master
git clean -f -d

Isso torna seu repositório local exatamente como seu repositório remoto.

Lembre-se de substituir a origem e o mestre pelo controle remoto e filial com os quais deseja sincronizar.

aandis
fonte
2
ele também remove todos os diretórios de npm instalar e pavilhão instalar, não é recomendado a menos que queira voltar a instalar todas as dependências que estão em .gitignore
chwagssd
Não removeu o meu node_modules, funciona exatamente como eu quero.
Vahid Amiri
AVISO: Ele remove arquivos untracked
Amit Yadav
Perdi todos os meus dados usando esse código, tentei sincronizar meu repositório local com o repositório git. Mas fez meu repositório global sincronizar com meu repositório local.
Zahid Khan 23/04
10

Redefinir e sincronizar o repositório local com ramificação remota

O comando: Lembre-se de substituir a origem e o mestre pelo controle remoto e filial com os quais deseja sincronizar.

git fetch origin && git reset --hard origin/master && git clean -f -d

Ou passo a passo:

git fetch origin
git reset --hard origin/master
git clean -f -d

Sua filial local agora é uma cópia exata (confirma e tudo) da filial remota.

Saída do comando:

Aqui está um exemplo de execução do comando em um clone local do repositório Forge a git.

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$
Mahendra Pratap
fonte
4

(Esta informação é do Manual do Usuário do Git )

Também estou aprendendo, portanto, isso pode não ser exatamente uma resposta para a pergunta, mas pode ajudar alguém:

  1. Quando um repositório remoto é inicialmente clonado, cópias de todas as ramificações são armazenadas no seu repositório local (visualize-as com git branch -r)
  2. Para atualizar essas cópias e atualizá-las (por exemplo, sincronizá-las com a filial remota), use git fetch. Isso não afetará nenhum de seus ramos criados personalizados existentes.
  3. Para substituir o checkout de sua filial local por uma versão nova de qualquer filial em que você esteja trabalhando (supondo que você já tenha executado git add origin /path/to/repository) git checkout origin/branch_name, isso substituirá as alterações de seus locais na filialbranch_name
tjb
fonte
3

Parece que você deseja um espelho do repositório remoto:

git clone --mirror url://to/remote.git local.git

Esse comando cria um repositório vazio. Se você não quer um repositório vazio, as coisas ficam mais complicadas.

Richard Hansen
fonte
3

Se você estiver falando sobre a sincronização de um repositório bifurcado, siga estas etapas.

Como sincronizar um repositório de bifurcações do git

  1. verifique seu ramo git atual

    git branch

  2. checkout para dominar se você não estiver no master

    git checkout master

  3. Busque o repositório upstream se você tiver direitos de acesso corretos

    git fetch upstream

  4. Se você estiver recebendo o erro abaixo, execute

    git remote add upstream [email protected]:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. Agora execute o comando abaixo.

    git fetch upstream

  6. Agora, se você estiver no master, mescle o upstream / master no branch master

    git merge upstream/master

    É isso aí!!

    Verificação cruzada via git remotecomando, mais específicogit remote -v

    Se eu também tiver direitos de confirmação para o repositório upstream, posso criar uma filial local upstream e fazer um trabalho que irá para lá upstream.

Nishant Upadhyay
fonte
Por que devo fazer o 5.git buscar a montante quando já recebo um erro na terceira etapa?
Md Sifatul Islam 03/03
-2

Você pode usar ganchos git para isso. Basta criar um gancho que empurre a alteração para o outro repositório após uma atualização.

É claro que você pode ter conflitos de mesclagem, então precisa descobrir como lidar com eles.

Makis
fonte