Git: annulla tutte le modifiche su un ramo locale divergente


117

Ho un ramo di argomento locale che tiene traccia di un ramo remoto. Per amor di discussione, supponiamo che le cronologie dei commit abbiano questo aspetto:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

Dopo aver esaminato le cronologie dei commit relativi, ora voglio scartare tutte le modifiche al phobosramo locale e riportarlo ad essere una copia diretta di origin/phobos, in modo che la cronologia locale sia simile a questa:

A--B--C--O1--O2--O3 (phobos origin/phobos)

Non voglio davvero che le modifiche locali al phobosramo e davvero non voglio che nessuna fusione appaia in seguito nel repository di origine. (Quindi, solo l'unione non è ciò che ho in mente.)

Sembra che dovrebbe essere davvero facile, ma il mio google-fu mi ha deluso. Come faccio a fare questo?

Risposte:


79

Elimina il ramo, quindi ricrealo:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos

37
Un problema con questo approccio rispetto al ripristino della testa del ramo è che l'eliminazione del ramo spazza via il reflog del ramo. Il ripristino del ramo, d'altra parte, non solo preserva il reflog, ma registra effettivamente il ripristino nel reflog. Questo rende l'operazione facilmente reversibile in seguito, se necessario.
Dan Moulding

9
@Electrons_Ahoy Suggerirei di cambiare la risposta accettata qui in quella di Dan (in modo che le persone come me che hanno cercato su Google come farlo probabilmente scelgono il metodo più sicuro).
Steve Chambers,

4
La risposta di @ DanMoulding non implica l'eliminazione di un ramo locale quando non è necessario. È molto più sicuro.
brma

@brma: come mai? Sta ancora puntando solo un ramo a un nuovo commit.
mipadi

5
La risposta di Dan Moulding è più sicura. Penso che dovresti selezionare quello.
Daniel Apt

331
git checkout phobos
git reset --hard origin/phobos

Questo dice a Git di reimpostare l'intestazione di phobosallo stesso commit di origin/phobose di aggiornare l'albero di lavoro in modo che corrisponda.


35
IMO questa dovrebbe essere la risposta accettata; emette il comando "reset" per trapiantare il branch pointer, invece di eseguire un intervento chirurgico con rimozione / ricostruzione.
vdboor

In realtà, ho provato prima questo e ha generato un sacco di errori rendendo la copia locale quasi inutilizzabile. Eliminare / ricreare potrebbe essere stato meno elegante, ma non ho dovuto porre alcuna domanda di follow-up.
Electrons_Ahoy

3
@Electrons_Ahoy: Hmm, non è assolutamente normale. L'esecuzione di questo ripristino dovrebbe normalmente essere un'operazione senza problemi se il repository funziona correttamente.
Dan Molding

o anche se è strano. Usa git reflog per trovare la strada di casa se hai "accidentalmente" emesso questo comando senza effettivamente leggere cosa fa. :)
dbn

Anche questo funziona se sei sul ramo e hai fatto un pasticcio localmente.
slott
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.