2013-02-28 12 views
61

Ho letto tutte le domande simili su questo; sembra che nessuno dei seguenti ha lavorato:Git Pull non è possibile, file non raggruppati

Delete offending files 
git reset --hard HEAD 
git stash 
git pull 

Quasi ogni combinazione, stashing modifiche e tirando dal repository, si traduce in file unmergable. Mi piacerebbe scartare tutte le modifiche locali e usare solo il telecomando, ma non posso clonare di nuovo (limiti di larghezza di banda e utilizzo di Internet con lo sviluppatore che cerca di farlo). Come faccio a fare questo?

appena provato:

git stash 
git pull 

Inoltre non ha funzionato.

Ulteriori informazioni

C'è un locale di impegnarsi, e il monte ha un commit pure. Ho quindi provato git pull --rebase ma non funziona ancora correttamente ... Questo mi dà errori - "in uscita a causa di un conflitto irrisolto". Se lo faccio git stash, git reset --hard HEAD, git pull --rebase, ottengo l'errore "tiro non è possibile, le modifiche non unite ..."

risposta

146

Pronunciare il telecomando è origin e il ramo è master, e dire si dispone già di master estratto, potrebbe provare quanto segue:

git fetch origin 
git reset --hard origin/master 

Questo fondamentalmente solo prende il ramo attuale e lo punta alla HEAD di il ramo remoto

ATTENZIONE: Come indicato nei commenti, questo sarà buttare via le modifiche locali e sovrascrivere con tutto ciò che è sull'origine.

Oppure si può utilizzare l'impianto idraulico comanda di fare essenzialmente la stessa:

git fetch <remote> 
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>) 
git reset --hard 

EDIT: vorrei spiegare brevemente perché questo funziona.

La cartella .git può contenere i commit per qualsiasi numero di repository. Poiché l'hash del commit è in realtà un metodo di verifica per i contenuti del commit e non solo un valore generato casualmente, viene utilizzato per abbinare le serie di commit tra i repository.

Un ramo è solo un puntatore denominato a un determinato hash. Ecco alcuni esempi:

$ find .git/refs -type f 
.git/refs/tags/v3.8 
.git/refs/heads/master 
.git/refs/remotes/origin/HEAD 
.git/refs/remotes/origin/master 

Ognuno di questi file contiene un hash che punta a un commit:

$ cat .git/refs/remotes/origin/master 
d895cb1af15c04c522a25c79cc429076987c089b 

Questi sono tutti per il meccanismo di memorizzazione git interna, e lavorare in modo indipendente del directory di lavoro . Effettuando le seguenti operazioni:

git reset --hard origin/master 

git punterà il ramo corrente allo stesso valore di hash che i punti di origine/master per. Quindi modifica forzatamente la directory di lavoro in modo che corrisponda alla struttura/contenuto del file a quell'hash.

Per vedere questo al lavoro andare avanti e provare la seguente:

git checkout -b test-branch 
# see current commit and diff by the following 
git show HEAD 
# now point to another location 
git reset --hard <remote>/<branch> 
# see the changes again 
git show HEAD 
+0

Non riesco a testare questo quindi non ho idea se questo funziona - ma ho upvoted per una buona soluzione –

+3

@timothyov Questo è vero, ma in base alla domanda che sentivo che era implicita. –

+1

Dalla recente modifica approvata, aggiungendo all'inizio l'avvertimento, proprio come per sottolineare che è già stato detto: "Quindi [git] cambia la directory di lavoro in modo forzato per abbinare la struttura/i contenuti del file a quell'hash." Ma suppongo che non fosse abbastanza esplicito. –

1

Supponendo che si vuole buttare via tutti i cambiamenti che avete, in primo luogo controllare l'output di git status. Accanto a qualsiasi file che dice "non interposto", esegui git add <unmerged file>. Quindi follow-up con git reset --hard. Ciò eliminerà qualsiasi modifica locale, ad eccezione dei file non tracciati.

+0

Aggiunta qualche altra informazione, questo non funziona ancora correttamente –

+0

Oh, giusto. Potrebbe non dire "non sommersi". Potrebbe anche dire "entrambi modificati" o forse una o due altre cose. Qual è l'output di 'git status'? –

+0

http://prntscr.com/ufyqw –

3

risolto, utilizzando il seguente set di comandi:

git reset --hard 
git pull --rebase 
git rebase --skip 
git pull 

Il trucco è quello di rebase i cambiamenti ... Abbiamo avuto qualche problema rebasing una banale commettere, e così abbiamo semplicemente saltato usando git rebase --skip (dopo aver copiato i file).

1

mi sono risolto con git rimuovere il file unmerged localmente.

$ git rm <the unmerged file name> 
$ git reset --hard 
$ git pull --rebase 
$ git rebase --skip 
$ git pull 
Already up-to-date. 

Quando invio git commit dopo: la risposta di

$ git commit . -m "my send commit" 
On branch master 
Your branch is up-to-date with 'origin/master'. 
nothing to commit, working directory clean 
0

Ryan Stewart è stato quasi. Nel caso in cui in realtà non si vogliono cancellare le modifiche locali, c'è un flusso di lavoro è possibile utilizzare per unire:

  • Run git status. Ti darà una lista di file non divisi.
  • unirli (a mano, ecc)
  • Run git commit

Git commetterà solo le unioni in un nuovo impegno. (Nel mio caso, avevo aggiunto altri file su disco, che non erano concentrati in quel commit.)

Git quindi considera l'unione riuscita e consente di andare avanti.

0

Se mai capita di avere questo problema dopo l'esecuzione di un git fetch e poi git non permette di eseguire git pull a causa di un conflitto di unione (entrambi/file unmerged modificati, e per farvi più frustrato, ha vinto' t ti mostra eventuali marker di conflitto nel file poiché non è ancora stato unito). Se non desideri perdere il tuo lavoro, puoi fare quanto segue.

mette in scena il file.

$ git add filename 

quindi memorizzare le modifiche locali.

$ git stash 

tirare e aggiornare la directory di lavoro

$ git pull 

ripristinare il file locale modificato (git unirà automaticamente se è possibile, in caso contrario risolverlo)

$ git stash pop 

spero che sarà di aiuto.