2012-05-25 13 views
9

Possiedo diverse diramazioni e un ramo principale. Feature2 è fatto. Normalmente vorrei rebase (lavorando con un repository SVN remoto e vorrei mantenere la cronologia, quindi nessuna unione regolare) e ff-merge. Ma poiché il master non è cambiato da quando ho diramato, vorrei spostare il master head (a E) a G. L'utilizzo di git branch -f master G non comporta alcuna modifica visibile, presumo che ciò sia dovuto al fatto che G si trova su un ramo diverso.Spostamento della testa master su una diramazione

È sicuro utilizzare git update-ref -f master G qui? Dovrei rimanere con rebase/ff-merge? Qualcosa di ancora migliore?

feature1  C-D 
      /
master A-B-E    
       \      
feature2  F-G 

Grazie.

+1

Cosa c'è di sbagliato con un normale merge fast-forward di '' G' in master'? Non c'è bisogno di ribattere. Manterrai la cronologia e otterrai un grafico lineare ('A-B-E-F-G'). – ellotheth

+0

aah, l'ovvietà! il grafico appare esattamente come dopo un rebase. Mi chiedo perché mai ho pensato a altro. Cura di ripubblicare come risposta? – kostja

+0

La funzione di diramazione2 ha già un 'grafico lineare': basta rinominare feature2 per diventare master (o spostare master a feature2)! – GoZoner

risposta

5

Una fusione regolare di G in maestro farà il trucco, non c'è bisogno di rebase:

feature1  C-D 
       /
    master A-B-E    
        \      
    feature2  F-G 

git checkout master 
git merge feature2 

    feature1    C-D 
         /
    master, feature2 A-B-E-F-G 
0

Potrebbe essere meglio eseguire un'unione non veloce in avanti della funzione 2 in master utilizzando git merge --no-ff feature2 se si è effettuato il check-out sul ramo principale. Si dovrebbe finire con il seguente

feature1  C-D 
      /
master A-B-E-----H   
       \ /     
feature2  F-G 
+0

Vorrei evitare la fusione regolare con il master, laddove possibile, per mantenere la cronologia, l'ho detto nella domanda. E, perché pensi che un no-ff-merge sia più adatto di ref move? – kostja

11

Non è necessario unire i rami, un reset è sufficiente. Supponendo master è verificato:

git reset --hard feature2 
+2

Un reset è funzionalmente equivalente a un'unione di avanzamento rapido in questo caso. – ellotheth

+1

Funziona come pubblicizzato, grazie Magnus. – kostja

+0

dopo cinque minuti di ricerca della risposta, ci provo e funziona. semplice e atteso in riflessione. Grazie! –

1

L'update-ref è sicuro. Una testa di ramo non è altro che un po '"leggimi!" tag appeso a un commit. È puramente per convenzione che git lo raccoglie e lo blocca su un commit diverso per te a volte.

Utilizzando maestro git branch -f G non comporta alcuna modifica visibile

Cosa git log --decorate --oneline --all dice? git show master?

+0

Il mio male, ho inserito lo SHA sbagliato per 'git branch master SHA'. Ha funzionato. – kostja

6

Nessuna fusione richiesta: è sufficiente rinominare i rami. Dal momento che non ti interessa feature2 ('done done') né il master esistente (in 'E') hai solo bisogno di quanto segue.

git branch -d master 
git branch -m feature2 master 

Semplice è meglio?

Ricorda che ci sono due concetti chiave coinvolti:

  1. Il git commit grafico e
  2. Il Git fa riferimento

Quando si esegue una fusione (di vari gusti e compreso rebase) si stanno cambiando il grafico del commit. Le modifiche riguardano l'aggiunta di nodi, l'aggiunta di collegamenti o forse lo spostamento di collegamenti. I riferimenti (compresi rami e tag) puntano solo su commit e quindi la modifica di un riferimento cambia solo il commit puntato, non la struttura del grafico.

Quindi, nel tuo caso, non è necessario modificare la struttura, ma solo una modifica dei riferimenti.

versione ad una linea è:

git branch -f master feature2 

che mantiene il ramo feature2 muoversi (a differenza dei precedenti due-liner quali assi feature2).

+1

Grazie, GoZoner. Bella alternativa a cui non ho pensato. Ma credo che mi stia attaccando a ff-merge nel mio caso. – kostja

+0

Vedere i dettagli aggiunti in modifica. – GoZoner

+0

sembra funzionare localmente. Ma come posso inviare le modifiche al server remoto? Si lamenta di un'unione non veloce avanti – josinalvo

Problemi correlati