Domanda Come impongo "git pull" per sovrascrivere i file locali?


Come impongo una sovrascrittura di file locali su a git pull?

Lo scenario sta seguendo:

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

Questo è l'errore che sto ottenendo:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

Come faccio a 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.


5193
2017-07-14 14:58


origine


risposte:


Importante: se si verificano modifiche locali, queste verranno perse. Con o senza --hard opzione, qualsiasi commit locale che non è stato premuto andrà perso. [*]

Se hai dei file che sono non  monitorato da Git (ad esempio 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 ​​qualche altro ramo:

git reset --hard origin/<branch_name>

Spiegazione:

git fetch scarica l'ultima dal remoto senza tentare di unire o rebase nulla.

Poi il git reset reimposta il ramo master su ciò che hai appena recuperato. Il --hard opzione cambia tutti i file nella struttura di lavoro in modo che corrispondano ai file in origin/master


Mantieni i commit locali correnti

[*] : Vale la pena notare che è possibile mantenere gli attuali commit locali creando un ramo da master prima di resettare:

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

Dopo questo, tutti i vecchi commit verranno mantenuti new-branch-to-save-current-commits.

Modifiche non commesse

Le modifiche non applicate, tuttavia (anche messe in scena), andranno perse. Assicurati di mettere da parte e salvare tutto ciò di cui hai bisogno. Per questo è possibile eseguire quanto segue:

git stash

E poi riapplicare queste modifiche senza commit:

git stash pop

7272
2018-01-17 00:02



Prova questo:

git reset --hard HEAD
git pull

Dovrebbe fare quello che vuoi.


760
2018-05-09 19:45



AVVERTIMENTO: git clean cancella tutti i file / directory non tracciati e non può essere annullato.


A volte semplicemente clean -f non aiuta. Nel caso in cui tu abbia DIRECTORIES non tracciati, anche l'opzione -d ha bisogno di:

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

AVVERTIMENTO: git clean cancella tutti i file / directory non tracciati e non può essere annullato.


381
2018-03-19 09:10



Come Riccio penso che le risposte siano terribili. Ma anche se la risposta di Hedgehog potrebbe essere migliore, non penso che sia così elegante come potrebbe essere. Il modo in cui ho trovato di farlo è utilizzando "fetch" e "merge" con una strategia definita. Il che dovrebbe fare in modo che le modifiche locali vengano mantenute purché non siano uno dei file con cui si tenta 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 se c'è un conflitto

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

"-X" è un nome di opzione e "loro" è il valore per tale opzione. Stai scegliendo di utilizzare le "loro" modifiche, invece delle "tue" modifiche se c'è un conflitto.


334
2018-04-11 20:13



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 è necessario recuperare tutti i telecomandi e le derivazioni se si intende ripristinare la diramazione origine / master correttamente?


237
2018-04-26 13:48



Sembra che il modo migliore sia fare prima:

git clean

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


121
2017-07-14 15:16



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

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

Piuttosto (git> v1.7.6):

git stash --include-untracked
git pull

Più tardi puoi pulire 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

Certo, se vuoi tornare a ciò che hai nascosto:

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

97
2018-02-11 23:00