Git Guide Teilenummer 1: Alles, was Sie ĂŒber das .git-Verzeichnis wissen mĂŒssen



Wenn Sie anfangen, Git zu verwenden, besuchen Sie ein neues Land, dessen Sprache Sie nicht kennen. Es ist zwar klar, wo Sie sind und wohin Sie gehen mĂŒssen, aber alles ist in Ordnung, aber wenn Sie sich verlaufen, beginnen große Probleme.

Es gibt unzÀhlige Tutorials zu Git-Befehlen im Internet, aber in diesem Artikel geht die Arbeit von Git tiefer als nur das Lernen von Befehlen.

Dies ist der erste Teil des Git-Leitfadens aus dem Pierre de Wulf-Blog, der vom Mail.ru Cloud Solutions- Team ĂŒbersetzt wurde

Neue Benutzer finden es schwierig, sich mit Git vertraut zu machen. Dies ist ein mĂ€chtiges Werkzeug, aber leider nicht sehr einfach zu erlernen. Viele neue Konzepte, Befehle, die unterschiedliche Aktionen ausfĂŒhren, ob die Datei als Parameter ĂŒbergeben wird oder nicht, unklares Feedback ...

Die einzige Möglichkeit, all diese Schwierigkeiten zu ĂŒberwinden, besteht wahrscheinlich darin, ein wenig mehr als nur Git Commit / Push zu lernen, um zu verstehen, wie Git funktioniert.

Git-Ordner


Wenn Sie mit dem Befehl git init ein neues Repository erstellen, erstellt Git einen magischen Ordner, .git. Es enthÀlt alles, was Sie brauchen, damit Git funktioniert. Wenn Sie Git aus Ihrem Projekt entfernen möchten, die Projektdateien jedoch auf der Festplatte belassen möchten, löschen Sie einfach den Ordner .git. Obwohl wer kann das brauchen?

    ├── HEAD
    ├── branches
    ├── config
    ├── description
    ├── hooks
    │ ├── pre-commit.sample
    │ ├── pre-push.sample
    │ └── ...
    ├── info
    │ └── exclude
    ├── objects
    │ ├── info
    │ └── pack
    └── refs
     ├── heads
     └── tags


Hier ist der Inhalt eines typischen .git-Ordners vor Ihrem ersten Commit:

  1. KOPF - wir werden das spÀter betrachten.
  2. config — , , , url , , email . git config, .
  3. description — gitweb .
  4. hooks — , Git. , , / commit/rebase/pull
 . push .
  5. Hier werden Info-Exclude- Dateien beschrieben, die Sie nicht in das Repository aufnehmen möchten. Die FunktionalitĂ€t dieser Datei ist dieselbe wie die der .gitignore-Datei, außer dass sie nicht in das Repository ĂŒbertragen wird. In der Praxis reicht .gitignore normalerweise fĂŒr alle Aufgaben aus.

Was ist in dem Commit enthalten?


Jedes Mal, wenn Sie eine Datei erstellen und Änderungen festschreiben, archiviert Git die Datei und speichert sie in ihrer Datenstruktur. Ein archiviertes Objekt wird mit einem eindeutigen Namen erstellt und im Objektordner gespeichert.

Bevor Sie den Objektordner untersuchen, klÀren wir, was ein Commit ist. Ein Commit ist ein Nugget des aktuellen Status von Dateien in einem Arbeitsordner, aber nicht nur das.

Wenn Sie Änderungen festschreiben, fĂŒhrt Git nur zwei Dinge aus:

  1. Wenn sich die Datei im Arbeitsordner nicht geĂ€ndert hat, wird dem Snapshot einfach der Name der komprimierten Datei (Hash) hinzugefĂŒgt.
  2. Wenn sich die Datei im Arbeitsordner geĂ€ndert hat, wird sie komprimiert, im Objektordner abgelegt und der Name der komprimierten Datei (Hash) zum Snapshot hinzugefĂŒgt.

NatĂŒrlich wird hier alles etwas vereinfacht beschrieben, dies reicht jedoch aus, um die laufenden Prozesse zu verstehen.

Sobald ein Schnappschuss erstellt wurde, wird er ebenfalls archiviert und mit einem Hash benannt und dann im Objektordner abgelegt.

├── 4c
│ └── f44f1e3fe4fb7f8aa42138c324f63f5ac85828 // hash
├── 86
│ └── 550c31847e518e1927f95991c949fc14efc711 // hash
├── e6
│ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 // hash
├── info // let's ignore that
└── pack // let's ignore that too


So sieht der Objektordner aus, nachdem ich file_1.txt erstellt und festgeschrieben habe. Bitte beachten Sie, dass wenn der Hash Ihrer Datei mit "4cf44f1e ..." beginnt, Git ihn unter dem Namen "f44f1e ..." in einem Unterordner mit dem Namen "4c" speichert. Somit werden die Dateien in 256 Unterordnern angeordnet und jeder hat nicht zu viele Dateien.

Wie Sie sehen können, haben wir drei Hashes. Eine fĂŒr file_1.txt, die zweite fĂŒr einen Snapshot, der beim Festschreiben erstellt wurde. WofĂŒr ist der dritte? Der dritte Hash wird erstellt, da das Commit auch ein Objekt ist. Es wird auch archiviert und im Objektordner abgelegt.

Sie mĂŒssen sich daran erinnern, dass das Festschreiben aus vier Dingen besteht:

  1. Der Name (Hash) des Snapshots des Arbeitsverzeichnisses.
  2. Kommentar.
  3. Informationen darĂŒber, wer das Commit ausgefĂŒhrt hat.
  4. Der Hash des ĂŒbergeordneten Commits.

Überzeugen Sie sich selbst, was passiert, wenn Sie die Festschreibungsdatei entpacken:

git cat-file -p 4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828

Und hier ist was Sie sehen werden:

tree 86550c31847e518e1927f95991c949fc14efc711
author Pierre De Wulf 
<test[@gmail.com](mailto:pierredewulf31@gmail.com)> 1455775173 -0500
committer Pierre De Wulf 
<[test@gmail.com](mailto:pierredewulf31@gmail.com)> 1455775173 -0500
commit A

Sie sehen erwartungsgemĂ€ĂŸ den Hash des Snapshots, den Autor und den Kommentar des Commits. Zwei Dinge sind hier wichtig:

  1. Der Hash des Schnappschusses "86550 ..." ist ebenfalls ein Objekt und kann im Objektordner angezeigt werden.
  2. Da dies das erste Commit ist, gibt es kein ĂŒbergeordnetes Commit.

Was ist wirklich auf dem Bild?

git cat-file -p 86550c31847e518e1927f95991c949fc14efc711
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file_1.txt

Hier sehen wir das Objekt, das sich in unserer Lagerung von Objekten befand, das einzige Objekt in unserem Bild.

Zweig, Tags, KOPF sind ein und dasselbe


Jetzt verstehen Sie, dass alles in Git durch den richtigen Hash erhalten werden kann. Schauen wir uns jetzt HEAD an. Also, was ist da?

cat HEAD
ref: refs/heads/master

Es gibt keinen Hash, und das ist sinnvoll, da HEAD ein Zeiger auf den oberen Rand des Zweigs ist, mit dem Sie arbeiten. Wenn Sie sich die Datei refs / Heads / Master ansehen, werden Sie sehen:

cat refs/heads/master
4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828
 

Kommt mir bekannt vor? NatĂŒrlich ist es ein Hash des ersten Commits! Dies zeigt, dass Tags und Zweige nur Zeiger auf ein Commit sind. Wenn Sie dies verstehen, können Sie alle gewĂŒnschten Tags, alle gewĂŒnschten Zweige und das Commit, auf das sie zeigen, entfernen. Das einzige ist, dass es schwieriger sein wird, darauf zuzugreifen. Wenn Sie mehr darĂŒber wissen möchten, lesen Sie das Git-Buch .

Letzter Kommentar


Nach dem Lesen sollte Ihnen klar werden, dass Git lediglich Ihren Arbeitsordner archiviert und ihn mit einigen zusĂ€tzlichen Informationen in den Objektordner legt. Wenn Sie mit Git vertraut genug sind, haben Sie die volle Kontrolle darĂŒber, welche Dateien in das Commit aufgenommen werden und welche nicht.

Ich glaube, dass das Festschreiben kein Snapshot des Arbeitsordners ist, sondern ein Snapshot der Dateien, die Sie festschreiben möchten. Und wo speichert Git die Liste der Dateien, die Sie festschreiben möchten? Diese Liste wird in einer Indexdatei gespeichert. Wir werden uns nicht eingehend mit diesem Thema befassen. Wenn Sie interessiert sind, finden Sie hier weitere Details .

Übersetzt mit UnterstĂŒtzung von Mail.ru Cloud Solutions .

Was noch zu lesen :

  1. Einfache Caching-Methoden in GitLab CI: Ein Bildhandbuch .
  2. -Agile .
  3. .


All Articles