Best Practices in Mercurial: Branch vs. Clone und Partial Merges?

74

... also habe mich auf die einfachen Sachen mit Mercurial gewöhnt ( add, commit, diff) und über die .hgignore Datei herausgefunden (yay!) und habe den Dreh raus zu schaffen und das Umschalten zwischen Zweigen (bekommen branch, update -C).

Ich habe jedoch zwei Hauptfragen:

  1. Wenn ich in Zweig "Zweig1" bin und einige, aber nicht alle Änderungen von Zweig "Zweig2" übernehmen möchte, wie würde ich das tun? Insbesondere, wenn sich alle Änderungen in einem Unterverzeichnis befinden. (Ich denke, ich könnte einfach das gesamte Repository klonen und dann ein Tool zum Zusammenführen von Verzeichnissen wie Beyond Compare verwenden, um meine Änderungen auszuwählen. Es scheint jedoch eine Möglichkeit zu geben, die Änderungen in einer Datei oder einem Verzeichnis zu isolieren.)

  2. Das Wechseln zwischen Zweigen mit update -Cscheint so einfach zu sein, dass ich mich frage, warum ich mich die Mühe machen würde, es zu verwenden clone. Ich kann mir nur einige Gründe vorstellen (siehe unten) - gibt es noch andere Gründe, die mir fehlen?

    ein. wenn ich auf zwei Versionen / Zweige gleichzeitig reagieren muss (z. B. einen Leistungsmetrikdifferenz)

    b. für eine Sicherung ( clonedas Repository auf einem Netzlaufwerk an einem physisch anderen Ort)

    c. um die Auswahl zu treffen und auszuwählen, wie ich oben erwähnt habe.

Jason S.
quelle

Antworten:

50

Ich benutze Klon für:

  • Kurzlebige lokale Niederlassungen
  • Klonen auf verschiedene Entwicklungsmaschinen und Server

Die frühere Verwendung ist für mich ziemlich selten - hauptsächlich, wenn ich eine Idee versuche, die ich vielleicht ganz aufgeben möchte. Wenn ich zusammenführen möchte, möchte ich ALLE Änderungen zusammenführen. Diese Art der Verzweigung dient hauptsächlich dazu, die Verzweigungen verschiedener Entwickler zu verfolgen, damit sie sich nicht gegenseitig stören. Nur um diesen letzten Punkt zu verdeutlichen:

  • Ich arbeite weiter an meinen Änderungen und ziehe die Änderungen meiner Entwicklungskollegen und sie ziehen meine.
  • Wenn es mir passt, füge ich ALLE Änderungen von einem (oder allen) dieser Zweige in meinen zusammen.

Für Feature-Zweige oder länger lebende Zweige verwende ich benannte Zweige, die bequemer zwischen Repositorys geteilt werden, ohne zusammengeführt zu werden. Es "fühlt" sich auch besser an, wenn Sie selektiv zusammenführen möchten.

Grundsätzlich sehe ich das so:

  • Benannte Zweige dienen zum Entwickeln verschiedener Zweige oder Versionen der App
  • Klone dienen zum Verwalten verschiedener Beiträge zur gleichen Version der App.

Das ist meine Meinung, obwohl es wirklich eine Frage der Politik ist.

Draemon
quelle
3
Warum wurde dies jemals so oft akzeptiert und positiv bewertet, als es den Punkt der Frage eindeutig verfehlte? Es antwortet nicht mit 1 und auch nicht mit 2, während Steves Antwort tatsächlich auf den Punkt kommt.
Stute
3
@mare hoffnungsvoll, weil das OP es nützlich fand. Manchmal gibt es mehr als eine Perspektive auf eine Frage, und der Stackoverflow ist so konzipiert, dass die Antwort, die das Problem des OP am meisten angeht, gutgeschrieben wird (indem sie akzeptiert wird) und die Antwort, die für die Community am nützlichsten ist, gutgeschrieben wird (durch Upvotes). Eine nützliche Antwort ist nicht immer die direkteste Antwort, solange sie den zugrunde liegenden Grund für die Frage anspricht. In diesem Fall haben mir die Leute im wirklichen Leben ähnliche Fragen gestellt, und die Informationen, die ich hier geteilt habe, fanden sie am hilfreichsten, daher dachte ich, dass sie auch hier hilfreich sein könnten.
Draemon
2
@mare, ich habe dies abgelehnt, weil ich über Google auf dieser Seite gelandet bin und meine Frage dadurch gelöst wurde .
Chen Levy
29

Bei Frage 1 müssen Sie etwas klarer darüber sein, was Sie unter "Änderungen" verstehen. Welche davon meinst du:

  1. "Ich möchte einige, aber nicht alle Änderungssätze in einem anderen Zweig in diesen ziehen."
  2. "Ich möchte die neueste Version einiger, aber nicht aller Dateien in einem anderen Zweig in diesen ziehen."

Wenn Sie Punkt 1 meinen, sollten Sie sich die Transplant- Erweiterung ansehen , insbesondere die Idee, ein paar Änderungssätze auszuwählen.

Wenn Sie Punkt 2 meinen, würden Sie Folgendes tun:

  • Aktualisieren Sie auf den Zweig, in den Sie die Änderungen übernehmen möchten.
  • Verwenden Sie hg revert -r <branch you want to merge> --include <files to update>diese Option , um den Inhalt dieser Dateien so zu ändern, wie er sich im anderen Zweig befindet.
  • Verwenden Sie hg commitdiese Option, um diese Änderungen als neuen Änderungssatz in den Zweig zu übernehmen.

Was Frage 2 betrifft, verwende ich niemals Repository-Klone, um mich selbst zu verzweigen, daher weiß ich es nicht. Ich verwende benannte Zweige oder anonyme Zweige (manchmal mit Lesezeichen).

Steve Losh
quelle
3

Ich habe noch eine andere Option für Sie: Quecksilberwarteschlangen.

Die Idee ist, einen Stapel Patches (keine Commits, "echte" Patches) auf Ihrem aktuellen Arbeitsverzeichnis zu haben. Anschließend können Sie die angewendeten Patches hinzufügen oder entfernen, eines hinzufügen, entfernen, ein weiteres hinzufügen usw. Ein einzelnes Patch oder eine Teilmenge davon wird zu einer neuen "Funktion", wie Sie es wahrscheinlich mit Zweigen tun möchten. Danach können Sie den Patch wie gewohnt anwenden (da es sich um eine Änderung handelt). Zweige sind wahrscheinlich nützlicher, wenn Sie mit jemand anderem zusammenarbeiten ...?

Harald Schilly
quelle
2
Ich muss sagen, obwohl ich MQ lieben wollte und es wie eine großartige Idee schien, fand ich sie in der Praxis völlig unbrauchbar. Die Arbeit an zwei verschiedenen Maschinen war ein Schmerz - ein großes Plus an Quellcodeverwaltung.
Draemon
Das war meine Beschwerde. Sie können das Repo ./.hg/patches immer noch nicht in Ihre ./.hgsub-Datei einfügen. Ich verwende MQ, wenn ich Anpassungen für einen bestimmten Client zusätzlich zu etwas Allgemeinem habe, aber dann habe ich mehrere benannte Patch-Ordner (Patch-Clienta, Patch-Clientb usw.). Das ist in Ordnung für mich, wenn ich alleine arbeite, aber ich habe immer noch Schwierigkeiten zu sehen, wie wir MQ in meinem Tagesjob funktionsfähig integrieren können. Klonen kann das Klonen des Haupt-Repos und von 3 oder 4 Patch-Queue-Repos bedeuten.
Bobpaul