Ripristina altro ramo su corrente senza un checkout


110

Sto scrivendo alcuni script per il mio flusso di lavoro Git.

Ho bisogno di ripristinare un altro ramo (esistente) a quello corrente, senza effettuare il checkout.

Prima:

 CurrentBranch: commit A
 OtherBranch: commit B

Dopo:

 CurrentBranch: commit A
 OtherBranch: commit A

Equivalente a

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

(Nota --soft: non voglio influenzare l'albero di lavoro.)

È possibile?


Qualcuno sa se questo è possibile anche in Egit?
zedoo

Risposte:


84

I flussi di lavoro che descrivi non sono equivalenti: quando esegui reset --hardperdi tutte le modifiche nell'albero di lavoro (potresti volerlo fare reset --soft).

Quello che ti serve è

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

3
Amico, vorrei che funzionasse senza il superfluo refs/heads/...
ELLIOTTCABLE

41
Un modo molto più carino per farlo è git push . current:other. Funziona senza refs/heads(/ cc @elliottcable) e ti impedisce anche di aggiornare il ramo estratto. Nota che potresti dover passare -f (o usare +current:other) se l'aggiornamento non è un avanzamento rapido.
Lily Ballard

4
È inoltre possibile utilizzare l' -m 'some text'argomento per registrare il motivo per cui l'aggiornamento di riferimento deve essere mostrato dal git reflog OtherBranchcomando, ad esempio "sincronizzato con CurrentBranch". Può essere utile per ricordare perché l'hai fatto in seguito.
Levi Haskell

18
Perché dovresti usare git update-ref refs/heads/OtherBranch refs/heads/CurrentBrancho git push . CurrentBranch OtherBranchquando potresti usare invece il molto più pulito (IMO) git branch -f OtherBranch CurrentBranch? (Vedi la mia risposta su git branch -f sotto)
Colin D Bennett

1
@BenHymers Quindi la pagina man per "git push" è una dannata bugia. Descrive il comando come "Aggiorna riferimenti remoti ...". quando in effetti può aggiornare i ref locali senza problemi.
Kaz

228

Impostato otherbranchin modo che punti allo stesso commit currentbranchdell'esecuzione

git branch -f otherbranch currentbranch

L' -fopzione (force) dice git branch sì, intendo davvero sovrascrivere qualsiasi otherbranchriferimento esistente con quello nuovo .

Dalla documentazione :

-f
--force

Ripristina se esiste già. Senza -f git branch rifiuta di cambiare un branch esistente.


6
Questa è la risposta più semplice. Grazie!
Robert Karl

Ottengo fatal: Cannot force update the current branch.quando provo a farlo.
Fuad Saud

4
@ FuadSaud è perché hai già otherbranchverificato. Questa domanda SO riguarda specificamente il ripristino di un altro ramo su un commit diverso (cioè non il ripristino del ramo estratto). Quello che vuoi fare è reimpostare il ramo corrente con git reset targetbranchper forzare il puntamento del ramo corrente targetbranch. Aggiungi --hardper forzare anche l'albero di lavoro a quel contenuto. O --softper lasciare l'indice da solo e cambiare solo il ramo stesso.
Colin D Bennett

Bene, quindi, so di reset. Quello che stavo cercando era un modo per, all'interno di una routine, indirizzare sempre il master locale a upstream / master, indipendentemente da ciò che è stato estratto. Ho pensato di branch -fpoterlo fare.
Fuad Saud

9
Imo, questa dovrebbe essere la risposta accettata. Questo ha migliorato così tanto il mio flusso di lavoro!
chitarra letale

23

Puoi sincronizzare con questo comando i tuoi rami in qualsiasi momento

$ git push . CurrentBranch:OtherBranch -f

Anche senza -f sostituisce questo insieme di comandi

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

Può essere utile quando non è necessario eseguire il commit di tutti i file in CurrentBranch e quindi non è possibile passare a un altro ramo.


Può causare "telecomando: errore: negazione
dell'avanzamento

3
Non includerei l' -fopzione a meno che non sia assolutamente inevitabile. Funziona bene senza di essa nel mio caso.
Melebius
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.