Sovrascrivere la mia filiale locale con una filiale remota


153

Ho completamente abbandonato la mia filiale locale e vorrei ricominciare da capo. La versione sul server è corretta.

Non voglio ricominciare da capo, vorrei usare la mia storia locale per sistemare il mio enorme errore. (Posso se devo.)

git fetch branchnamee git pull branchnamenon funziona. Il messaggio che ricevo è " aggiornato ", tuttavia la mia versione locale non corrisponde a quella del server.

git pull origin/branchnamemi dà un errore " non trovato ".


Risposte:


248

per prima cosa, crea un nuovo ramo nella posizione corrente (nel caso in cui hai bisogno della tua vecchia storia "rovinata"):

git branch fubar-pin

aggiorna il tuo elenco di filiali remote e sincronizza i nuovi commit:

git fetch --all

quindi, reimposta il ramo sul punto in cui origine / ramo punta a:

git reset --hard origin/branch

fai attenzione , questo rimuoverà eventuali modifiche dall'albero di lavoro !


2
+1 ma potresti voler aggiungere un promemoria da fare git fetch originprima del ripristino
Mark Longair,

L'ho fatto con una leggera modifica e non ha funzionato: git fetch - tutti, git reset --hard SHA1OFANOLDCOMMIT, (alcune altre cose), git reset --hard origin / branch. Il risultato finale fu che ero ancora al vecchio commit. Quindi, questo approccio può funzionare in alcuni casi, ma penso che non funzioni affatto.
Greggles,

@greggles: qualche errore? Dopo l'ultimo comando, HEAD deve puntare su origine / ramo.
Knittl

1
@Gavin: no, ciò non influirà in nessun caso su rami diversi da origin/branch. Mai.
Knittl,

1
@greggles So che è molto tardi, ma per le altre persone che si chiedono perché ciò possa accadere, questo approccio funzionerà solo se hai un ramo estratto. Non ha funzionato per te perché eri in uno stato HEAD distaccato (HEAD indica un commit, non un ramo) e questi comandi funzionano solo se HEAD punta a un ramo. Quando lo fai git resetmentre HEAD punta a un ramo, quel ramo seguirà.
Michael Dorst,

60

Quello che faccio quando confondo il mio ramo locale è solo rinominare il mio ramo spezzato e ricontrollare / ramificare di nuovo il ramo a monte:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Quindi se sei sicuro di non voler nulla dal tuo vecchio ramo, rimuovilo:

git branch -D branch-old

Ma di solito lascio il vecchio ramo in giro a livello locale, nel caso avessi qualcosa dentro.


4
Questa sembra la risposta migliore. Aiuta a creare una copia di backup per ogni evenienza e sembra molto probabile che il ramo locale sia una copia esatta di quella remota.
Greggles,

Ottima risposta, utile per me. Un D: La documentazione ufficiale di git-checkout sembra dire che il tuo terzo comando dovrebbe essere: git checkout -b <branch> --track <remote>/<branch>Il tuo funziona ugualmente bene, senza il --track?
Starman,

1
Penso che il config var branch.autoSetupMerge(che penso sia impostato su true) rende --trackimplicito. E, sì, in tutte le mie configurazioni git non ho bisogno di farlo esplicitamente --trackquando faccio un checkout -b, ma YMMV.
Casey Marshall,

5

La tua filiale locale probabilmente ha delle modifiche che vuoi scartare. Per fare ciò, è necessario utilizzare git resetper ripristinare la testa del ramo all'ultimo punto divergente dal ramo del repository a monte. Utilizzare git branch -vper trovare l'id sha1 del ramo a monte e reimpostarlo utilizzando il proprio ramo git reset SHA1ID. Quindi dovresti essere in grado di fare un git checkoutper annullare le modifiche rimaste nella tua directory.

Nota: eseguire sempre questa operazione su un repository di backup. In questo modo puoi assicurarti di aver funzionato bene. In caso contrario, è necessario ripristinare un backup.


Sembra che probabilmente funzionerebbe, ma data la semplicità e l'affidabilità dell'approccio "fai una copia del tuo lavoro da qualche altra parte, crea una nuova copia del ramo remoto" Non vedo come sia meglio.
Greggles,

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.