Come si estraggono file da remoto senza sovrascrivere i file locali?


113

Sto cercando di configurare un nuovo repository git su un repository remoto preesistente.

Voglio che i miei file locali sovrascrivano il repository remoto, ma git dice che devo prima estrarre quei file remoti e unirli.

C'è un modo per eseguire il pull ma assicurarsi che i file locali non vengano sovrascritti dal telecomando?

Risposte:


182

Ebbene sì e no ...

Capisco che vuoi che le tue copie locali "sovrascrivano" ciò che è nel telecomando, ma, oh, amico, se qualcuno ha modificato i file nel repository remoto in qualche modo diverso , ignori le loro modifiche e provi a "forzare" le tue modifiche senza nemmeno guardare a possibili conflitti, beh, piango per te (e per i tuoi colleghi) ;-)

Detto questo, però, è davvero facile fare la "cosa giusta ..."

Passo 1:

git stash

nel tuo repository locale. Ciò salverà i tuoi aggiornamenti locali nella scorta, quindi ripristinerà i file modificati allo stato precedente alla modifica.

Passo 2:

git pull

per ottenere eventuali versioni modificate. Ora, si spera, ciò non otterrà nuove versioni dei file di cui sei preoccupato. In caso contrario, il passaggio successivo funzionerà senza problemi. Se è così , allora hai del lavoro da fare e sarai felice di averlo fatto.

Passaggio 3:

git stash pop

Ciò unirà le tue versioni modificate che hai nascosto nel passaggio 1 con le versioni che hai appena estratto nel passaggio 2. Se tutto va liscio, allora sarai pronto!

Se, d'altra parte, ci sono stati conflitti reali tra ciò che hai estratto nel passaggio 2 e le tue modifiche (a causa di qualcun altro che ha modificato nel frattempo), lo scoprirai e ti verrà detto di risolverli. Fallo.

Le cose andranno molto meglio in questo modo: probabilmente manterrà le tue modifiche senza alcun lavoro reale da parte tua, avvisandoti di problemi seri e seri.


5
perché non solo git commiti cambiamenti locali prima git pull?
Don Cheadle

10
A volte sono in una posizione in cui non voglio eseguire il commit del codice, ma vorrei mantenerlo nella mia macchina locale, questo insieme di comandi è davvero utile per questo.
Vargan,

3
Ciò non è utile se si dispone di più file, alcuni che si desidera sovrascrivere e altri che non si desidera sovrascrivere. Non c'è modo di dire a GIT di ignorare i file in pull? Perché .gitignore funziona solo per spingere, non capisco affatto quella decisione di progettazione ...
Bobak Hashemi

25

Puoi prima mettere da parte le modifiche locali, quindi estrarre, quindi estrarre la scorta.

git stash
git pull origin master
git stash pop

Tutto ciò che sovrascrive le modifiche da remoto avrà conflitti che dovrai risolvere manualmente.


4
Ho già eseguito il commit di queste modifiche a livello locale in modo che dica che "non sono presenti modifiche locali da salvare"
Joe Isaacson

Penso che questa sia la migliore strategia.
Jimmy Obonyo Abor

13

Quindi hai trasferito le modifiche locali al tuo repository locale. Quindi, per ottenere modifiche remote al tuo repository locale senza apportare modifiche ai tuoi file locali, puoi usare git fetch. In realtà git pullè un'operazione in due fasi: una non distruttiva git fetchseguita da a git merge. Vedi Qual è la differenza tra "git pull" e "git fetch"? per ulteriori discussioni.

Esempio dettagliato:

Supponi che il tuo repository sia così (hai apportato modifiche test2:

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

E il originrepository è così (qualcun altro si è impegnato test1):

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

A questo punto, git si lamenterà e ti chiederà di eseguire il pull prima se provi a eseguire il push del tuo test2in un repository remoto. Se vuoi vedere cos'è test1 senza modificare il tuo repository locale, esegui questo:

$ git fetch

Il tuo repository locale dei risultati sarebbe come questo:

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

Ora hai le modifiche remote in un altro ramo e mantieni intatti i tuoi file locali.

Allora cosa c'è dopo? Puoi fare un git merge, che avrà lo stesso effetto di git pull(se combinato con il precedente git fetch), o, come preferirei, fare un git rebase origin/masterper applicare la tua modifica sopra origin/master, il che ti dà una cronologia più pulita.


grazie per aver spiegato git pull come un git fetch / git merge in due passaggi
cdabel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.