Come posso forzare "git pull" per sovrascrivere i file locali?


7191

Come forzare una sovrascrittura di file locali su un git pull?

Lo scenario è il seguente:

  • Un membro del team sta modificando i modelli per un sito Web su cui stiamo lavorando
  • Stanno aggiungendo alcune immagini alla directory delle immagini (ma si dimentica di aggiungerle sotto il controllo del codice sorgente)
  • Mi invieranno le immagini per posta, più tardi
  • Sto aggiungendo le immagini sotto il controllo del codice sorgente e le sto spingendo su GitHub insieme ad altre modifiche
  • Non possono estrarre gli aggiornamenti da GitHub perché Git non vuole sovrascrivere i propri file.

Questo è l'errore che sto ricevendo:

errore: il file dell'albero di lavoro non tracciato 'public / images / icon.gif' verrebbe sovrascritto dall'unione

Come posso forzare Git a sovrascriverli? La persona è un designer - di solito risolvo tutti i conflitti a mano, quindi il server ha la versione più recente che devono solo aggiornare sul proprio computer.


17
chiunque legga questo che pensa di poter perdere dei file, sono stato in questa posizione e ho scoperto che il buffer di Sublime Text mi ha salvato - se sto lavorando su qualcosa, quindi elimina accidentalmente tutto cercando di risolvere un problema simile a questo o usando una risposta a questa domanda e ho avuto i file aperti in Sublime (di cui c'è una buona possibilità) quindi i file saranno ancora lì è Sublime, o proprio lì, o nella cronologia degli annullamenti
Toni Leigh

64
git reset --hard origin/branch_to_overwrite
Andrew Atkinson,

1
in pratica, fai un pull da sviluppo dopo il checkout iniziale -b. fai il tuo lavoro, poi torna indietro.
LDGORMAN,

1
Risposta breve: elimina e ricrea il ramo. 1. Elimina ramo: git branch <branch> -D2. Ripristina un commit prima del conflitto: git reset <commit> --hard3. Ricrea il ramo: git branch <branch>4. Imposta il monitoraggio sul server: git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull`
Nino Filiu,

1
Per cambiare tutti i finali CRLF in LF, (inizia pulito)git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
Chloe,

Risposte:


10044

Importante: in caso di modifiche locali, queste andranno perse. Con o senza --hardopzione, tutti gli commit locali che non sono stati inviati verranno persi. [*]

Se si dispone di file non monitorati da Git (ad es. Contenuto utente caricato), questi file non saranno interessati.


Penso che questo sia il modo giusto:

git fetch --all

Quindi, hai due opzioni:

git reset --hard origin/master

OPPURE Se ti trovi in ​​un'altra filiale:

git reset --hard origin/<branch_name>

Spiegazione:

git fetch scarica le ultime dal telecomando senza tentare di unire o rifare nulla.

Quindi git resetreimposta il ramo principale su ciò che hai appena recuperato. L' --hardopzione modifica tutti i file dell'albero di lavoro in modo che corrispondano ai file inorigin/master


Mantieni gli impegni locali correnti

[*] : Vale la pena notare che è possibile mantenere gli attuali commit locali creando una succursale masterprima di ripristinare:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

Dopodiché, tutti i vecchi commit verranno mantenuti new-branch-to-save-current-commits.

Modifiche non confermate

Le modifiche non confermate, tuttavia (anche in fasi), andranno perse. Assicurati di riporre e impegnare tutto ciò di cui hai bisogno. Per questo è possibile eseguire quanto segue:

git stash

E quindi applicare nuovamente queste modifiche non impegnate:

git stash pop

14
Attento! Se hai commit locali non compressi, questo li rimuoverà dal tuo ramo! Questa soluzione mantiene intatti i file non tracciati nel repository, ma sovrascrive tutto il resto.
Matthijs P,

479
È una domanda popolare, quindi vorrei chiarire il commento in alto qui. Ho appena eseguito i comandi come descritto in questa risposta e non ha rimosso TUTTI i file locali. Solo i file tracciati in remoto sono stati sovrascritti e ogni file locale che è stato qui è stato lasciato intatto.
Rosso,

14
nel caso in cui stai effettuando il pull da un repository che ha il suo nome di ramo remoto diverso da "master", usagit reset --hard origin/branch-name
Nerrve il

97
Vista la quantità di voti a questa domanda e risposta, penso che git dovrebbe incorporare un comando del tipogit pull -f
Sophivorus,

7
I commit che non sono stati inviati prima che l'hard reset possa essere recuperato utilizzando git reflog, che elenca tutti i commit, anche quelli senza base. Fino a quando non ripulisci la tua copia locale usando git gc, allora tutto è perduto
Koen.

936

Prova questo:

git reset --hard HEAD
git pull

Dovrebbe fare quello che vuoi.


16
Ho fatto questo e alcuni file locali che non erano più in repository sono stati lasciati sul disco.
Piotr Owsiak,

26
Non penso che sia corretto. quanto sopra eseguirà un'unione, non la sovrascrittura richiesta nella domanda: "Come forzare git a sovrascriverle?" Non ho la risposta, al momento la sto cercando .. al momento passo al ramo con il codice che voglio mantenere "git checkout BranchWithCodeToKeep", quindi faccio "git branch -D BranchToOverwrite" e infine finalmente "git checkout -b BranchToOverwrite". ora avrai il codice esatto da BranchWithCodeToKeep sul ramo BranchToOverwrite senza dover eseguire un'unione.
Felbus,

252
invece di fondere usando 'git pull', prova git fetch --all seguito da 'git reset --hard origin / master'
Lloyd Moore,

5
sì, la soluzione @lloydmoore ha funzionato per me. Potrebbe fare con l'essere una risposta piuttosto che solo un commento.
Max Williams,

2
Ciò ripristinerà le modifiche correnti all'ultimo commit del ramo estratto. Quindi git pull unisce le modifiche dall'ultimo ramo. Questo ha fatto esattamente quello che volevo che facesse .. Grazie!
Codeversed

459

ATTENZIONE: git cleanelimina tutti i file / directory non tracciati e non può essere annullato.


A volte clean -fnon aiuta. Se hai DIRECTORIES non tracciati, l'opzione -d aveva bisogno anche di:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

ATTENZIONE: git cleanelimina tutti i file / directory non tracciati e non può essere annullato.

Valuta di usare prima il flag -n( --dry-run). Questo ti mostrerà cosa verrà eliminato senza cancellare nulla:

git clean -n -f -d

Esempio di output:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

33
Fantastico ... Ho corso contro il mio repo di dotfile ... Nella mia home directory. Bene, non avevo davvero niente di importante lì ...
Lauri,

7
Penso che la descrizione dello scenario chiarisca che non vuole davvero buttare via il contenuto. Piuttosto quello che vuole è smettere di git baulking a sovrascrivere i file. @Lauri, questo non avrebbe dovuto succederti. Sfortunatamente le persone sembrano aver letto male l'essenza della descrizione dello scenario - vedi il mio suggerimento.
Riccio,

19
FINALMENTE . git clean -f -d è utile quando make clean non riesce a pulire tutto.
earthmeLon

7
@crizCraig a meno che non vengano aggiunti in.gitignore
Bleeding Fingers il

5
@earthmeLon, per quello che potresti desiderare git clean -dfx. I -xignora .gitignore. In genere i tuoi prodotti build saranno in .gitignore.
Paul Draper,

384

Come il riccio, penso che le risposte siano terribili. Ma sebbene la risposta di Hedgehog potrebbe essere migliore, non penso che sia elegante come potrebbe essere. Il modo in cui ho scoperto di farlo è utilizzando "recupera" e "unisci" con una strategia definita. Il che dovrebbe far sì che le modifiche locali vengano mantenute purché non siano uno dei file con cui si sta tentando di forzare una sovrascrittura.

Prima fai un commit delle tue modifiche

 git add *
 git commit -a -m "local file server commit message"

Quindi recuperare le modifiche e sovrascrivere in caso di conflitto

 git fetch origin master
 git merge -s recursive -X theirs origin/master

"-X" è un nome di opzione e "loro" è il valore di tale opzione. Stai scegliendo di utilizzare le "loro" modifiche, anziché le "tue" modifiche in caso di conflitto.


56
Questa è la migliore risposta che ho visto finora. Non l'ho provato, ma a differenza di altre risposte, questo non tenta di cancellare tutti i file non tracciati, il che è molto pericoloso per ovvie ragioni.
huyz,

5
Idem - questo ha funzionato per me quando ho fatto una fusione molto grande (richiesta pull di GitHub) dove volevo solo accettare tutto in cima a quello che avevo. Buona risposta! Nel mio caso gli ultimi due comandi erano: 1) get fetch other-repo; 2)git merge -s recursive -X theirs other-repo/master
quux00,

2
Questo sovrascriverà eventuali conflitti con i file dei repository e non con quelli locali, giusto?
Nathan F.

2
Migliore risposta. La risposta più alta accettata mi ha lasciato nel mio caso sulla testa distaccata. git merge -X theirs origin/master
Tornai

2
Il problema con questa (eccellente) risposta è che aggiunge tutti i file locali, che a volte potrebbero non essere quello che vuoi. Potresti semplicemente voler aggiungere i file specifici che sono stati omessi. Ma la cosa migliore è che lo fa fare quello che avrebbe dovuto fare - aggiungerli localmente. Probabilmente non avrai bisogno della loro strategia -X, dato che sono la stessa immagine. In effetti, suggerirei di lasciarlo all'inizio, solo per scoprire se ci sono anomalie, e aggiungerlo se ci sono, dopo aver esaminato che "loro" è sempre la scelta corretta. Ma poi, sono paranoico.
Bob Kerns,

279

Invece di fare:

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

Consiglierei di fare quanto segue:

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

Non hai bisogno di recuperare tutti i telecomandi e le filiali se hai intenzione di ripristinare il ramo di origine / master giusto?


3
La tua risposta è proprio ciò di cui hai bisogno per il tuo rappresentante. Devo chiedere, questo rimuove anche tutti i file non monitorati?
Nicolas De Jay,

5
Sì, la maggior parte del mio rappresentante viene da qui :) Questo rimuoverà anche tutti i file non tracciati. Qualcosa che avevo dimenticato e ricordato dolorosamente solo 2 giorni fa ...
Johanneke,

1
Vedere i commenti su questo altra risposta: stackoverflow.com/a/8888015/2151700
Johanneke

Questo non ha rimosso i miei file non tracciati; che in realtà è quello che mi aspetterei. C'è una ragione per alcune persone e non per altre?
arichards,

I file non tracciati non sono influenzati da git reset. Se vuoi che vengano rimossi anche loro, fallo git add .prima, primagit reset --hard
Johanneke del

131

Sembra che il modo migliore sia prima fare:

git clean

Per eliminare tutti i file non tracciati e quindi continuare con il solito git pull...


4
Ho provato a usare "git clean" per risolvere lo stesso problema, ma non è stato risolto. Lo stato git dice "Il tuo ramo e 'origine / master' sono divergenti, # e hanno rispettivamente 2 e 9 commit diversi ciascuno". e git pull dice qualcosa di simile a quello che hai sopra.
slacy,

43
git clean è uno strumento piuttosto schietto e potrebbe gettare via un sacco di cose che potresti voler conservare. Meglio rimuovere o rinominare i file di cui Git si lamenta fino a quando il pull non riesce.
Neil Mayhew,

2
Non penso che questo funzioni in generale. Non c'è un modo per fare fondamentalmente un telecomando clone git tramite un git pull forzato?
matematico

10
@mathick:git fetch origin && git reset --hard origin/master
Arrowmaster,

3
La git cleanrisposta migliore è qui? Sembra che rimuovere i file non sia necessariamente quello che l'OP vuole. Hanno chiesto "una sovrascrittura dei file locali" e non la cancellazione.
John Allen

111

Attenzione, facendo questo eliminerai definitivamente i tuoi file se hai qualche directory / * voci nel tuo file gitignore.

Alcune risposte sembrano essere terribili. Terribile nel senso di quello che è successo a @Lauri seguendo il suggerimento di David Avsajanishvili.

Piuttosto (git> v1.7.6):

git stash --include-untracked
git pull

Successivamente è possibile ripulire la cronologia di scorta.

Manualmente, uno per uno:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Brutalmente, tutto in una volta:

$ git stash clear

Ovviamente se vuoi tornare a ciò che hai nascosto:

$ git stash list
...
$ git stash apply stash@{5}

2
No, non la penso così. Lo stashing sposta semplicemente i file senza commit. Quanto sopra sposta anche (stash) i file che Git non tiene traccia. Questo evita che i file che sono stati aggiunti al telecomando, che non sono stati ancora scaricati sul computer, ma che sono stati creati (!), Vengano eliminati. Tutto senza distruggere il lavoro senza impegno. Spero che abbia un senso?
Riccio

3
Se non si dispone di 1.7.6, è possibile simulare --include-untrackedsemplicemente temporaneamente git addl'intero repository, quindi riporlo immediatamente.
nategood

3
Sono d'accordo con Hedgehog. Se fai le risposte popolari qui, è molto probabile che scoprirai di aver inavvertitamente ucciso un sacco di cose che non volevi davvero perdere.
Guardius

1
Avevo altri file non tracciati - oltre a quello che l'unione / pull voleva sovrascrivere, quindi questa soluzione ha funzionato meglio. git stash applyha riportato tutti i miei file non tracciati con l'eccezione (giustamente) di quelli che la fusione aveva già creato: "esiste già, nessun checkout". Ha funzionato perfettamente.
BigBlueHat

2
Questa è la risposta più pulita e dovrebbe essere quella accettata. Per risparmiare qualche digitazione è possibile utilizzare questo breve modulo: git stash -u.
ccpizza,

93

Questo comando potrebbe essere utile per eliminare le modifiche locali:

git checkout <your-branch> -f

E quindi eseguire una pulizia (rimuove i file non tracciati dall'albero di lavoro):

git clean -f

Se si desidera rimuovere le directory non tracciate oltre ai file non tracciati:

git clean -fd

Penso che la descrizione dello scenario chiarisca che non vuole davvero buttare via il contenuto. Piuttosto quello che vuole è smettere di git baulking a sovrascrivere i file. Vedi il mio suggerimento.
Riccio,

3
Sebbene quella risposta potrebbe non corrispondere esattamente alla descrizione, mi ha comunque salvato dalla frustrazione di git che gioca con i ritorni a capo (evento con autocrlf falso). Quando git reset --hard HEAD non ti lascia "nessun" file modificato, questi flag "-f" sono abbastanza utili. Grazie mille.
Kellindil,

88

Invece di fonderti con git pull, prova questo:

git fetch --all

seguito da:

git reset --hard origin/master.


61

L'unica cosa che ha funzionato per me è stata:

git reset --hard HEAD~5

Questo ti riporterà cinque commit e poi con

git pull

Ho scoperto che cercando come annullare un'unione Git .


Questo è ciò che alla fine ha funzionato per me, dato che avevo forzato il mio ramo nel repository di origine e continuavo a ottenere conflitti di unione quando provavo a portarlo nel mio repository remoto ..
jwfrench,

Ciao, in realtà questo è un trucco per un work aroundma davvero efficace. Poiché alcuni conflitti possono verificarsi solo in pochi commit, il ripristino di 5 commit assicurerà l'assenza di conflitti con il codice remoto.
Hoang,

54

Il problema con tutte queste soluzioni è che sono tutte troppo complesse o, un problema ancora più grande, è che rimuovono tutti i file non tracciati dal server Web, cosa che non vogliamo poiché ci sono sempre file di configurazione necessari che si trovano su il server e non nel repository Git.

Ecco la soluzione più pulita che stiamo usando:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • Il primo comando recupera i dati più recenti.

  • Il secondo comando controlla se ci sono file che vengono aggiunti al repository ed elimina dal repository locale quei file non tracciati che potrebbero causare conflitti.

  • Il terzo comando esegue il checkout di tutti i file che sono stati modificati localmente.

  • Infine, facciamo un tentativo per aggiornare alla versione più recente, ma questa volta senza conflitti, poiché i file non tracciati presenti nel repository non esistono più e tutti i file modificati localmente sono già gli stessi del repository.


L'uso di "git merge origin / master" come ultima riga (come dici nella nota) invece di "git pull" sarà più veloce poiché hai già rimosso tutte le modifiche dal repository git.
Josh,

1
Sì, certo, git merge origin/mastersarà più veloce e probabilmente anche più sicuro. Dal momento che se qualcuno spingesse nuove modifiche durante la rimozione dei file di questo script (che non è probabile che accada, ma possibile), l'intero pull potrebbe fallire. L'unica ragione per cui vi ho inserito pullè che qualcuno potrebbe non lavorare sul ramo principale, ma su qualche altro ramo e volevo che la sceneggiatura fosse universale.
Strahinja Kustudic,

Se hai creato file locali come file di opzioni, inseriscili .gitignore.
Sebi,

52

Prima di tutto, prova nel modo standard:

git reset HEAD --hard # To remove all not committed changes!
git clean -fd         # To remove all untracked (non-git) files and folders!

Avvertenza : i comandi precedenti possono comportare la perdita di dati / file solo se non li hai impegnati! Se non si è sicuri, eseguire prima il backup dell'intera cartella del repository.

Quindi tiralo di nuovo.

Se sopra non aiuta e non ti importa dei file / directory non tracciati (esegui prima il backup per ogni evenienza), prova i seguenti semplici passaggi:

cd your_git_repo  # where 'your_git_repo' is your git repository folder
rm -rfv *         # WARNING: only run inside your git repository!
git pull          # pull the sources again

Questo RIMUOVERÀ tutti i file git (excempt .git/dir, dove hai tutti i commit) e lo tirerà di nuovo.


Perché git reset HEAD --hardin alcuni casi potrebbe fallire?

  1. Regole personalizzate in .gitattributes file

    Avere la eol=lfregola in .gitattributes potrebbe far sì che git modifichi alcune modifiche ai file convertendo le terminazioni di linea CRLF in LF in alcuni file di testo.

    In tal caso, devi eseguire il commit di queste modifiche CRLF / LF (rivedendole git status) o provare: git config core.autcrlf falseignorarle temporaneamente.

  2. Incompatibilità del file system

    Quando si utilizza un file system che non supporta gli attributi di autorizzazione. Ad esempio, hai due repository, uno su Linux / Mac ( ext3/ hfs+) e un altro sul file system basato su FAT32 / NTFS.

    Come noterai, ci sono due diversi tipi di file system, quindi quello che non supporta le autorizzazioni Unix non può sostanzialmente ripristinare le autorizzazioni dei file sul sistema che non supporta quel tipo di autorizzazioni, quindi non importa come --hardci provi, git rileva sempre alcuni "cambiamenti".


47

Ho avuto lo stesso problema. Nessuno mi ha dato questa soluzione, ma ha funzionato per me.

L'ho risolto con:

  1. Elimina tutti i file. Lascia solo la .gitdirectory.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Ora funziona.


1
Anch'io. A volte funziona solo la soluzione molto difficile, capita spesso che solo reset e clean non siano sufficienti in qualche modo ...
jdehaan,

41

Bonus:

Parlando di pull / fetch / merge nelle risposte precedenti, vorrei condividere un trucco interessante e produttivo,

git pull --rebase

Questo comando sopra è il comando più utile nella mia vita di Git che mi ha fatto risparmiare molto tempo.

Prima di inviare il tuo nuovo commit al server, prova questo comando e sincronizzerà automaticamente le ultime modifiche del server (con un fetch + merge) e posizionerà il tuo commit in alto nel registro Git. Non è necessario preoccuparsi del pull / merge manuale.

Trova i dettagli in Cosa fa "git pull --rebase"? .


3
In breve: git pull -r.
Kenorb,

29

Ho avuto un problema simile. Ho dovuto fare questo:

git reset --hard HEAD
git clean -f
git pull

6
usare git cleancon cautela
nategood

29

Ho riassunto altre risposte. Puoi eseguire git pullsenza errori:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

Avvertenza : questo script è molto potente, quindi potresti perdere le modifiche.


2
Ciò sovrascriverà i file modificati (file precedentemente archiviati) e rimuoverà i file non tracciati (file che non sono mai stati registrati). Esattamente quello che stavo cercando, grazie!
Styfle

3
Sospetto che la terza riga git reset --hard HEADpossa essere ridondante; la mia pagina man locale (2.6.3) dice che resetnella seconda riga git reset --hard origin/master "per impostazione predefinita HEAD in tutte le forme".
arichards,

2
@arichards Penso che il tuo sospettato abbia ragione, ma se la seconda linea non funzionerà (per qualsiasi motivo) la terza linea funzionerà bene per resettare. Non è necessario ottimizzare questa soluzione. Ho appena sintetizzato altre risposte. È tutto. Grazie per il tuo commento. :)
Robert Moon,

28

Sulla base delle mie esperienze simili, la soluzione offerta da Strahinja Kustudic sopra è di gran lunga la migliore. Come altri hanno sottolineato, semplicemente facendo un hard reset si rimuoveranno tutti i file non tracciati che potrebbero includere molte cose che non si desidera rimuovere, come i file di configurazione. Ciò che è più sicuro, è rimuovere solo i file che stanno per essere aggiunti e, del resto, è probabile che tu voglia controllare anche tutti i file modificati localmente che stanno per essere aggiornati.

Ciò in mente, ho aggiornato la sceneggiatura di Kustudic per fare proprio questo. Ho anche corretto un refuso (mancante 'nell'originale).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull

L'uso di "git merge origin / master" come ultima riga (come dici nella nota) invece di "git pull" sarà più veloce poiché hai già rimosso tutte le modifiche dal repository git.
Josh,

È necessario il checkout dei file modificati, quindi funziona al 100% delle volte. Ho aggiornato la mia sceneggiatura molto tempo fa, ma ho dimenticato di aggiornare anche qui. Lo uso anche in modo leggermente diverso da te. Controllo i file che hanno qualsiasi tipo di modifica, non solo M, quindi funziona sempre.
Strahinja Kustudic,

24

Credo che ci siano due possibili cause di conflitto, che devono essere risolte separatamente, e per quanto ne so nessuna delle risposte di cui sopra riguarda entrambe:

  • I file locali non tracciati devono essere eliminati, manualmente (più sicuri) o come suggerito in altre risposte, entro git clean -f -d

  • Anche i commit locali che non si trovano nella filiale remota devono essere eliminati. IMO il modo più semplice per raggiungere questo obiettivo è: git reset --hard origin/master(sostituisci "master" con qualsiasi ramo su cui stai lavorando ed esegui un git fetch originprimo)


22

Un modo più semplice sarebbe:

git checkout --theirs /path/to/file.extension
git pull origin master

Questo sovrascriverà il tuo file locale con il file su git


21

Sembra che la maggior parte delle risposte qui siano focalizzate sul masterramo; tuttavia, ci sono momenti in cui sto lavorando allo stesso ramo di funzionalità in due luoghi diversi e voglio che un rebase in uno si rifletta nell'altro senza saltare molti cerchi.

Sulla base di una combinazione della risposta di RNA e della risposta di Torek a una domanda simile , ho trovato questo che funziona magnificamente:

git fetch
git reset --hard @{u}

Esegui questo da un ramo e reimposterà il tuo ramo locale solo alla versione upstream.

Questo può essere ben inserito anche in un git alias ( git forcepull):

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Oppure, nel tuo .gitconfigfile:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

Godere!


Questa risposta è buona anche perché funziona indipendentemente dal ramo in cui ti trovi!
farina di foglie

19

Ho avuto lo stesso problema e per qualche motivo, anche a git clean -f -dnon lo farei. Ecco perché: per qualche motivo, se il tuo file viene ignorato da Git (tramite una voce .gitignore, suppongo), si preoccupa ancora di sovrascriverlo con un pull successivo , ma un clean non lo rimuoverà, a meno che non lo aggiungi -x.


19

Conosco un metodo molto più semplice e meno doloroso:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

Questo è tutto!


18

L'ho risolto da solo:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

dove l'ultimo comando fornisce un elenco delle modifiche locali. Continua a modificare il ramo "tmp" fino a quando non è accettabile, quindi ricollegalo al master con:

git checkout master && git merge tmp

Per la prossima volta, puoi probabilmente gestirlo in modo più pulito guardando "git stash branch" anche se è probabile che stash possa causare problemi nei primi tentativi, quindi fai prima un esperimento su un progetto non critico ...


17

Ho una situazione strana che né git cleano git resetopere. Devo rimuovere il file in conflitto git indexutilizzando lo script seguente su ogni file non tracciato:

git rm [file]

Quindi sono in grado di tirare bene.


16

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


14

Nonostante la domanda originale, le risposte migliori possono causare problemi alle persone che hanno un problema simile, ma non vogliono perdere i loro file locali. Ad esempio, vedi i commenti di Al-Punk e crizCraig.

La versione seguente memorizza le modifiche locali in un ramo temporaneo ( tmp), verifica il ramo originale (che presumo sia master) e unisce gli aggiornamenti. Potresti farlo con stash, ma ho scoperto che di solito è più semplice usare semplicemente l'approccio branch / merge.

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

dove si assume l' altro repository è origin master.


13

Questi quattro comandi funzionano per me.

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

Per controllare / tirare dopo aver eseguito questi comandi

git pull origin master

Ci ho provato molto ma alla fine ho avuto successo con questi comandi.


2
"git branch -D master" cancella il ramo. quindi stai attento. Preferisco usare "git checkout origin / master -b <nome nuovo ramo>" che crea un nuovo ramo con un nuovo nome e hai bisogno di 3,4 righe. Si consiglia inoltre di utilizzare anche "git clean -f".
Chand Priyankara,

13

Basta fare

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

Quindi eviti tutti gli effetti collaterali indesiderati, come l'eliminazione di file o directory che desideri conservare, ecc.


12

Ripristina l'indice e la testa su origin/master, ma non ripristinare l'albero di lavoro:

git reset origin/master

Personalmente l'ho trovato molto utile. Quindi mantiene l'albero di lavoro in modo da poterlo controllare di nuovo. Per il mio problema, ho eliminato gli stessi file che sono stati aggiunti, quindi è stato bloccato. Strano, lo so.
Jason Sebring,

12

Requisiti:

  1. Tieni traccia delle modifiche locali in modo che nessuno qui le perda mai.
  2. Rendi il repository locale corrispondente al repository di origine remoto.

Soluzione:

  1. Riporta le modifiche locali.
  2. Fetch con un pulito di file e directory ignorando .gitignore e hard reset di origine .

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard 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.