Git-Äquivalente der gängigsten Mercurial-Befehle?


89

Ich habe Mercurial verwendet, möchte aber eine kurze Demo von Git machen.

Was sind die Git-Äquivalente von:

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

3
Ich wäre neugierig, eine Tabelle zu sehen, die alle äquivalenten Befehle zwischen mindestens den gängigen DVCS zeigt, falls jemand auf einen stößt, während er hier eine Antwort findet. Ich habe in einer schnellen Google-Suche keine gefunden.
Mark Rushakoff

Antworten:


104

Der Git-HG Rosetta Stein ist nicht schlecht

Es gibt ein paar andere Fallstricke zwischen den beiden, die dort nicht erwähnt werden. Diese Liste wurde aus meinem eigenen Blog-Beitrag entfernt, als ich in die andere Richtung ging (git -> hg).

Hg .hgignore , Syntax: glob ist das gleiche Verhalten wie gits .gitignore.

Git .git/config , die ~/.gitconfigVerwendung git-config die Werte zu ändern ,
Hg .hg/hgrc , die ~/.hgrcVerwendunghg help -c config

Git git commit -v<br> Hg hg diff | less; hg commit

Git gitk<br> Hg hg view, or thg from [TortoiseHg][1]

Git git gui<br> Hg Mercurial liefert keine GUI zur Auswahl von Änderungssätzen, sondern nur einen Konsolenbefehl hg record.

Git git rebase<br> Hg hg Rebase . Denn git rebase --interactivees gibt hg histedit oder Mercurial Queues

Git git push URL ; git remote add origin URL<br> Hg hg push URL; $EDITOR .hg/hgrc ; [paths] default = URL

Git gitk, git log origin/master..HEAD<br> Hg hg outgoing

Git git format-patch RANGE<br> Hg hg email -m filename -o

Git git add . ; Beachten Sie den Punkt
Hg hg add ; Kein Punkt erforderlich.

Git git checkout REVISION-KEY<br> Hg hg update CHANGESET


Um die Lücken zu füllen, einige der nützlichsten Befehle von Mercurial:

Hg hg record
Git git add -p; git commit

Hg hg inc [URL]
Git Kein echtes Äquivalent. Sie können nur das Äquivalent von tunhg pull; hg log -r .:

Hg hg out URL
Git Bitte hinzufügen, wenn Sie wissen wie.

Für die Lösung von Zusammenführungskonflikten verfügt der hg resolveBefehl in Mercurial über einige Optionen, die das Verhalten ändern:

Hg hg resolve -m FILE (markiert die Datei als behoben, indem das Konfliktproblem manuell behoben wurde)
Git git add FILE

Hg hg resolve -u FILE markiert die Datei als nicht aufgelöstes
Git git reset HEAD FILE , um die Datei zu entfernen

Hg hg resolve -l (listet Dateien mit gelösten / ungelösten Konflikten auf)
Git git status - Dateien, die sauber zusammengeführt wurden, werden automatisch zum Index hinzugefügt, diejenigen, die keine Konflikte haben

Hg hg resolve FILE (versucht nach einer Zusammenführung, die Datei erneut zusammenzuführen)
Git kein Äquivalent für die erneute Zusammenführung, von dem ich weiß.


4
Vielleicht sollte dies ein Wiki sein.
Keyo

1
Für Gitk gibt es einen grafischen Klon für Mercurial, hgview (beachten Sie, dass er sich vom Befehl "hg view" unterscheidet)
tonicebrian

1
Ein kleiner Vorschlag: Vertauschen des Hg- und Git-Textes (wie es Git für Mercurial-Benutzer ist)
Chris S

1
Obwohl hg recordes nicht sehr benutzerfreundlich ist, ist hg crecord(von der crecord-Erweiterung ) eine fluchbasierte Text-Benutzeroberfläche, die extrem einfach zu bedienen ist.
Denilson Sá Maia

1
@ ozzy432836 Ich habe Hg seit Jahren nicht mehr verwendet, aber ich denke, das sind die Entsprechungsäquivalente. FWIW die Standardaktion von hg resolveist einer der Gründe, warum ich Git bevorzuge. Standardmäßig hg resolvezerstört Ihre schön manuell aufgelöste Zusammenführung, wenn Sie keine Argumente übergeben!
Richq

48

Hinweis: Einer der größten Unterschiede zwischen Git und Mercurial ist das explizite Vorhandensein des Index- oder Staging-Bereichs .

Von Mercurial für Git User :

Git ist das einzige DistributedSCM , das das Konzept des Index oder des Staging-Bereichs offenlegt. Die anderen können es implementieren und ausblenden, aber in keinem anderen Fall ist sich der Benutzer dessen bewusst und muss sich nicht damit befassen.

Das grobe Äquivalent von Mercurial ist das DirState, das die Statusinformationen der Arbeitskopie steuert, um die Dateien zu bestimmen, die in das nächste Commit aufgenommen werden sollen. In jedem Fall wird diese Datei jedoch automatisch verarbeitet.
Darüber hinaus ist es möglich, beim Festschreiben selektiver vorzugehen, indem Sie entweder die Dateien angeben, die Sie festschreiben möchten, oder die RecordExtension.

Wenn Sie sich beim Umgang mit dem Index unwohl gefühlt haben, wechseln Sie zum Besseren ;-)


Der Trick ist, dass Sie den Index wirklich verstehen müssen, um Git vollständig auszunutzen. Wie dieser Artikel vom Mai 2006 uns damals erinnert (und es ist heute noch wahr):

"Wenn Sie den Index ablehnen, verweigern Sie wirklich git selbst."

Dieser Artikel enthält viele Befehle, die jetzt einfacher zu verwenden sind (verlassen Sie sich also nicht zu sehr auf den Inhalt;)), aber die allgemeine Idee bleibt:

Sie arbeiten an einer neuen Funktion und nehmen geringfügige Änderungen an einer Datei vor.

# working, add a few lines
$ git add myFile
# working, another minor modification
$ git add myFile

Zu diesem Zeitpunkt werden bei Ihrem nächsten Commit zwei geringfügige Änderungen in der aktuellen Verzweigung vorgenommen

# working, making major modification for the new features
# ... damn! I cannot commit all this in the current branch: nothing would work

$ git commit

Zeichnet nur die Änderungen auf, die zu diesem Zeitpunkt zum Staging-Bereich (Index) hinzugefügt wurden, nicht die wichtigsten Änderungen, die derzeit in Ihrem Arbeitsverzeichnis sichtbar sind.

$ git branch newFeature_Branch
$ git add myFile

Beim nächsten Commit werden alle anderen wichtigen Änderungen in der neuen Verzweigung 'newFrature_Branch' aufgezeichnet.

Das interaktive Hinzufügen oder sogar das Aufteilen eines Commits sind Funktionen, die Mercurial über den hg recordBefehl ' ' oder andere Erweiterungen zur Verfügung stellt: Sie müssen sie installieren RecordExtensionoder die CrecordExtension.
Dies ist jedoch nicht Teil des normalen Workflows für Mercurial.

Git betrachtet ein Commit als eine Reihe von " Änderungen des Dateiinhalts " und lässt Sie diese Änderungen einzeln hinzufügen.
Sie sollten diese Funktion und ihre Konsequenzen untersuchen: Der größte Teil der Git-Leistung (wie die Möglichkeit, eine Zusammenführung einfach rückgängig zu machen (oder das Problem zu halbieren oder ein Commit rückgängig zu machen) , im Gegensatz zu Mercurial ) stammt aus diesem Paradigma des "Dateiinhalts".


tonfa (im Profil: "Hg dev, pythonist": Zahlen ...) mischte sich in den Kommentaren ein:

Es gibt nichts grundsätzlich "git-ish" im Index, hg könnte einen Index verwenden, wenn er als wertvoll erachtet wird, tatsächlich mqoder shelvebereits einen Teil davon.

Oh Junge. Jetzt geht das schon wieder los.

Erstens bin ich nicht hier, um ein Werkzeug besser aussehen zu lassen als ein anderes. Ich finde Hg großartig, sehr intuitiv und gut unterstützt (insbesondere unter Windows, meiner Hauptplattform, obwohl ich auch unter Linux und Solaris8 oder 10 arbeite).

Der Index ist tatsächlich vorne und mittig in der Art, wie Linus Torvalds mit einem VCS arbeitet :

Git verwendete explizite Indexaktualisierungen vom ersten Tag an, noch bevor die erste Zusammenführung durchgeführt wurde. So habe ich einfach immer gearbeitet. Ich neige dazu, schmutzige Bäume zu haben, mit einem zufälligen Patch in meinem Baum, den ich nicht festschreiben möchte, da es sich nur um ein Makefile-Update für die nächste Version handelt

Die Kombination des Index (der nicht nur in Git zu finden ist) und des Paradigmas "Content is King" macht ihn nun ziemlich einzigartig und "git-ish" :

git ist ein Inhalts-Tracker , und ein Dateiname hat keine Bedeutung, es sei denn, er ist mit seinem Inhalt verknüpft. Daher besteht das einzig vernünftige Verhalten für git add filename darin, den Inhalt der Datei sowie ihren Namen zum Index hinzuzufügen.

Hinweis: Der "Inhalt" ist hier wie folgt definiert :

Gits Index ist grundsätzlich sehr definiert als

  • ausreichend, um den gesamten " Inhalt " des Baums zu enthalten (und dies schließt alle Metadaten ein: Der Dateiname, der Modus und der Dateiinhalt sind alle Teile des "Inhalts" und für sich genommen alle bedeutungslos! )
  • Zusätzliche "stat" -Informationen, um die offensichtlichen und trivialen (aber äußerst wichtigen!) Optimierungen des Dateisystemvergleichs zu ermöglichen.

So sollten Sie wirklich den Index sehen , wie sein Inhalt .

Der Inhalt ist nicht der "Dateiname" oder der "Dateiinhalt" als separate Teile. Sie können die beiden wirklich nicht trennen .
Dateinamen alleine machen keinen Sinn (sie müssen auch Dateiinhalte haben), und Dateiinhalte alleine sind ähnlich sinnlos (Sie müssen wissen, wie man sie erreicht).

Ich versuche zu sagen, dass Git es Ihnen grundsätzlich nicht erlaubt , einen Dateinamen ohne dessen Inhalt zu sehen. Die ganze Vorstellung ist verrückt und ungültig. Es hat keine Relevanz für die "Realität".

Aus den FAQ ergeben sich folgende Hauptvorteile:

  • mit einer feinen Granularität begehen
  • helfen Ihnen dabei, eine nicht festgeschriebene Änderung für einen angemessen langen Zeitraum in Ihrem Baum zu behalten
  • Führen Sie mehrere kleine Schritte für ein Commit aus, überprüfen Sie, was Sie getan haben git diff, und validieren Sie jeden kleinen Schritt mit git addoder git add -u.
  • ermöglicht ein hervorragendes Management von Merge Konflikte: git diff --base, git diff --ours, git diff --theirs.
  • Ermöglicht git commit --amenddas Ändern nur der Protokollnachricht, wenn der Index in der Zwischenzeit nicht geändert wurde

Ich persönlich denke, dieses Verhalten sollte nicht die Standardeinstellung sein. Sie möchten, dass die Leute etwas festlegen, das getestet oder zumindest kompiliert wird

Während Sie im Allgemeinen Recht haben (in Bezug auf den "getesteten oder kompilierten" Teil), können Sie mit der Art und Weise, wie Git Sie verzweigen und zusammenführen (Cherry-Picking oder Rebasing), so oft Sie möchten in einem temporären privaten Zweig festschreiben (nur Push) ("Backup" -Repository), während diese "hässlichen Commits" in einem öffentlichen Zweig mit den richtigen Tests erneut ausgeführt werden.


1
Es gibt nichts grundsätzlich "git-ish" im Index, hg könnte einen Index verwenden, wenn er als wertvoll erachtet wird, tatsächlich machen mq oder Shelve bereits einen Teil davon. Ich persönlich denke, dieses Verhalten sollte nicht die Standardeinstellung sein. Sie möchten, dass die Leute etwas festlegen, das getestet oder zumindest kompiliert wird.
Tonfa


In Mercurial verhält sich Ihr letztes Commit (vor dem Push) wie der Git-Index. Sie können es ändern, zurücksetzen, die Commit-Nachricht ändern oder abschließen, indem Sie die Phase in "öffentlich" ändern.
Ruslan Yushchenko

12

Mercurial:

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

Git-Äquivalente:

git init
git add -A
git commit -am "comment" # -a is not necessary along with the above add -A
git status

1
Ich (und ich denke, die meisten Git-Benutzer) verwenden git add -umehr als -A; -u führt Änderungen für alle verfolgten Dateien durch und ignoriert neue nicht verfolgte Dateien.
u0b34a0f6ae

3
aber addremove fügt neue nicht verfolgte Dateien hinzu :)
tonfa

3
Ich bin nicht einverstanden mit , dass git statusentspricht hg status. Ich bin neu in Hg und habe es nicht geschafft, dass der Status von hg ähnlich wie der von Git funktioniert.
Léo Léopold Hertz 준영

1

Es ist ungefähr das gleiche, ohne Add-Remove:

git init # Start a project in the current directory
git status # Displays both changes and added/removed files
git commit -m "comment" # commit any uncommited changes

Dies sind jedoch Befehle, die Sie verwenden würden, wenn Sie alleine arbeiten. Sie kommen in das nette Zeug, wenn Sie Ihre Änderungen mit der Arbeit anderer Leute mit git pullund git pushund verwandten Befehlen zusammenführen möchten .


und um das Ganze abzurunden, verwenden Sie "git show" (wie "git diff", glaube ich), um zu sehen, was Sie seit dem letzten Commit geändert haben.
PHLAK

2
"git show" (ohne Argumente) zeigt Ihnen die Änderungen im letzten Commit. "git diff" zeigt Ihnen die Änderungen seit dem letzten Commit.
Dustin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.