2012-03-10 11 views
228

Ho biforcuto un repository, quindi ho apportato alcune modifiche e sembra che abbia incasinato tutto.Ripulire una forcella e riavviarla da monte

Desidero ricominciare da capo, utilizzando la corrente upstream/master come base per il mio lavoro.
Devo rinviare il mio repository o cancellarlo del tutto?

risposta

502

La soluzione più semplice sarebbe (usando 'upstream' come il nome remoto riferimento repo originale biforcuta):

git remote add upstream /url/to/original/repo 
git fetch upstream 
git checkout master 
git reset --hard upstream/master 
git push origin master --force 

(Simile a questo GitHub page, section "What should I do if I’m in a bad situation?")

Essere consapevoli del fatto che si può perdere le modifiche fatto sul ramo master (sia localmente, a causa dello reset --hard, sia sul lato remoto, a causa dello push --force).

Un'alternativa sarebbe, se si desidera mantenere il commit su master, per riprodurre questi commit sopra l'attuale upstream/master.
Sostituire la parte di ripristino con un git rebase upstream/master. Dovrai quindi ancora forzare la spinta.
Vedere anche "What should I do if I’m in a bad situation?"


una soluzione più completa, il backup il vostro lavoro corrente (nel caso) è dettagliata in "Cleanup git master branch and move some commit to new branch".

Vedere anche "Pull new updates from original GitHub repository into forked GitHub repository" per illustrare che cos'è "upstream".

upstream


Nota: recenti repos GitHub fanno protect the master branch contro push --force.
Quindi è necessario prima annullare la protezione di master (vedere la figura seguente), quindi re-protect it after force-pushing).

enter image description here

+0

Un altro esempio: https://groups.google.com/group/overtone/msg/ba309fc71f7c03bd – VonC

+3

ciao, ha funzionato benissimo! btw la corretta sintassi di reset è 'git reset --hard upstream/master' – tampe125

+1

@ tampe125 Eccellente. Ho risolto la sintassi di 'git reset' nella risposta. – VonC

20

risposta di amore VonC. Ecco una versione semplice di esso per i principianti.

C'è un telecomando git chiamato origin di cui sono certo che tutti voi siete a conoscenza. Fondamentalmente, puoi aggiungere tutti i telecomandi a un repository git come desideri. Quindi, quello che possiamo fare è introdurre un nuovo telecomando che è il repository originale non la forcella. Mi piace chiamarlo original

Aggiungiamo repo originali alla nostra forcella come telecomando.

git remote add original https://git-repo/original/original.git 

Ora cerchiamo di recuperare il pronti contro termine originale per essere sicuri di avere l'ultima codificato

git fetch original 

Come, VonC suggerito, assicurarsi che siamo sul master.

git checkout master 

Ora per portare la nostra forchetta al passo con le ultime codice sul repo originale, tutto quello che dobbiamo fare è hard reset nostro branch master in conformità con il telecomando originale.

git reset --hard original/master 

e si è fatto :)

+2

Sto diventando 'fatale: argomento ambiguo 'originale/master': revisione sconosciuta o percorso non presente nell'albero di lavoro' sul passaggio finale. Qualche consiglio? – TomNorway

+0

Sembra che questo ti lasci solo delle scorte sul ramo remoto originale. Presumo che manchi un passaggio per resettare la tua forcella al remoto corretto? –

+0

'original' è migliore di' upstream' (che i documenti Github usano), come 'origin/master' è" upstream "di' master' locale. Riduce l'ambiguità. Mi chiedo se è per questo che lo usi? – vaughan

2

seguito @VonC grande risposta. La nuova politica di GitHub non ammette il "force push" sul master. Se ricevi un messaggio di errore come questo, prova i seguenti passaggi. remote: error: GH003: Sorry, force-pushing to master is not allowed.

Per ripristinare in modo efficace la forcella è necessario attenersi alla seguente procedura:

git checkout master 
git reset --hard upstream/master 
git checkout -b tmp_master 
git push origin 

Aprire la forchetta su GitHub, in "Impostazioni -> Settori -> ramo Default" scegliere 'new_master' come nuova impostazione predefinita ramo. Ora è possibile forzare spinta sul ramo 'master':

git checkout master 
git push --force origin 

Quindi è necessario impostare di nuovo 'maestro' come il ramo di default nelle impostazioni GitHub. Per eliminare 'tmp_master':

git push origin --delete tmp_master 
git branch -D tmp_master 

Altre risposte avvertimento circa lossing la modifica si applica ancora, essere carreful.

Problemi correlati