Git Pull ignorando le modifiche locali?


489

C'è un modo per fare un git pullche ignora eventuali modifiche ai file locali senza soffiare via la directory e dover eseguire un git clone?


17
Con "ignora" intendi "sovrascrive"?
Cascabel,

@Cascabel Significa annullare tutte le modifiche locali, annullare il commit di tutti i commit locali, eliminare tutti i nuovi file e directory locali, ripristinare tutti i file e le directory eliminati localmente, ecc. In breve, basta eseguire un comando come se rm -rf local_repo && git clone remote_url.
Victor

Risposte:


820

Se vuoi dire che vuoi che il pull sovrascriva le modifiche locali, eseguendo l'unione come se l'albero di lavoro fosse pulito, beh, pulisci l'albero di lavoro:

git reset --hard
git pull

Se sono presenti file locali non tracciati, è possibile utilizzarli git cleanper rimuoverli. Utilizzare git clean -fper rimuovere file non tracciati, -dfper rimuovere file e directory non -xdftracciati e per rimuovere file o directory non tracciati o ignorati.

Se d'altra parte vuoi mantenere le modifiche locali in qualche modo, useresti stash per nasconderle prima di tirare, quindi riapplicarle in seguito:

git stash
git pull
git stash pop

Non credo abbia alcun senso ignorare letteralmente i cambiamenti, tuttavia - metà del pull è unire e deve unire le versioni impegnate del contenuto con le versioni che ha recuperato.


4
Se dopo che i git resettuoi file sono ancora diversi dal telecomando, leggi stackoverflow.com/questions/1257592/…
Colonnello Panic,

3
Git è la cosa più strana di sempre. Ripristino Git - fatto. Quindi stato git: la tua filiale è in vantaggio di 2 commit.
Shailen

21
@shailenTJ "Modifiche locali" qui significa modifiche senza commit, non commit locali. git reset --hardcolpisce il primo, non il secondo. Se vuoi reimpostare completamente lo stato del telecomando, git reset --hard origin/<branch>ma spesso e in questo caso, quei due impegni che stai precedendo sono il lavoro che hai fatto, non qualcosa che vuoi buttare via.
Cascabel,

2
Quindi è la stessa cosa che distruggere il repository locale e scaricare di nuovo, giusto? Voglio solo essere in grado di forzare l'attrazione e sovrascrivere le modifiche per comodità. Il 99% delle volte ricevo questo messaggio di errore quando ho accidentalmente incasinato qualcosa localmente e voglio solo ricominciare dal repository.
sudo,

Che cosa succede se non è possibile non avere un cambio locale rispetto alla testa? Ad esempio, il repository è stato effettuato su un file system con distinzione tra maiuscole e minuscole ed è clonato su un file system senza distinzione tra maiuscole e minuscole e ci sono 2 file con lo stesso nome con casing diverso?
xster,

305

Per me ha funzionato:

(1) Per prima cosa recupera tutte le modifiche:

$ git fetch --all

(2) Quindi ripristinare il master:

$ git reset --hard origin/master

(3) Pull / aggiornamento:

$ git pull

22
Ha funzionato alla grande per me quando ho avuto molti problemi con la risposta migliore. Grazie!
0x0,

6
questo funziona anche quando hai commesso le tue modifiche locali, ma vuoi comunque ripristinare
agsachin

16
Questa dovrebbe essere la risposta migliore :)
Purus,

5
@Marco Servetto: per prima cosa prendi tutte le tue modifiche git, ma non le applichi ancora. Quindi ripristini il master sull'ultimo stato (aggiornato). Se salti il ​​primo passaggio, ripristinerai le modifiche al vecchio master (locale). Dalla mia esperienza, il modo in cui l'ho descritta, non causa mai problemi. Tutti gli altri tentativi fanno alla fine.
Artur Barseghyan,

1
Questo ha funzionato per me, volevo ignorare tutte le mie modifiche locali, incluso il recupero di file cancellati
Neri,

28

Vuoi solo un comando che dia esattamente lo stesso risultato di rm -rf local_repo && git clone remote_url, giusto? Voglio anche questa funzione. Mi chiedo perché git non fornisca un tale comando (come git recloneo git sync), né svn fornisce tale comando (come svn recheckouto svn sync).

Prova il seguente comando:

git reset --hard origin/master
git clean -fxd
git pull

Questo è ciò che funziona davvero, anche quando hai già commit locali che vuoi rimuovere.
Yuri Ghensev,

5
Attenzione ragazzi !! git clean -fxdrimuove anche i file .gitignore.
Ramesh Navi,

@RameshNavi Certo. Questo è esattamente ciò che si desidera. Ciò che si desidera è disporre di un modo più rapido per ri-clonarlo, ovvero eliminare l'intero repository locale e quindi clonarlo.
Victor,

27

Il comando sotto non funzionerà sempre . Se fai solo:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

e così via...

Per ricominciare davvero , scaricando thebranch e sovrascrivendo tutte le modifiche locali, fai semplicemente:


$ git checkout thebranch
$ git reset --hard origin/thebranch

Funzionerà bene.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
SÌ. Questo è ciò di cui avevo bisogno per un ultimo approccio "non dare una F su ciò che è locale". Grazie. :)
Adambean,

10
git fetch --all && git reset --hard origin/master

8

Guarda git stash per inserire tutte le modifiche locali in un "file stash" e ripristinare l'ultimo commit. A quel punto, puoi applicare le modifiche nascoste o scartarle.


8

Se sei su Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

Il ciclo for eliminerà tutti i file tracciati che vengono modificati nel repository locale, quindi git pullfunzionerà senza problemi.
La cosa più bella di questo è che solo i file tracciati verranno sovrascritti dai file nel repository, tutti gli altri file rimarranno intatti.


Penso che volessi dire "file tracciati" che è esattamente ciò di cui ho bisogno, grazie.
Ali,

qualche equivalente per Powershell?
Earlee,

8

il modo più breve per farlo è:

git pull --rebase --autostash

non sapevo --autostashprima, grazie!
shiro,

7

questo ha funzionato per me

git fetch --all
git reset --hard origin/master
git pull origin master

con la risposta accettata ottengo errori di conflitto


È molto simile alla risposta del 2015 di Artur Barseghyan ... ma mi piacerebbe ancora sapere qual è lo scopo del 3o comando: i file di lavoro sono cambiati dopo il 2o comando e il 3o comando dice "Già aggiornato "
mike rodent,

questa è l'unica combinazione che ha funzionato nel mio ambiente, forse stai vedendo una cosa diversa, per me avevo bisogno dei tre comandi
Pablo Pazos,

Interessante. Potrebbe essere una cosa versione. Sono su git 2.7.4. Ma ho anche visto un nuovo commento di Artur Barseghyan: "Altrimenti potresti ritrovarti a lavorare su un maestro accidentalmente obsoleto".
mike rodent,

forse, ma l'unica cosa che posso dire è "questo ha funzionato per me quando nessun'altra soluzione ha fatto", quindi potrebbe aiutare gli altri
Pablo Pazos,

3

Di solito faccio:

git checkout .
git pull

Nella cartella principale del progetto.


2

Questo recupererà il ramo corrente e tenterà di avanzare rapidamente al master:

git fetch && git merge --ff-only origin/master

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.