2010-01-20 2 views
7

Also jetzt lerne ich Ruby on Rails, und ich arbeite durch das Buch "Agile Web-Entwicklung mit Rails". Ich habe auch entschieden, dass ich Mercurial eine Chance geben möchte, weil ich über verteilte SCMs gelesen habe, und es scheint eine ideale Situation zu sein. Ich bevorzuge es jedoch, meinen Code remote zu meinem Linux VPS zu schieben, nur wenn meine Festplatte sich entscheidet, einen Tauchgang zu machen.Verzweigung mit Mercurial SCM

Also, meine Frage ist spezifisch für die Verzweigung in Mercurial. Im Moment habe ich ein Remote-Repository eingerichtet und ich kann Änderungen leicht über SSH pushen (zum Teufel habe ich sogar eine Nginx FastCGI-Site eingerichtet, die mich auch pushen lässt). Was ich jedoch gerne machen würde, ist die Erstellung von Zweigen für jedes Kapitel, während ich daran arbeite, so dass ich eine gut organisierte Geschichte meines Fortschritts durch das Buch behalten kann. Also das ist, was ich tue:

 
$ hg branch chapter-10 
(do chapter 10 stuff) 
$ hg commit -m "Chapter 10 complete" 
$ hg update default 
$ hg merge chapter-10 
$ hg commit -m "Merging chapter 10 into default" 
$ hg push 

Sobald ich die Push-Anweisung ausführen, bekomme ich diese Nachricht von Mercurial:

 
pushing to ssh://myserver/hg/depot 
searching for changes 
abort: push creates new remote branch 'chapter-10'! 
(did you forget to merge? use push -f to force) 

Deshalb an dieser Stelle ich versuche, ein hg merge wieder zu tun, und es sagt mir, dass es nichts zu verschmelzen gibt, was offensichtlich wahr ist, weil ich es einfach verschmolzen habe. Wenn ich den Push mit -f erzwinge, scheint alles in Ordnung zu sein, und sogar das Webinterface zeigt die entsprechenden Zweige.

Zusammenfassend ist meine Frage einfach: Mache ich das richtig? Gibt es einen geeigneteren Weg, dies mit Mercurial (d. H. Dem "Mercurial Way") zu tun? Ehrlich gesagt möchte ich nur das Repository als Backup dienen. Ich bin ein Fan des verteilten SCM-Modells, aber für mich fühlt es sich irgendwie "dreckig" an, Pushs zu erzwingen. Jede Einsicht wird sehr geschätzt! Danke im Voraus.

+0

Ihre Absicht: a) Eine Reihe von Kontrollpunkten Ihrer Arbeit zu haben, während Sie sich durch die Kapitel arbeiten oder b) Mehrere Kapitel gleichzeitig öffnen, um sie in verschiedenen Zweigen bearbeiten zu können? – Tarydon

+0

Option A ist meine Absicht hier, aber in einem Team-Szenario konnte ich Wert in Option B sehen und –

Antwort

6

Die push -f ist die richtige Option für Ihren Fall, und es gab eine Diskussion im letzten Monat, diesen Befehl hinzuzufügen, wenn diese "push creates new remote branch" Warnung erscheint: siehe issue 1513.

Allerdings, issue 1974 (in diesem Monat) erwähnt einige unerwünschte Effekte (nicht in Ihrem Fall obwohl).
Weitere Informationen zum Erstellen eines zweiten Kopfs auf einem Remote-Repo finden Sie unter translated article.


Auf der allgemeineren Punkt können Sie Zweig verwenden, wenn Sie Ihr Kapitel parallel schreiben, und Sie wollen, dass sie fusionieren nur zu bestimmten (stable) Zeitpunkt

Aber wenn Ihr Schreibprozess ist linearer, Sie könnten nur einen Zweig verwenden und einige Tags auf dem Weg platzieren.
Wenn Sie jedoch zurück zu Kapitel 10 gehen und einige Zeilen hinzufügen, obwohl Sie bereits Tags 11 und 12 eingefügt haben, würde das die Geschichte schwerer lesbar machen.So sind Verzweigungen in diesem Fall immer noch eine gute Idee.

+1

Danke für die Links. Sehr informativ. Es scheint, als würde ich versuchen, Zweige zu verwenden, wo Tags besser passen würden. –

4

Ich weiß nicht über Ihr spezifisches Problem, aber aus Ihren Kommentaren scheint es, dass Sie Zweige verwenden, wo Sie wahrscheinlich Tags verwenden wollten.

Verzweigungen werden im Allgemeinen verwendet, wenn mehrere Personen am selben Projekt zusammenarbeiten und Sie eine Arbeitstrennung erstellen möchten, sodass eine Person an einem stabilen Codeabschnitt arbeiten kann, während der andere etwas Experimentelles vornimmt, das die Funktionalität vorübergehend unterbricht. Alternativ werden Verzweigungen verwendet, um die Freisetzung zu stabilisieren, während die Entwicklung im Stamm weitergeht.

Tags (oder Labels) werden verwendet, um in erster Linie eine Markierung zu erstellen, die für die Codeversion von Bedeutung ist. Wenn Sie beispielsweise einen Abschluss von Kapitel 10 markieren möchten, markieren Sie einfach alle aktuellen Versionen mit einem Tag "chapter-10". Es besteht keine Notwendigkeit zu verzweigen. Sie können zu einem beliebigen Zeitpunkt in Zukunft von einer markierten Version abzweigen, wenn dies aus irgendeinem Grund notwendig wäre.

+0

stimme ich zu. Angesichts der Tatsache, dass Sie immer wieder zurückgehen können und von überall her verzweigen können, scheint die Erstellung von Verzweigungen im Voraus ein eindeutiger Fall von YAGNI zu sein. –

2

In diesem Fall fühle ich, dass es völlig in Ordnung ist, -f für den Push zu verwenden. Es erzeugt nur neue Zweige, keine Köpfe. Entfernte Köpfe zu erstellen ist eine andere Sache.