Suche…


Repo

Ein git repository ist eine Datenstruktur auf der Festplatte, in der Metadaten für eine Reihe von Dateien und Verzeichnissen gespeichert werden.

Es befindet sich im .git/ Ihres Projekts. Jedes Mal, wenn Sie Daten an git übergeben, werden diese hier gespeichert. Umgekehrt enthält .git/ jeden einzelnen Commit.

Ihre Grundstruktur sieht folgendermaßen aus:

.git/
    objects/
    refs/

Objekte

git ist grundsätzlich ein Schlüsselwertspeicher. Wenn Sie Daten zu git hinzufügen, wird ein object und der SHA-1-Hash des object als Schlüssel verwendet.

Daher kann jeder Inhalt in git anhand seines Hashes nachgeschlagen werden:

git cat-file -p 4bb6f98

Es gibt 4 Object :

  • blob
  • tree
  • commit
  • tag

HEAD ref

HEAD ist ein Sonder ref . Es zeigt immer auf das aktuelle Objekt.

Sie können sehen, wohin es aktuell zeigt, indem Sie die .git/HEAD Datei überprüfen.

Normalerweise zeigt HEAD auf einen anderen ref :

$cat .git/HEAD
ref: refs/heads/mainline

Es kann aber auch direkt auf ein object :

$ cat .git/HEAD
4bb6f98a223abc9345a0cef9200562333

Dies ist, was als "losgelöster Kopf" bekannt ist - weil HEAD nicht mit einem ref , sondern auf ein object .

Refs

Ein ref ist im Wesentlichen ein Zeiger. Es ist ein Name, der auf ein object verweist. Zum Beispiel,

"master" --> 1a410e...

Sie werden in .git / refs / heads / in Klartextdateien gespeichert.

$ cat .git/refs/heads/mainline
4bb6f98a223abc9345a0cef9200562333

Dies wird üblicherweise als branches . Sie ist jedoch zu beachten , dass in git so etwas wie einen gibt es kein branch - nur ref .

Nun ist es möglich, git rein zu navigieren, indem Sie direkt durch ihre Hashwerte zu verschiedenen objects springen. Dies wäre jedoch äußerst unpraktisch. Ein ref gibt Ihnen einen bequemen Namen, um auf objects zu verweisen. Es ist viel einfacher, git zu fragen, ob er an einen bestimmten Ort geht und nicht per Hash.

Commit-Objekt

Ein commit ist wahrscheinlich der object der für git Benutzer am bekanntesten ist, da er üblicherweise mit den git commit Befehlen erstellt wird.

Der commit enthält jedoch keine geänderten Dateien oder Daten. Sie enthält vielmehr meist Metadaten und Verweise auf andere objects , die den eigentlichen Inhalt des commit .

Ein commit enthält einige Dinge:

  • Hasch eines tree
  • Hash eines übergeordneten commit
  • Name des Autors / E-Mail, Name des Commiters / E-Mail
  • Nachricht übermitteln

Sie können den Inhalt jedes Commits folgendermaßen sehen:

$ git cat-file commit 5bac93
tree 04d1daef...
parent b7850ef5...
author Geddy Lee <[email protected]>
commiter Neil Peart <[email protected]>

First commit!

Baum

Ein sehr wichtiger Hinweis ist , dass der tree speichert jede Datei in Ihrem Projekt - Objekte und speichert ganze Dateien nicht diffs. Dies bedeutet, dass jeder commit eine Momentaufnahme des gesamten Projekts enthält *.

* Technisch werden nur geänderte Dateien gespeichert. Dies ist jedoch eher ein Implementierungsdetail für die Effizienz. Aus commit sollte ein commit als vollständige Kopie des Projekts betrachtet werden .

Elternteil

Die parent Zeile enthält einen Hash eines anderen commit und kann als "übergeordneter Zeiger" betrachtet werden, der auf das "vorherige Festschreiben" verweist. Dies bildet implizit ein Commit-Diagramm, das als Commit-Diagramm bezeichnet wird . Insbesondere handelt es sich um eine gerichtete azyklische Grafik (DAG).

Baumobjekt

Eine tree stellt im Wesentlichen einen Ordner in einem herkömmlichen Dateisystem dar: verschachtelte Container für Dateien oder andere Ordner.

Ein tree enthält:

  • 0 oder mehr blob Objekte
  • 0 oder mehr tree - Objekte

Genauso wie Sie mit ls oder dir den Inhalt eines Ordners auflisten können, können Sie den Inhalt eines tree auflisten.

$ git cat-file -p 07b1a631
100644 blob b91bba1b   .gitignore
100644 blob cc0956f1   Makefile
040000 tree 92e1ca7e   src
...

Sie können die Dateien in einem commit nachschlagen commit indem Sie zuerst den Hash des tree im commit suchen und dann diesen tree :

$ git cat-file commit 4bb6f93a
tree 07b1a631
parent ...
author ...
commiter ... 
 
$ git cat-file -p 07b1a631
100644 blob b91bba1b   .gitignore
100644 blob cc0956f1   Makefile
040000 tree 92e1ca7e   src
...

Blob-Objekt

Ein blob enthält beliebige binäre Dateiinhalte. Normalerweise handelt es sich dabei um unformatierten Text wie Quellcode oder Blogartikel. Es können aber genauso einfach die Bytes einer PNG-Datei oder etwas anderes sein.

Wenn Sie den Hash eines blob , können Sie dessen Inhalt betrachten.

$ git cat-file -p d429810
package com.example.project

class Foo {
 ...
}
...

Sie können zum Beispiel einen tree wie oben durchsuchen und dann einen der blobs darin betrachten.

$ git cat-file -p 07b1a631
100644 blob b91bba1b   .gitignore
100644 blob cc0956f1   Makefile
040000 tree 92e1ca7e   src
100644 blob cae391ff   Readme.txt

$ git cat-file -p cae391ff
Welcome to my project! This is the readmefile
...

Neue Commits erstellen

Der Befehl git commit führt einige Dinge aus:

  1. Erstellen Sie blobs und trees , um Ihr Projektverzeichnis darzustellen - in .git/objects gespeichert
  2. Erstellt ein neues commit Objekt mit Ihren Autorinformationen, der Commit-Nachricht und dem tree aus Schritt 1 - ebenfalls in .git/objects gespeichert
  3. Aktualisiert den HEAD ref in .git/HEAD mit dem Hash des neu erstellten commit

Dies führt dazu, dass ein neuer Snapshot Ihres Projekts zu git hinzugefügt wird, der mit dem vorherigen Status verbunden ist.

KOPF bewegen

Wenn Sie git checkout für ein Commit ausführen (angegeben durch Hash oder Ref), teilen Sie git mit, dass Ihr Arbeitsverzeichnis so aussehen soll, wie es bei der Momentaufnahme gemacht wurde.

  1. Aktualisieren Sie die Dateien im Arbeitsverzeichnis so, dass sie der tree im commit
  2. Aktualisieren Sie HEAD , dass es auf den angegebenen Hash oder Ref verweist

Refs bewegen

Das Ausführen von git reset --hard verschiebt die Refs in den angegebenen Hash / Ref.

MyBranch auf b8dc53 :

$ git checkout MyBranch      # moves HEAD to MyBranch
$ git reset --hard b8dc53    # makes MyBranch point to b8dc53     

Neue Refs erstellen

git checkout -b <refname> wird ein neuer Ref erstellt, der auf das aktuelle commit verweist.

$ cat .git/head
1f324a

$ git checkout -b TestBranch

$ cat .git/refs/heads/TestBranch
1f324a


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow