2013-08-22 5 views
5

Git Benutzer, die einen Arbeitsablauf mit leichten Verzweigungen in Mercurial erreichen möchten, sind oft pointed bis Mercurial bookmarks. Kurz gesagt, besteht die Empfehlung darin, mehrere Köpfe zu pflegen, die den Git-Zweigen entsprechen, und sie mit Lesezeichen zu benennen.Hg entspricht "git log master..HEAD" bei Verwendung von Lesezeichen als leichte Zweige?

Ein üblicher Wunsch in einem solchen Workflow besteht darin, eine Liste aller Commits zu sehen, die in dem aktuellen Zweig seit dem Punkt gemacht wurden, an dem er vom Stammzweig abgezweigt wurde (üblicherweise master oder ein anderer langlebiger Zweig).

git log <master>..HEAD 

wo <master> der Name des Mutter Zweig ist: In git, kann dies mit durchgeführt werden.

Ich frage mich, was wäre das Äquivalent dieses Befehls in Mercurial mit Lesezeichen?

Ich suche einen Befehl mit den folgenden Eigenschaften:

  • Es hat die gleiche Semantik wie der git Befehl oben in Bezug auf die Überprüfungen es auflistet und in welcher Reihenfolge (offensichtlich).
  • Wie beim Befehl git wird der Name des aktuellen "Zweiges" (Lesezeichen) nicht eingegeben.
  • Es erfordert nicht die Existenz eines Lesezeichens an dem Punkt, an dem der aktuelle "Zweig" vom übergeordneten "Zweig" abwich. Es kann die Existenz eines Lesezeichens erfordern, das auf den Kopf des übergeordneten "Zweigs" zeigt - wir können dieses Lesezeichen master aufrufen.
  • Es ist kurz. Ich würde lieber keinen langen Revset-Ausdruck eingeben, der jedes Mal in Anführungszeichen gesetzt werden muss, wenn ich dies tun möchte. (Das heißt, habe ich noch herauszufinden jede revset Ausdruck, der mir gibt, was ich will, so dass selbst eine lange würde Fortschritt.)
+0

Können Sie (einige) Git's DAG zeigen und relevant für 'git log ..HEAD' Teil der Geschichte darauf markieren? Nehmen wir an, ich habe kein Wissen über Git –

Antwort

6

Git log Mann-Seite (mit Link Revisionen Git Mann-Seite) definiert Spezifikationen Bereich wie das wie folgt:

<rev1>..<rev2> 

    Include commits that are reachable from <rev2> but exclude those that are reachable from <rev1>. 

Es ist auch zu bestellen sagen:

By default, the commits are shown in reverse chronological order. 

dieser Beschreibung angegeben, die Mercurial revset

reverse(ancestors(.)-ancestors(<bookmark>)) 

sollte ausreichen.

Bei näherem Hinsehen folgt diese Umdrehung tatsächlich der Spezifikation bis auf den Buchstaben. Es zeigt in umgekehrter Reihenfolge die Commits an, die von den Eltern der aktuellen Arbeitskopie erreichbar sind, ausgenommen die, die von dem angegebenen Bookmark aus erreichbar sind (in Ihrem Fall "Master"). Ich halte die Git-Syntax für eine Kurzform für diese Spezifikation. Sie können dasselbe (Erstellen einer Verknüpfung) in Mercurial mithilfe der sogenannten revset-Aliase ausführen.

Setzen Sie die folgenden Zeilen in Ihre .hgrc:

[revsetalias] 
range($1)=reverse(ancestors(.)-ancestors($1)) 

ermöglicht es Ihnen, diese zu nutzen:

hg log -r range(<bookmark>) 

Wenn Sie es flexibler machen möchten, können Sie es wie folgt definieren das .hgrc:

[revsetalias] 
range($1,$2)=reverse(ancestors($2)-ancestors($1)) 

und verwenden Sie die folgende bekommen das HEAD Beispiel:

hg log -r range(<bookmark>, .) 

Wenn das Wort „Bereich“ zu viel für Sie zu schreiben, können Sie einige Sonderzeichen, auch:

[revsetalias] 
_($1)=reverse(ancestors(.)-ancestors($1)) 

Die resultierende Stenografie

hg log -r_(<bookmark>) 

ist dann noch kürzer als

git log <bookmark>..HEAD 

Aber natürlich ist dies nur pingelig, sowieso.

+0

Wenn Sie revsets verwenden, werden die * infix-Operatoren * von revset ** besser ** als die * prädikaten *: i. e. '" x :: y "' oder '" x: y "' (abhängig von den Bedingungen: DAG oder Revisionsnummernbereich) –

+0

Aber diese ergeben nicht das, was das OP wollte. x :: y zeigt den DAG-Bereich, x: y den chronologischen Bereich. Auch wenn x..y in Mercurial eine gültige Abkürzung für x :: y ist, tut es nicht das, was Git's x..y tut, genau wie in meiner Antwort von Gits Man-Pages zitiert. – Face

+0

Es ** tut ** das gleiche Set. Sortierreihenfolge ist eine andere, nächste Frage –