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 record
Befehl ' ' oder andere Erweiterungen zur Verfügung stellt: Sie müssen sie installieren RecordExtension
oder 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 mq
oder shelve
bereits 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 add
oder git add -u
.
- ermöglicht ein hervorragendes Management von Merge Konflikte:
git diff --base
, git diff --ours
, git diff --theirs
.
- Ermöglicht
git commit --amend
das Ä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.