Ich bin ein Git-Benutzer, der durch die Verzweigung von mercurial verwirrt ist. Wie soll ich kleine Änderungen verfolgen?

32

Ich habe git schon immer benutzt, aber ich möchte einen Beitrag zu Python leisten, deshalb muss ich jetzt mercurial lernen und finde es sehr frustrierend.

Also habe ich ein paar kleine Patches erstellt und wollte sie als Commits in meinem lokalen Quecksilber-Repository nachverfolgen. Anscheinend gibt es 4 Möglichkeiten, mit der Verzweigung in Quecksilber umzugehen . 1 und 4 sahen für mich völlig lächerlich aus, benannte Zweige scheinen schwer zu sein und ich habe das Gefühl, dass ich sie nicht für schnelle 1-Commit-Korrekturen verwenden soll, also habe ich Lesezeichen verwendet.

Jetzt wird mein Patch abgelehnt und ich möchte einen meiner Lesezeichen-Zweige aus meinem Repository entfernen. OK, in git würde ich einfach meinen Zweig erzwingen und vergessen, also lösche ich mein Lesezeichen und jetzt habe ich folgende Probleme:

  • TortoiseHG und hg logzeigen immer noch, dass commit und defaultbranch 2 Köpfe haben. Und wenn ich das richtig verstehe, kannst du keine Commits in hg ohne zusätzliche Plugins löschen.

  • Mercurial hat nicht nur Hashes, sondern auch Revisionsnummern. Da ich einige meiner eigenen Commits hinzugefügt habe, haben alle Commits, die danach gezogen wurden, unterschiedliche Revisionsnummern vom zentralen Hauptrepo.

  • hg updateNachdem ich gezogen habe , um mein masterLesezeichen automatisch auf das neueste Commit zu verschieben, konnte ich in TortoiseHG keine Möglichkeit finden, dies zu tun.

Was mache ich falsch? Ist das normal und zu erwarten und sollte ich diese Probleme einfach ignorieren? Oder wie soll ich mit meinen Filialen arbeiten?

Anton Barkovsky
quelle

Antworten:

22

Persönlich würde ich für Ihr Szenario nicht einmal die Mühe machen, einen Zweig zu erstellen, es sei denn, ich arbeite an mehreren Änderungen, von denen jede von den Kernentwicklern akzeptiert werden müsste.

Klonen Sie einfach ihr Repository und arbeiten Sie darin. Dann stellen Sie eine Pull-Anfrage.

Wenn ich einen Zweig verwenden würde, würde ich lieber benannte Zweige verwenden. Sie wurden genau für diesen Zweck entwickelt, wo es keine Lesezeichen gab. Ich verstehe nicht, warum Sie es für schwer halten würden.

Mercurial hat eine ganze Seite im Wiki, die verschiedene Arten des " Zurückschneidens toter Zweige " beschreibt. Die Option "Klon verwenden" sollte Ihren Anforderungen entsprechen.

Um Ihre spezifischen Fragen zu beantworten ...

TortoiseHG und hg log zeigen immer noch, dass commit und default branch zwei Köpfe haben. Und wenn ich das richtig verstehe, kannst du keine Commits in hg ohne zusätzliche Plugins löschen.

Dies ist ein Fehler, den ich mit Mercurial gemacht habe, als ich neu darin war. Hab keine Angst vor diesen zusätzlichen Plugins. Einige von ihnen sind sehr leistungsfähige Werkzeuge und werden später häufig in das Kernprodukt integriert. So funktioniert Mercurial. Wenn Sie eine bestimmte Aufgabe ausführen müssen, holen Sie sich diese und verwenden Sie sie.

Das Überarbeiten des Verlaufs wird in der Mercurial-Welt als eine schlechte Sache angesehen, daher verfügt das Vanille-Produkt nicht immer über alles, was ein Git-Benutzer erwartet, aber es gibt viele Plugins für diejenigen, die die Anwendung verwenden möchten, aber unterschiedliche Prioritäten haben.

Mercurial hat nicht nur Hashes, sondern auch Revisionsnummern. Da ich einige meiner eigenen Commits hinzugefügt habe, haben alle Commits, die danach gezogen wurden, unterschiedliche Revisionsnummern vom zentralen Hauptrepo.

Kümmern Sie sich nicht um Revisionsnummern. Sie sind eine Frage der Bequemlichkeit, nicht mehr. Die Hash-Codes sind die wichtigen Kennungen, die von Repo zu Repo übertragen werden. Revisionsnummern sind in allen Repositorys inkonsistent. Schauen Sie sich Hg Init für eine gute Erklärung an.

Revisionsnummern sind nur eine praktische und einprägsame Abkürzung, wenn Sie mit einem einzelnen Repo arbeiten.

Ich aktualisiere nach dem Ziehen, um mein Master-Lesezeichen automatisch auf das neueste Commit zu verschieben, aber ich konnte in TortoiseHG keine Möglichkeit finden, dies zu tun.

Verwenden Sie bei der Verwendung von TortoiseHG die Workbench und nicht die anderen Tools. Alles ist (fast) da drin. Update befindet sich in den Revisionskontextmenüs. Es ist nicht immer intuitiv, aber es gibt einen guten Leitfaden unter dem obigen Link, und wenn Sie sich daran gewöhnen, klicken Sie mit sicherer Hingabe weg.

pdr
quelle
Ich habe mit Sicherheit gesehen, dass das Argument vor dem eigentlichen Benennen von Zweigen bedeutet, dass das Bearbeiten von Verlaufsdaten in hg
jk
9

Anscheinend gibt es 4 Möglichkeiten, die Verzweigung in Quecksilber zu behandeln. 1 und 4 sahen für mich völlig lächerlich aus, benannte Äste scheinen schwer zu sein

In Mercurial erstellen Sie keine Zweige. Jeder Commit ist quasi ein Zweig. Jeder Commit kann mehrere Eltern und mehrere Kinder haben. Das sind also die vier verschiedenen Arten, die gleichen Entitäten zu organisieren.

Sie können ihnen verschiedene Namen geben, das müssen Sie nicht , aber es ist eine gute Idee. Named Branches haben nichts Schweres an sich - es sind nur einige zusätzliche Metadaten. Ich persönlich bevorzuge benannte Zweige in jeder Situation vor allem anderen.

TortoiseHG und hg log zeigen immer noch, dass commit und default branch zwei Köpfe haben.

Was genau der Grund ist, benannte Zweige zu verwenden, anstatt alles hineinzuwerfen default.

Und wenn ich das richtig verstehe, kannst du keine Commits in hg ohne zusätzliche Plugins löschen.

Sie können in Mercurial überhaupt nichts löschen und sollten es auch nicht . Sie können es verwenden, hg stripaber es wird nicht protokolliert - Sie schneiden im Grunde nur einen Teil Ihres lokalen Repos ab. Sie können das nicht pushen, und wenn Sie aus einem Repo ziehen, das den Zweig hat, den Sie lokal entfernt haben, kommt er zurück.

Mercurial hat nicht nur Hashes, sondern auch Revisionsnummern. Da ich einige meiner eigenen Commits hinzugefügt habe, haben alle Commits, die danach gezogen wurden, unterschiedliche Revisionsnummern vom zentralen Hauptrepo.

Zahlen bedeuten nichts. Sie können sie ignorieren, wenn sie Sie verwirren.

Ich aktualisiere nach dem Ziehen, um mein Master-Lesezeichen automatisch auf das neueste Commit zu verschieben, aber ich konnte in TortoiseHG keine Möglichkeit finden, dies zu tun.

Ich habe TortoiseHG nicht benutzt, hg pull -uwerde aber beides pullund tun update.

Ich habe git schon immer benutzt, aber ich möchte einen Beitrag zu Python leisten, deshalb muss ich jetzt mercurial lernen und finde es sehr frustrierend.

Das ist in Ordnung, viele Mercurial-Benutzer sehen Git genauso (einschließlich mir).

ein trauriger Typ
quelle
6

Auch wenn Mercurial und Git ähnlich sind, haben sie unterschiedliche Designs. Der vielleicht wichtigste Designunterschied besteht darin, dass bei Mercurial-Modifikationen die Historie nicht so flexibel ist wie bei Git (weil sie irgendwie entmutigt sind).

Kurze Antwort : Es spielt keine Rolle, ob Sie eine kleine Menge von Änderungen haben, Sie können immer noch einen Zweig verwenden. Wenn Sie denken über das Löschen dann diesen Zweig ein verwenden Lesezeichen , damit Sie es später löschen und Streifen die Änderungen danach.

Versuchen Sie zunächst, ein wenig Licht auf einige der Dinge zu werfen, die Sie erwähnen:

  • 1 und 4 werden als Verzweigung betrachtet, da Sie bei jedem Festschreiben effektiv eine unbenannte Verzweigung erstellen (wenn es bei Ihrer Quelle / Ihrem gesegneten Repo zu derselben Zeit eine weitere Festschreibung gibt), die technisch eine Verzweigung ist. In Methode 4 erstellen Sie einen neuen "Kopf", in Methode 1 nicht . Köpfe sollen zusammengeführt werden. Ich stimme zu, dass Methode 1 irgendwie albern ist, aber einige scheinen es zu mögen ... für kleine Projekte würde ich raten.

  • Bei Methode 2 sind die Zweige nicht schwer, sondern dauerhaft . Sie können keine Verzweigung entfernen, wenn Sie nicht so etwas wie die Streifenerweiterung verwenden. Die Designphilosophie von Mercurial zielt nicht darauf ab, die Geschichte zu verändern (aber es ist besser geworden).

  • In Bezug auf Revisionsnummern sind sie nur eine lokale und besser lesbare Referenz für Sie, um alle Befehle zu verwenden, die mit Revisionen zu tun haben. Wenn Sie gerne Hashes verwenden, können Sie dies trotzdem tun. Revisionsnummern sind nur eine Abkürzung und werden von Mercurial für interne Operationen zwischen verschiedenen Repositorys ignoriert.

Um nun Ihre anderen Fragen zu beantworten:

  • Sie können überprüfen, mit welchen Köpfen Sie arbeiten hg heads. Wenn Sie 2 oder mehr Köpfe in einem einzelnen Zweig sehen, ist es vorzuziehen, dass sie zusammengeführt werden. Dort befindet sich wahrscheinlich Ihr Lesezeichen .
  • Um eine soeben vorgenommene Überarbeitung loszuwerden, könnten Sie dies tun hg rollback, aber ich schätze, dass dies nicht der Fall ist.
  • Um ein Lesezeichen zu löschen, machen Sie einfach hg bookmark --delete yourbookmark
  • Sie werden froh sein, dass es einfach ist, Zweige in der Geschichte zu schneiden. Sehen Sie sich die Rebase-Erweiterung und den Strip-Vorgang an .
  • Mercurial kommt bereits mit mehreren Erweiterungen gebündelt, aber sie sind nicht standardmäßig aktiviert . Gehen Sie einfach in einen beliebigen Ordner und klicken Sie mit der rechten Maustaste auf eine beliebige Stelle, um das TortoiseHG-Kontextmenü aufzurufen. Gehen Sie zu Globale Einstellungen und dann zu Erweiterungen: Aktivieren Sie die MQ-Erweiterung und die Rebase-Erweiterung. Die Kompatibilität zwischen den Repositorys wird dadurch nicht beeinträchtigt.
  • Jetzt, da Sie hier sind, können Sie entweder:
    • Streifen, wo Ihr Lesezeichen begann (dies behebt wahrscheinlich Ihr Problem)
    • Zur einfacheren Visualisierung können Sie Ihre Änderungen möglicherweise an der Vorderseite neu strukturieren und anschließend entfernen. Ich habe gerade Rebase erwähnt, weil es zu einem anderen Zeitpunkt für Sie nützlich sein könnte.

Außerdem können Sie in Git "private lokale Zweige" haben, da Sie diese explizit pushen müssen und Sie sie anschließend löschen können. In Mercurial drücken Sie alles, was Sie haben . Wenn Sie dies jedoch vermeiden möchten, können Sie die Funktion " Phasen" verwenden und eine Reihe von Überarbeitungen als geheim markieren . Geheime Revisionen werden nicht gepusht.

Schließlich tun Sie nichts Falsches , denken Sie nur daran, dass es sich nur um verschiedene Tools handelt, die mit leicht unterschiedlichen Einstellungen erstellt wurden. Dabei handelt es sich im Wesentlichen um das Ändern von Verlauf (git) oder das Nicht-Ändern von Verlauf (hg). In Mercurial ist es schwieriger, sich in den Fuß zu schießen und die Geschichte zu verändern (besonders mit Phases), und deshalb mögen es manche besser als Git .

dukeofgaming
quelle
Es kann nicht garantiert werden, dass alle dezentralen Kopien von Changesets, die einen benannten Zweig aufzeichnen, nach der Ausführung gelöscht wurden hg strip. Ich denke, man könnte dasselbe über dezentrale Kopien von Git-Zweignamen streiten, mit Ausnahme der Unterscheidung, dass benannte Zweige einen globalen Namensraum haben und Git-Zweignamen nicht. Und mehrere Köpfe existieren aufgrund von Namensverzweigungen. Es ist eine Art ansteckender Entwurfsfehler für ein dezentrales VCS.
Shelby Moore III
1

Ich finde es bei mercurial am einfachsten, sich keine Sorgen um Äste zu machen. Ich finde nur, wo in der Geschichte ich nach Bedarf bearbeiten und Commits erstellen möchte (auch bekannt als anonyme Zweige). Manchmal können Lesezeichen nützlich sein, wenn ich in verschiedenen Kontexten zwischen den Köpfen wechseln muss, aber meistens kümmere ich mich nicht darum. Benannte Zweige sind für langlebige Zweige (Fehlerbehebungszweige, Projektzweige) in Ordnung, aber für 1- oder 2-Commit-Korrekturen sind sie nicht das richtige Werkzeug für den Job.

Der Trick bei anonymen Zweigen besteht darin, ihre Phase auf "geheim" zu setzen, wenn Sie sie nicht pushen möchten, dh wenn Sie sie lokal halten möchten. Wenn Sie sie pushen möchten, aber keine weiteren Commits basierend auf ihnen möchten, legen Sie einfach einen "--close-branch" darüber, was bedeutet, dass sie nicht mehr in der "Heads" -Liste und in mercurial erscheinen hört auf, sich über mehrere Köpfe auf diesem Zweig zu beschweren.

bc.cam
quelle
-1

Ich denke, wir können einfach ein Lesezeichen anstelle eines Zweigs verwenden. Wir werden das Produkt trotzdem weiter unterstützen, und das Zusammenführen von zwei Niederlassungen auf lange Sicht würde große Kopfschmerzen bereiten.

Weijing Lin
quelle