Como faço para obter arquivos remotos sem sobrescrever os arquivos locais?

112

Estou tentando configurar um novo repo git para um repo remoto pré-existente.

Quero que meus arquivos locais sobrescrevam o repositório remoto, mas o git diz que primeiro preciso puxar esses arquivos remotos e mesclá-los.

Existe alguma maneira de puxar, mas certifique-se de que os arquivos locais não sejam sobrescritos pelo remoto?

Joe Isaacson
fonte

Respostas:

181

Bem, sim e não ...

Eu entendo que você deseja que suas cópias locais "substituam" o que está no remoto, mas, cara, se alguém modificou os arquivos no repositório remoto de alguma maneira diferente , e você simplesmente ignora as alterações e tenta "forçar" suas próprias mudanças, mesmo sem olhar para os possíveis conflitos, bem, eu choro por você (e seus colegas de trabalho) ;-)

Dito isso, é realmente fácil fazer a "coisa certa ..."

Passo 1:

git stash

em seu repositório local. Isso salvará suas atualizações locais no estoque e, em seguida, reverterá seus arquivos modificados de volta ao estado de pré-edição.

Passo 2:

git pull

para obter qualquer versão modificada. Agora, com sorte, isso não gerará nenhuma nova versão dos arquivos com os quais você está preocupado. Caso contrário, a próxima etapa funcionará sem problemas. Se ele faz , então você tem algum trabalho a fazer, e você será feliz que você fez.

Etapa 3:

git stash pop

Isso irá mesclar suas versões modificadas que você guardou na Etapa 1 com as versões que você acabou de obter na Etapa 2. Se tudo correr bem, você estará pronto!

Se, por outro lado, houver conflitos reais entre o que você puxou na Etapa 2 e suas modificações (devido à edição de outra pessoa nesse ínterim), você descobrirá e receberá instruções para resolvê-los. Faça.

As coisas funcionarão muito melhor desta forma - provavelmente manterá suas alterações sem nenhum trabalho real de sua parte, enquanto o alertará sobre problemas sérios.

Bob Gilmore
fonte
5
por que não apenas git commitmudanças locais antes git pull?
Don Cheadle de
10
Às vezes, estou em uma posição em que não quero confirmar o código, mas gostaria de mantê-lo em minha máquina local, esse conjunto de comandos é realmente útil para isso.
Vargan
3
Isso não é útil se você tiver vários arquivos, alguns que gostaria de sobrescrever e outros que não deseja sobrescrever. Não há como dizer ao GIT para ignorar arquivos no pull? Por que .gitignore só funciona para empurrar, não entendo essa decisão de design ...
Bobak Hashemi
25

Você pode esconder suas alterações locais primeiro, depois puxar e depois abrir o esconderijo.

git stash
git pull origin master
git stash pop

Qualquer coisa que substitua as alterações remotas terá conflitos que você terá que resolver manualmente.

Ryan Bigg
fonte
4
Já efetuei essas alterações localmente para que diga que "não há alterações locais para salvar"
Joe Isaacson
eu acho que essa é a melhor estratégia.
Jimmy Obonyo Abor
13

Então você comprometeu suas mudanças locais em seu repositório local. Então, para obter mudanças remotas em seu repositório local sem fazer mudanças em seus arquivos locais, você pode usar git fetch. Na verdade, git pullé uma operação de duas etapas: uma não destrutiva git fetchseguida por a git merge. Veja Qual é a diferença entre 'git pull' e 'git fetch'? para mais discussão.

Exemplo detalhado:

Suponha que seu repositório seja assim (você fez alterações test2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

E o originrepositório é assim (alguém fez um commit test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

Neste ponto, o git reclamará e pedirá que você faça o pull primeiro, se você tentar empurrar test2para o repositório remoto. Se você quiser ver o que é test1 sem modificar seu repositório local, execute isto:

$ git fetch

Seu repositório local de resultados seria assim:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

Agora você tem as alterações remotas em outro branch e mantém seus arquivos locais intactos.

Então o que vem a seguir? Você pode fazer um git merge, que terá o mesmo efeito que git pull(quando combinado com o anterior git fetch), ou, como eu preferiria, fazer um git rebase origin/masterpara aplicar sua alteração em cima origin/master, o que lhe dará um histórico mais limpo.

Penghe Geng
fonte
obrigado por explicar o git pull como um git fetch / git merge de duas etapas
cdabel