2010-11-11 20 views

risposta

502

Se vuoi dire si desidera che il tiro di sovrascrivere le modifiche locali, facendo l'unione come se l'albero di lavoro erano pulite, ben, pulire l'albero di lavoro:

git reset --hard 
git pull 

Se ci sono file locali non monitorate è possibile utilizzare git clean per rimuoverli. Utilizzare git clean -f per rimuovere i file non tracciati, -df per rimuovere file e directory non tracciati e -xdf per rimuovere file o directory non tracciati o ignorati.

Se d'altra parte si desidera mantenere le modifiche locali in qualche modo, utilizza scorta di nasconderli via prima di tirare, poi riapplicare loro in seguito:

git stash 
git pull 
git stash pop 

io non credo che rende qualsiasi intuire letteralmente ignorare le modifiche, - metà del pull è unire e deve unire le versioni del contenuto con le versioni scaricate.

+3

Se dopo 'git reset' i file differiscono ancora dal telecomando, leggi http://stackoverflow.com/questions/1257592/removing-files-saying-old-mode-100755-new-mode-100644-from-unstaged- changes-in –

+1

Git è la cosa più strana di sempre. Ripristino Git - difficile fatto. Quindi git status: il tuo ramo è avanti di 2 commit. – shailenTJ

+11

@shailenTJ "Cambiamenti locali" qui significa modifiche non vincolate, non commit locali. 'git reset --hard' influenza il primo, non il secondo. Se vuoi reimpostare completamente allo stato del telecomando, 'git reset --hard source/' - ma spesso e in questo caso, quei due commit che stai prima dell'origine sono il lavoro che hai fatto, non qualcosa che vuoi lanciare lontano. – Cascabel

7

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

7

Se siete su Linux:

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

Il ciclo for cancellerà tutti i file monitorati che vengono cambiati nel repository locale, in modo git pull funzionerà 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.

+0

Penso che intendessi "file tracciati" che è esattamente quello di cui ho bisogno, grazie. – Ali

15

Il comando muggito non funziona sempre. Se lo 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 davvero ricominciare da capo, il download thebranch e sovrascrivere tutte le modifiche locali, basta fare:


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

Questo 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' 
+2

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

120

Per me il seguente lavorato:

(1) In primo luogo prendere tutte le modifiche:

$ git fetch --all 

(2) Quindi ripristinare il maestro:

$ git reset --hard origin/master 

(3) Tirare/aggiornare:

$ git pull 
+5

Ha funzionato benissimo per me quando ho avuto molti problemi con la risposta migliore. Grazie! –

+1

funziona anche quando hai commesso le tue modifiche locali, ma vuoi annullare la conversione – agsachin

+1

Questa dovrebbe essere la risposta migliore :) – Purus

0

Questo preleverà il ramo corrente e tentare di fare un avanzamento veloce da padroneggiare:

git fetch && git merge --ff-only origin/master 
4
git fetch --all && git reset --hard origin/master 
Problemi correlati