2013-04-11 18 views
26

diciamo che abbiamo un ramo hotfixes che è stato creato da master. abbiamo aggiunto commit a hotfixes, ma quei commit non erano utili, quindi ora vogliamo iniziare di nuovo da una nuova copia di master.Come resettare un ramo su un altro ramo con git?

per chiarire meglio, questo è il flusso di lavoro di riferimento: http://nvie.com/posts/a-successful-git-branching-model/

facciamo anche dire che abbiamo spinto hotfixes al origin remota perché abbiamo un set di terribile e questo è l'unico modo per testare qualcosa, quindi abbiamo bisogno di resettare il ramo anche sul server remoto.

come reimpostare hotfixes su una copia di master?

risposta

29

Significa che si desidera inviare il proprio locale master al ramo hotfixes remoto? Come questo:

git push origin +master:hotfixes 

Tuttavia, questo richiede che si è permesso di ri-scrivere la storia sul lato remoto.

+0

È la sintassi corretta? Quando l'ho fatto, ho ottenuto un nuovo ramo remoto con il segno più (+) nel nome. Ho dovuto spostare il più come 'git push origin + master: hotfixes'. Questo è secondo le specifiche git: http://git-scm.com/docs/git-push – jwynveen

+0

@jwynveen Hai ragione, corretto. –

+6

fyi, il segno più è una scorciatoia per fare un '--force' durante il push: http://stackoverflow.com/questions/1475665/why-git-push-helloworld-mastermaster-instead-of-just-git- push-helloworld –

6

Se ho capito correttamente la tua domanda, quello che stai cercando è un modo per spostare il puntatore di diramazione di origin/hotfixes in modo che punti alla revisione corrente di origin/master.

Se questo è il caso, queste serie di comandi dovrebbe funzionare (assumendo che si è già verificato hotfixes nel vostro repo git locale qualsiasi momento del passato):

# git branch -f does not allow modifying the currently checked out 
# branch, so checkout any other branch than hotfixes 
git checkout <SOME_OTHER_BRANCH_THAN_HOTFIXES> 

# Move the branch pointer of hotfixes to the commit currently 
# pointed by origin/master 
git branch -f hotfixes origin/master 

# Force push the history rewrite in the hotfixes branch 
# into origin 
git push -f origin hotfixes 
+0

'Hotifxes di ramo impostati per tracciare il master di ramo remoto dall'origine. - Non sono sicuro che sia ciò che si desidera a tutti –

36

questo è come ho fatto con comandi di base Git:

git checkout hotfixes 
git reset --hard master 
git push --force origin hotfixes 

, naturalmente, è importante informare tutti coloro che lavorano su hotfixes. molto probabilmente dovranno cancellare la loro copia locale e iniziare da una nuova. un'idea alternativa meno invasiva è creare un nuovo ramo:

git checkout master 
git branch -tb hotfixes-2 # this creates branch `hotfixes-2` from a copy of `master` 
git push origin HEAD # this creates `hotfixes-2` on the remote server 
+0

Mi piace in questo modo. meno incline all'errore. –

+0

Grazie per la preferenza, ma sono curioso di sapere perché lo trovi meno soggetto agli errori – danza

+1

Avrei dovuto affermare che si tratta di una preferenza personale e non stava tentando di dichiarare un fatto. Per me, richiede più azioni, che descrivono meglio ciò che stai facendo piuttosto che semplicemente spingendo verso un altro telecomando, che, a sua volta, mi rende più consapevole di quello che sto facendo. Inoltre, il flag extra '-f' e' reset --hard' hanno un avvertimento con strumenti della GUI come sourcetree per esempio .. –

1

Le risposte qui sono solide. Ho avuto bisogno di questo cambiamento esatto quando ho reimpostato il mio ramo di staging. In tal caso, desidero reimpostare l'origine in modo che corrisponda al master e anche ripristinare il mio locale per farlo corrispondere. Quindi ecco un alias git che ti permette di passare il nome del ramo e di eseguire entrambi i comandi con una sola mossa. (E 'un po' pericoloso)

reorient = "!f() { git push origin +master:$1 && git reset --hard origin/$1 ; }; f" 

quindi utilizzarlo come:

git reorient hotfixes 

Le risposte di cui sopra erano totalmente corretto. Ma questo consentirà semplicemente un minor numero di tasti e una svolta più rapida! Spero che sia d'aiuto.

+0

non vorrei chiudere un 'git reset --hard' in un alias così facilmente ... aver paura di dimenticare e perdere importanti cambiamenti – danza

+1

Sì. Come ho detto nella spiegazione "è un po 'pericoloso". Tuttavia, in alcuni casi puoi trovarti a farlo regolarmente, nel qual caso potresti volere qualcosa di più veloce. –

Problemi correlati