2012-04-24 15 views
8
#lets get the latest 
git pull 

#lets switch to branch and do some work 
git checkout -b makeSomeBugs 

#do the work commit 
git add . 
git commit -am "introducing some bugs" 

#push this for my lazy remote friend to see 
git push origin makeSomeBugs 

#uh .. changes on master 
git pull origin master 

#do some work.. 
git commit -am "introducing some more bugs" 
git push origin makeSomeBugs 

#lets switch back to master 
git checkout master 
git pull 

#work is done, lets merge 
git merge --no-ff makeSomeBugs 
git push origin 

#and remove the branch to never ever see it again 
git push origin :makeSomeBugs 
git branch -d makeSomeBugs 

Varie fonti blog (ma sono abbastanza vecchio) dire che si dirama come questo in mercuriale è no-go, in particolare con la rimozione permanente ramo ...Git e Mercurial: quale sarebbe l'equivalente del flusso di lavoro Git in Mercurial?

+0

Ho provato e ancora trovare un modo per simulare un flusso di lavoro di git branch in mercurial. Le filiali regolari non funzionano in modo difforme perché non puoi eliminarle (chiudile solo ma significa che il nome del ramo è occupato per sempre). I segnalibri dovrebbero essere come i rami git, tuttavia non sembrano funzionare come loro, almeno per me. – ryanzec

+1

@ryanzec come ti hanno lasciato i segnalibri? –

risposta

8

mi potrebbe avere qualche pezzo sbagliato, perché io possa avere frainteso il git, ma supponendo che si sta utilizzando una versione recente di Mercurial o, se non, il bookmarks extension è abilitata ...

# lets get the latest 
# git pull 

hg pull 

# lets switch to branch and do some work 
# git checkout -b makeSomeBugs 

hg bookmark makeSomeBugs 

# do the work commit 
# git add . 
# git commit -am "introducing some bugs" 

hg commit -m "introducing some bugs" 

# push this for my lazy remote friend to see 
# git push origin makeSomeBugs 

hg push -B makeSomeBugs 

# uh .. changes on master 
# git pull origin master 

hg pull 
hg merge 

# do some work.. 
# git commit -am "introducing some more bugs" 
# git push origin makeSomeBugs 

hg commit -m "introducing some more bugs" 
hg push -B makeSomeBugs 

# lets switch back to master 
# git checkout master 
# git pull 

hg pull 
hg update -C <name of master rev> 

# work is done, lets merge 
# git merge --no-ff makeSomeBugs 
# git push origin 

hg merge makeSomeBugs 
hg push 

# and remove the branch to never ever see it again 
# (I assume you mean the label not the changesets) 
# git push origin :makeSomeBugs 
# git branch -d makeSomeBugs 

hg bookmark -d makeSomeBugs 
hg push -B makeSomeBugs 

ci sono un paio di differenze "modello mentale", ma penso che sia abbastanza vicino. Il più grande è quando si elimina il segnalibro. Lo elimini localmente e poi lo spingo. Ordine inverso da quello che hai fatto con git.

C'è anche la domanda su cosa si usa per identificare la testa "master". Se sul server era già presente un segnalibro (chiamato ad esempio master), la prima riga diventerebbe hg pull -B master, la prima unione hg merge master e l'aggiornamento hg update -C master. Una volta che hai tirato un segnalibro per la prima volta, eventuali pull o push successivi devono aggiornarlo senza bisogno di menzionarlo esplicitamente.

+0

Quindi la domanda è, può vedere nella cronologia che le modifiche apportate in makeSomeBugs quando vengono unite al valore predefinito e inviate all'origine sono ancora visibili come modifiche in makeSomeBugs? Per esempio. posso rintracciare che comit X e commit Y sono stati creati in makeSomeBugs dopo la fusione? – gerasalus

+2

@gerasalus: No, proprio come i rami Git, i segnalibri non sono permanenti. I rami nominati sono etichette permanenti e non hanno equivalente Git. 'default' si riferisce al ramo * denominato * predefinito. Non è lo stesso di "maestro". –

+3

@PaulS: non è più necessario abilitare l'estensione dei segnalibri al giorno d'oggi perché ora è diventata una caratteristica principale di Mercurial. –

2

È praticamente lo stesso eccetto che con Mercurial in genere non ti preoccuperai di nominare i tuoi progressi e basta usare un ramo anonimo.

vi svelo che affondano in un attimo ...

A differenza di Git, Mercurial non 'dimenticare' di modifiche se non c'è nome del ramo o bookmark ad esso associati, quindi non c'è bisogno di nominandolo e successivamente cancellandolo. Dopo questo, sembra un flusso di lavoro piuttosto standard:

#lets get the latest 
hg pull 

#lets update to the latest and do some work 
hg update 

#do the work commit 
hg commit -Am "introducing some bugs" 

#serve this for my lazy remote friend to see 
hg serve 

#uh .. remote changes 
hg pull 

#do some work.. 
hg commit -Am "introducing some more bugs" 

#lets pull in the latest 
hg pull 

#work is done, lets merge 
hg merge 
hg push 

Opzionalmente è possibile utilizzare un segnalibro se si vuole veramente tenere esplicitamente traccia del capo anonima; quando si avvia (dopo hg update), etichettare l'insieme di modifiche corrente utilizzando:

hg bookmark makeSomeBugs 

E quando il gioco è fatto (dopo hg merge), rimuovere il segnalibro con:

hg bookmark -d makeSomeBugs 

Si potrebbe anche spingere il segnalibro per il bene del tuo amico, ma ... meh.

+0

Stai eseguendo il default, mi sto impegnando nel ramo. Questo non è lo stesso. Come posso creare un altro ramo dal master e fare qualsiasi altra cosa, non relativo al primo. – gerasalus

+2

No, ti stai impegnando in un nuovo ramo anonimo, opzionalmente con un segnalibro. La ramificazione avviene ogni volta che la linea di commit diverge. Se vuoi eseguire il commit con qualcosa di diverso dal nome 'default', allora devi creare un altro * nome * ramo. Stai colpendo un ostacolo culturale qui: usare rami anonimi è comune in Mercurial, mentre è praticamente impossibile in Git. I rami nominati sono permanenti e devono essere impostati in anticipo; se vuoi tracciare quel ramo anonimo, usi un segnalibro. –

+0

In Mercurial, i rami denominati sono permanenti e in genere utilizzati per tenere traccia delle versioni. Puoi usarli per tracciare anche le caratteristiche, ma di solito il lavoro di funzionalità è fatto in rami anonimi. I segnalibri possono essere utilizzati facoltativamente per tracciare il lavoro sui rami anonimi. Questo è utile se stai lavorando su più cose contemporaneamente o il codice deve essere condiviso prima di unirlo. –

Problemi correlati