2010-08-05 12 views
9

Proveniente da uno sfondo svn: non ho quasi mai ramificato, a causa della (scarsa) velocità di commutazione e dell'ora o più necessaria per unire i rami nuovamente nel bagagliaio. A volte, se avessi bisogno di aggiornare un problema su un sito web, avrei apportato le modifiche nel trunk (che sarebbe vissuto insieme alle modifiche precedenti o alle nuove funzionalità) e poi andare a quel file e fare semplicemente "svn up path/to/filename "e aggiornerebbe solo quel file, risolvendo il problema ma risparmiando il resto dei file.comprensione git cherry-pick

Concettualmente, questo non sembra possibile in git (o necessario); è strutturato in staging e commit raggruppati che consentono il cherry-picking? Quindi, potrei cambiare un'area specifica del sito e commetterlo come un gruppo invece di fare come lavoro con svn, e fare circa un giorno di lavoro e toccare i file su tutto il commit dell'intero batch in una volta?

risposta

10

Quello che probabilmente si vorrebbe fare in questo caso è creare un nuovo ramo per l'aggiornamento rapido, derivato dal comune antenato di tutti i rami che necessiteranno della correzione. Ad esempio, si supponga di avere un paio di uscite mantenuto con il vostro attuale sviluppo:

- X - o - o - o - o - o - o - o - o - o (master) 
    \      \ 
    o - o - o (release A) o - o (release B) 

Se avete bisogno di fare una correzione che si applicherà ad entrambe le versioni, creare un ramo a partire dalla X. etichettato commettere Commit il fix , quindi unisci quel ramo in tutti e tre i rami.

Si potrebbe scegliere tra le ciliegie, ma qui è una buona regola per decidere quando scegliere la ciliegia: non farlo. L'unico caso in cui vorrai scegliere è quando hai gestito male i tuoi rami. In questo caso, ciò potrebbe significare che hai apportato la correzione al master invece di ramificarlo correttamente da un punto precedente e che gli utenti hanno già eseguito il master degli aggiornamenti, quindi non puoi cambiarlo. Dovresti scegliere a caso per ottenerlo nei due rami di rilascio. Ma naturalmente, dovresti solo gestire i tuoi rami in un primo momento, e non avrai mai bisogno di selezionarli. (Sì, succederà ancora a volte, tale è la vita.)

+0

è fantastico. Ho appena giocato con alcune roba "git branch foo old-merge-sha1" ed è semplicemente fantastico. – Hans

+0

È consigliabile creare una diramazione per "CaratteristicaA", quindi diramare nuovamente "Caratteristica" per gli argomenti, unendoli in CaratteristicaA quando sono pronti, ma senza toccare il master finché l'intera Caratteristica non è pronta, quando si 'Unire FeatureA in master? In questo momento (in svn) se sto lavorando a qualcosa che richiederà alcune settimane e ho bisogno di un hotfix, faccio ciò che ho descritto nella mia domanda (svn up path/to/filename) e poi proseguo. La ramificazione di Git sembra essere una raccomandazione per "unire spesso", ma cosa succede se non desidero * che il master/trunk venga toccato fino a quando non è pronto, così posso aggiornare liberamente il sito web. – Hans

+2

@Hans: non si fondono fino a quando, beh, è ​​il momento di unire. Di solito master è un ramo stabile corrente, quindi puoi spostare una funzione parziale ma stabile se lo desideri, ma in generale devi solo unire le cose complete. Ed è abbastanza possibile avere diversi rami stabili di diversi sapori - uno per un dato relase (per il tuo sito web), uno per i test stabili correnti, uno per i test instabili ... basta assicurarsi di fondersi sempre nella giusta direzione (argomento -> funzione -> master o unstable -> stable). – Cascabel