2009-10-19 15 views
79

Sto scrivendo alcuni script per il mio flusso di lavoro Git.Git: resetta altro ramo a corrente senza checkout

ho bisogno di resettare altro ramo (esistente) a quella attuale, senza cassa.

Prima:

CurrentBranch: commit A 
OtherBranch: commit B 

Dopo:

CurrentBranch: commit A 
OtherBranch: commit A 

equivalente di

$ git checkout otherbranch 
$ git reset --soft currentbranch 
$ git checkout currentbranch 

(Nota --soft: Non voglio influenzare albero di lavoro.)

È possibile?

+0

Qualcuno sa se questo è possibile anche in Egit? – zedoo

risposta

59

I flussi di lavoro che si descrivono non sono equivalenti: quando si esegue reset --hard si perdono tutte le modifiche nell'albero di lavoro (si potrebbe desiderare di renderlo).

Quello che vi serve è

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch 
+0

Bene, grazie. Non voglio influenzare l'albero di lavoro. –

+2

Uomo, vorrei che funzionasse senza il superfluo 'refs/heads /' ... – ELLIOTTCABLE

+32

Un modo molto più bello per farlo è 'git push. corrente: other'. Funziona senza 'refs/heads' (/ cc @elliottcable), e impedisce anche di aggiornare il ramo estratto. Notare che potrebbe essere necessario passare -f (o usare '+ current: other') se l'aggiornamento non è un avanzamento rapido. –

15

è possibile sincronizzare con questo comando tuoi rami in qualsiasi momento

$ git push . CurrentBranch:OtherBranch -f 

anche senza f è sostituire questo insieme di comandi

$ git checkout OtherBranch 
$ git merge CurrentBranch 
$ git checkout CurrentBranch 

Può essere utile quando non è necessario salvare tutti i file in CurrentBranch e quindi non è possibile passare a un altro b ranch.

+0

Può causare "remoto: errore: negare l'avanzamento non veloce" – Basilevs

+0

Non includere l'opzione '-f' a meno che non sia assolutamente inevitabile. Funziona bene senza di esso nel mio caso. – Melebius

140

Set otherbranch per puntare allo stesso commettono come currentbranch eseguendo

git branch -f otherbranch currentbranch 

L'opzione -f (forza) dice git branchsì, voglio dire sovrascrivere qualsiasi otherbranch riferimento esistente con quello nuovo.

Dal documentation:

-f
--force

Reset to if exists already. Without -f git branch refuses to change an existing branch.

+2

Questa è la risposta più semplice. Grazie! –

+0

Ottengo 'fatale: impossibile forzare l'aggiornamento del ramo corrente.' Quando provo a farlo. –

+3

@FuadSaud perché hai già "otherbranch" estratto. Questa domanda SO riguarda in particolare la reimpostazione di * un altro * ramo su un commit diverso (cioè non reimpostazione del ramo estratto). Quello che vuoi fare è resettare il ramo corrente con 'git reset targetbranch' per forzare il ramo corrente ad essere puntato su 'targetbranch'. Aggiungi '--hard' per forzare anche l'albero di lavoro a quel contenuto. Oppure '--soft' per lasciare l'indice da solo e cambiare solo il ramo stesso. –

Problemi correlati