2013-01-09 18 views
10

Immagina una situazione in cui hai due rami dello stesso progetto, con una parte del primo ramo notevolmente rifattorizzata sull'altra. Ma per un po 'devi mantenere funzionanti entrambi i rami, quindi stai facendo correzioni di bug e aggiunte di funzionalità cruciali a entrambi, a volte in modo non simmetrico. E ad un certo punto arriva un momento in cui devi unire il ramo refactored a quello originale. Qual è la tecnica migliore da usare in una situazione come questa? È ancora possibile mantenere pulita la cronologia?Git: Come fondere correttamente due rami funzionali e abbastanza diversi?

Ma ancora più importante, quale sarebbe stata la mia strategia iniziale in tale scenario?

risposta

8

Dal momento che il compito era di usare semplicemente un altro ramo invece di master, si può semplicemente rimuovere master ramo in tutto o rinominarlo in diciamo - legacy, poi prendere un altro ramo e rinominarlo master. Questo è tutto. Qui ci sono i comandi reali che si potrebbe aver bisogno di eseguire per raggiungere l'obiettivo a livello locale e su GitHub:

git branch -m master legacy    # rename local master to legacy 
git checkout legacy 
git branch -m another_branch master  # another_branch will be our new master 

A livello locale ci sono fatto ora. Tuttavia non è possibile rimuovere semplicemente il ramo master su GitHub. Devi prima prendere un altro ramo come predefinito. Questo può essere fatto nel repository Settings > Default Branch. Una volta fatto questo, si può procedere:

git push origin :master     # remove master on GitHub 
git push origin master     # push out our new master branch 
git push origin legacy     # push our legacy branch too 

Tornare su Settings > Default Branch e passare ramo predefinito al master. Inoltre è possibile rimuovere tutti i rami aggiuntivi che si potrebbero aver creato durante il processo di migrazione.

In alternativa, se si desidera salvare tutte le azioni della cronologia, selezionare una risposta corretta here.

+1

E come si rimuove il 'legacy'? –

+1

Il punto era mantenere l'eredità, per ogni evenienza. Se non hai bisogno di legacy, puoi semplicemente cancellarlo come qualsiasi altro ramo: http://stackoverflow.com/questions/2003505/how-do-i-delete-a-git-branch-both-locally-and- in-github – jayarjo

+0

Fantastico, grazie. – Dogweather

2

Dato che si hanno 2 rami, uno è rifattorizzato in modo significativo dall'altro, e si stanno mantenendo entrambi ... direi che Git non ti aiuterà magicamente. Per aiutare, le patch/modifiche applicate al ramo 1 devono essere simili al ramo 2 (ma non esattamente lo stesso).

Poiché è stato refactored, il codice potrebbe non essere simile, a meno che il nuovo codice non sia modularizzato per essere uguale su entrambi i rami.

Cosa avresti dovuto fare in primo luogo?

  • aggiungere un po 'di unit test e/o il codice di test di integrazione al ramo iniziale
  • eseguire lo stesso test di integrazione al 2 ° ramo
  • per nuovi cambiamenti aggiungono test
  • si può quindi verificare i cambiamenti funzionano per entrambi i rami

Update: per la gestione delle modifiche a entrambi i rami, è probabilmente solo bisogno di un processo, come ad esempio: - lavorare principalmente sul ramo-r efactored - Unisci ogni "storia" o articolo di lavoro a legacy come sono fatti

Il secondo passo è quello che penso sarebbe molto lavoro se il codice è troppo diverso tra i rami. Se è necessario mantenere entrambi i rami, provare ad incapsulare il nuovo codice in una libreria che può essere utilizzata in entrambi i rami. Ciò comporterà l'unione da un ramo all'altro.

+2

Ho ottenuto test unitari. Non era la mia preoccupazione.Volevo solo sapere se c'era una strategia migliore per ottenere una cronologia git più pulita. – jayarjo