2012-06-12 17 views
18

Diciamo che ho un ramo di sviluppo. Creo un ramo di funzionalità da questo per sviluppare una funzionalità. Una volta sviluppata la funzionalità, questa viene reintegrata nello sviluppo. Più o meno come illustrato di seguito:Blocco di un ramo Git

enter image description here

C'è un modo per congelare il ramo di caratteristica in modo che nessun ulteriore commit possono essere fatti ad esso?

Il motivo per cui non l'eliminazione a titolo definitivo il ramo è così che la visione della storia può ancora mostrare al ramo della funzione e che se ci deve essere un tweak fatto per la funzione, allora è possibile che qualcuno di creare un nuovo ramo di caratteristica dall'ultimo commit della funzione precedente.

risposta

14

Christopher ha ragione, l'etichettatura ti aiuterà a farlo. Raccomando di eliminare anche il nome del ramo per rendere un po 'più difficile per qualcuno controllare il ramo e apportare modifiche.

In primo luogo, si fondono ramo in sviluppare

git checkout develop 
git merge --no-ff feature_1 

Poi checkout il ramo

git checkout feature_1 

Quindi creare un tag, con un commento.

git tag -a -m "Freezing a feature branch that fixes.." feature_1_frozen 

Quindi eliminare il ramo

git checkout develop 
git branch -d feature_1 

Dopo aver fatto questo, non sarà in grado di checkout il ramo per nome. Invece sarai in grado di controllare il tag per nome, questo ti metterà in uno stato di testa distaccato che scoraggerà le modifiche al codice.

Ora per avvolgere e sincronizzare con l'origine ...

Spingere l'aggiornamento e nuovo tag

git push --tags origin develop 

Elimina al ramo della funzione remota

git push origin :feature_1 
+0

Vale la pena notare che verrà eliminato solo dal repository locale. Per impedire ad altri di afferrarlo nei propri repository locali, è necessario eliminarlo sul telecomando con 'git push : feature_1'.Sicuramente vorresti un nome di tag che includa il nome del ramo in questo caso, altrimenti in futuro verrai confuso quando qualcuno vorrà trovare questo stato. – Christopher

+0

Quindi, per essere chiari, il comando per eliminare il ramo non cancella i commit da quel ramo, cancella solo il nome del ramo? – millie

+0

I rami sono puntatori a commit specifici. C'è una buona spiegazione qui: http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is. Finché il tag commit esiste nell'esempio di gjcamann, dovresti essere in grado di raggiungere lo stato di commit. Sono ambivalente sull'eliminazione del ramo perché penso che si possa confondere: "Aspetta, come si chiamava quel ramo? Hmmm. Non ricordo il nome del tag .Questo era due mesi fa.Meglio andare a scavare." ma questa è solo una preferenza personale. La cancellazione del ramo remoto dipende dal livello di comfort e dal flusso di lavoro. – Christopher

8

Basta Taggalo.

git tag -a frozen -m "Feature branch frozen here." 
git push <remote> frozen 

Certo, qualcuno potrebbe venire più tardi e spingere al ramo, ma il tag non dovrebbe cambiare a meno che sia la forza overrode. Si potrebbe configurare il telecomando per respingere la forza spinge, se siete interessati a questo proposito, o even sign the tags with a GPG key to ensure authenticity.

Ottenere lo stato del ramo della funzione, quando è stato congelato è così semplice come git checkout frozen. Gli sviluppatori possono diramarsi da questo punto a proprio piacimento usando un comando: git checkout -B <new_branch> frozen.

+0

Giusto per essere chiari, se qualcuno non venire avanti e fare commit sul ramo "congelata", è banale buttare quei cambiamenti di distanza e impostare di nuovo a dove doveva essere. Solo 'git reset --hard frozen' mentre si è sul ramo. – wadesworld

0

Sto usando la console "Git Bash" per congelare il ramo:

Non ce l'ho Git Bash?

Ecco come installare e utilizzare la console Git Bash:

Riferimento:

https://github.com/msysgit/msysgit/releases/

https://help.github.com/articles/set-up-git/

Come congelare un ramo

git checkout {branch-to-keep-alive} 
git merge --no-ff {branch-to-freeze} 

Se git richiede un messaggio di unione, digitarlo, quindi utilizzare il tasto [Esc] quindi digitare il comando ": wq" per salvare e uscire.

Devi andare in Visual Studio e assicurarti di poter creare la soluzione con successo (con {branch-to-keep-alive}).

git checkout {branch-to-freeze} 

git tag -a -m "{your-description}" {tag-for-the-branch-to-freeze} 

Convenzione: creare il tag in questo modo: {branch-name} FROZEN

git checkout {branch-to-keep-alive} 

git branch -d {branch-to-freeze} 

git push --tags origin {branch-to-keep-alive} 

git push origin :{branch-to-freeze} 

Come unire un ramo con il maestro:

git checkout {your-working-branch} 

Git merge master

Aprire vs e risolvere i conflitti di unione se ce n'è. Ricostruisci sempre tutto.

git checkout master 
git merge development 

Ora non ci saranno più conflitti e tutto è pronto.

Git Bash Console:

enter image description here