English ▾ Themen ▾ Neueste Version ▾ git-commit zuletzt aktualisiert in 2.52.0

NAME

git-commit - Änderungen im Repository aufzeichnen

SYNOPSIS

git commit [-a | --interactive | --patch] [-s] [-v] [-u[<mode>]] [--amend]
	   [--dry-run] <commit>_ | --fixup [(amend|reword):"><commit>]
	   [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
	   [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
	   [--date=<date>] [--cleanup=<mode>] [--[no-]status]
	   [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]
	   [(--trailer <token>[(=|:)<value>])…​] [-S[<keyid>]]
	   [--] [<pathspec>…​]

BESCHREIBUNG

Erstellt einen neuen Commit, der den aktuellen Inhalt des Index und die angegebene Log-Nachricht zur Beschreibung der Änderungen enthält. Der neue Commit ist ein direktes Kind von HEAD, normalerweise die Spitze des aktuellen Branches, und der Branch wird aktualisiert, um darauf zu zeigen (es sei denn, es ist kein Branch mit dem Arbeitsverzeichnis verbunden, in diesem Fall wird HEAD wie in git-checkout[1] beschrieben, "detached".)

Der zu committende Inhalt kann auf verschiedene Weisen angegeben werden

  1. durch Verwendung von git-add[1], um Änderungen inkrementell zum Index hinzuzufügen, bevor der Befehl commit verwendet wird (Hinweis: selbst geänderte Dateien müssen "hinzugefügt" werden);

  2. durch Verwendung von git-rm[1], um Dateien aus dem Arbeitsverzeichnis und dem Index zu entfernen, ebenfalls bevor der Befehl commit verwendet wird;

  3. durch Auflistung von Dateien als Argumente für den Befehl commit (ohne die Schalter --interactive oder --patch), in diesem Fall ignoriert der Commit Änderungen, die im Index vorbereitet wurden, und zeichnet stattdessen den aktuellen Inhalt der aufgelisteten Dateien auf (die bereits Git bekannt sein müssen);

  4. durch Verwendung des Schalters -a mit dem Befehl commit, um automatisch Änderungen von allen bekannten Dateien ("hinzuzufügen") und Dateien im Index, die aus dem Arbeitsverzeichnis entfernt wurden ("rm"), zu behandeln und dann den eigentlichen Commit durchzuführen;

  5. durch Verwendung der Schalter --interactive oder --patch mit dem Befehl commit, um einzeln zu entscheiden, welche Dateien oder Hunks zusätzlich zum Inhalt im Index Teil des Commits sein sollen, bevor die Operation abgeschlossen wird. Siehe den Abschnitt "Interaktiver Modus" in git-add[1], um zu lernen, wie diese Modi bedient werden.

Die Option --dry-run kann verwendet werden, um eine Zusammenfassung dessen zu erhalten, was von einer der oben genannten Optionen für den nächsten Commit enthalten ist, indem dieselbe Menge von Parametern (Optionen und Pfade) angegeben wird.

Wenn Sie einen Commit machen und kurz danach einen Fehler feststellen, können Sie ihn mit git reset beheben.

OPTIONEN

-a
--all

Fügt automatisch geänderte und gelöschte Dateien zum Staging-Bereich hinzu, neue Dateien, die Git noch nicht bekannt sind, sind davon nicht betroffen.

-p
--patch

Verwendet die interaktive Patch-Auswahlschnittstelle, um auszuwählen, welche Änderungen committet werden sollen. Siehe git-add[1] für Details.

-U<n>
--unified=<n>

Generiert Diffs mit <n> Zeilen Kontext. Standard ist diff.context oder 3, wenn die Konfigurationsoption nicht gesetzt ist.

--inter-hunk-context=<n>

Zeigt den Kontext zwischen Diff-Hunks bis zur angegebenen Anzahl von <n> Zeilen an und fasst so nahe beieinander liegende Hunks zusammen. Standard ist diff.interHunkContext oder 0, wenn die Konfigurationsoption nicht gesetzt ist.

-C <commit>
--reuse-message=<commit>

Nimmt ein vorhandenes <commit> Objekt und verwendet die Log-Nachricht und die Autoreninformationen (einschließlich des Zeitstempels) bei der Erstellung des Commits wieder.

-c <commit>
--reedit-message=<commit>

Ähnlich wie -C, aber mit -c wird der Editor aufgerufen, damit der Benutzer die Commit-Nachricht weiter bearbeiten kann.

--fixup=[(amend|reword):]<commit>

Erstellt einen neuen Commit, der <commit> "fixup"-t, wenn er mit git rebase --autosquash angewendet wird. Ein einfacher --fixup=<commit> erstellt einen "fixup!"-Commit, der den Inhalt von <commit> ändert, aber dessen Log-Nachricht unverändert lässt. --fixup=amend:<commit> ist ähnlich, erstellt aber einen "amend!"-Commit, der auch die Log-Nachricht von <commit> durch die Log-Nachricht des "amend!"-Commits ersetzt. --fixup=reword:<commit> erstellt einen "amend!"-Commit, der die Log-Nachricht von <commit> durch seine eigene Log-Nachricht ersetzt, aber keine Änderungen am Inhalt von <commit> vornimmt.

Der durch einfachen --fixup=<commit> erstellte Commit hat einen Titel, der aus "fixup!" gefolgt vom Titel von <commit> besteht und von git rebase --autosquash speziell erkannt wird. Die Option -m kann verwendet werden, um die Log-Nachricht des erstellten Commits zu ergänzen, aber die zusätzlichen Kommentare werden verworfen, sobald der "fixup!"-Commit von git rebase --autosquash in <commit> eingegliedert wird.

Der durch --fixup=amend:<commit> erstellte Commit ist ähnlich, aber sein Titel wird stattdessen mit "amend!" präfixiert. Die Log-Nachricht von <commit> wird in die Log-Nachricht des "amend!"-Commits kopiert und in einem Editor geöffnet, damit sie verfeinert werden kann. Wenn git rebase --autosquash den "amend!"-Commit in <commit> eingliedert, wird die Log-Nachricht von <commit> durch die verfeinerte Log-Nachricht des "amend!"-Commits ersetzt. Es ist ein Fehler, wenn die Log-Nachricht des "amend!"-Commits leer ist, es sei denn, --allow-empty-message wird angegeben.

--fixup=reword:<commit> ist eine Kurzform für --fixup=amend:<commit> --only. Erstellt einen "amend!"-Commit nur mit einer Log-Nachricht (ignoriert alle im Index vorbereiteten Änderungen). Wenn er von git rebase --autosquash eingegliedert wird, ersetzt er die Log-Nachricht von <commit>, ohne andere Änderungen vorzunehmen.

Weder "fixup!"- noch "amend!"-Commits ändern die Autorenschaft von <commit>, wenn sie von git rebase --autosquash angewendet werden. Siehe git-rebase[1] für Details.

--squash=<commit>

Erstellt eine Commit-Nachricht zur Verwendung mit git rebase --autosquash. Der Titel der Commit-Nachricht wird aus dem angegebenen Commit mit dem Präfix "squash! " übernommen. Kann mit zusätzlichen Commit-Nachrichten-Optionen (-m/-c/-C/-F) verwendet werden. Siehe git-rebase[1] für Details.

--reset-author

Wenn mit den Optionen -C/-c/--amend verwendet oder nach einem widersprüchlichen Cherry-Pick committet wird, wird erklärt, dass die Autorenschaft des resultierenden Commits nun dem Committer gehört. Dies erneuert auch den Autorenschafts-Zeitstempel.

--short

Bei einem Dry-Run wird die Ausgabe im Kurzformat ausgegeben. Siehe git-status[1] für Details. Impliziert --dry-run.

--branch

Zeigt den Branch und die Tracking-Informationen auch im Kurzformat an.

--porcelain

Bei einem Dry-Run wird die Ausgabe in einem für Maschinen lesbaren Format ausgegeben. Siehe git-status[1] für Details. Impliziert --dry-run.

--long

Bei einem Dry-Run wird die Ausgabe im Langformat ausgegeben. Impliziert --dry-run.

-z
--null

Beim Anzeigen der Ausgabe von short oder porcelain wird der Dateiname wörtlich ausgegeben und die Einträge mit NUL statt LF beendet. Wenn kein Format angegeben ist, wird das Ausgabeformat --porcelain impliziert. Ohne die Option -z werden Dateinamen mit "ungewöhnlichen" Zeichen wie in der Konfigurationsvariable core.quotePath erklärt (siehe git-config[1]) zitiert.

-F <datei>
--file=<datei>

Nimmt die Commit-Nachricht aus <datei>. Verwenden Sie -, um die Nachricht von der Standardeingabe zu lesen.

--author=<autor>

Überschreibt den Commit-Autor. Geben Sie einen expliziten Autor im Standardformat A U Thor <autor@example.com> an. Andernfalls wird angenommen, dass <autor> ein Muster ist und zum Suchen nach einem bestehenden Commit dieses Autors verwendet wird (d.h. git rev-list --all -i --author=<autor>); der Commit-Autor wird dann vom ersten gefundenen solchen Commit kopiert.

--date=<datum>

Überschreibt das Datum des Autors, das im Commit verwendet wird.

-m <nachricht>
--message=<nachricht>

Verwendet <nachricht> als Commit-Nachricht. Wenn mehrere Optionen -m angegeben werden, werden ihre Werte als separate Absätze verkettet.

Die Option -m ist exklusiv mit -c, -C und -F.

-t <datei>
--template=<datei>

Beim Bearbeiten der Commit-Nachricht wird der Editor mit dem Inhalt aus <datei> gestartet. Die Konfigurationsvariable commit.template wird oft verwendet, um diese Option implizit an den Befehl zu übergeben. Dieser Mechanismus kann von Projekten verwendet werden, die Teilnehmer mit Hinweisen leiten möchten, was in der Nachricht in welcher Reihenfolge geschrieben werden soll. Wenn der Benutzer den Editor beendet, ohne die Nachricht zu bearbeiten, wird der Commit abgebrochen. Dies hat keine Auswirkung, wenn die Nachricht auf andere Weise angegeben wird, z.B. mit den Optionen -m oder -F.

-s
--signoff
--no-signoff

Fügt einen Signed-off-by-Trailer vom Committer am Ende der Commit-Log-Nachricht hinzu. Die Bedeutung eines Sign-offs hängt vom Projekt ab, an das Sie committen. Es kann beispielsweise bestätigen, dass der Committer die Rechte hat, die Arbeit unter der Lizenz des Projekts einzureichen, oder einer bestimmten Beitragsstellervereinbarung zustimmt, wie z. B. einem Developer Certificate of Origin. (Siehe https://developercertificate.org für das von den Linux-Kernel- und Git-Projekten verwendete.) Konsultieren Sie die Dokumentation oder die Führung des Projekts, zu dem Sie beitragen, um zu verstehen, wie die Sign-offs in diesem Projekt verwendet werden.

Die Option --no-signoff kann verwendet werden, um eine frühere Option --signoff auf der Kommandozeile zu widerrufen.

--trailer <token>[(=|:)<wert>]

Gibt ein (<token>, <wert>)-Paar an, das als Trailer angewendet werden soll. (z.B. git commit --trailer "Signed-off-by:C O Mitter \ <committer@example.com>" --trailer "Helped-by:C O Mitter \ <committer@example.com>" fügt den Signed-off-by-Trailer und den Helped-by-Trailer zur Commit-Nachricht hinzu.) Die Konfigurationsvariablen trailer.* (siehe git-interpret-trailers[1]) können verwendet werden, um zu definieren, ob ein duplizierter Trailer weggelassen wird, wo in der Reihe der Trailer jeder Trailer erscheinen würde und andere Details.

-n
--verify
--no-verify

Umgeht die pre-commit und commit-msg Hooks. Siehe auch githooks[5].

--allow-empty

Normalerweise ist das Aufzeichnen eines Commits, der denselben Baum wie sein einziger Eltern-Commit hat, ein Fehler, und der Befehl verhindert, dass Sie einen solchen Commit machen. Diese Option umgeht die Sicherheitsvorkehrung und ist hauptsächlich für die Verwendung durch Skripte von Fremd-SCM-Schnittstellen bestimmt.

--allow-empty-message

Erstellt einen Commit mit einer leeren Commit-Nachricht, ohne dabei niedrigstufige Befehle wie git-commit-tree[1] zu verwenden. Wie --allow-empty ist dieser Befehl hauptsächlich für die Verwendung durch Skripte von Fremd-SCM-Schnittstellen bestimmt.

--cleanup=<modus>

Bestimmt, wie die übermittelte Commit-Nachricht vor dem Committen bereinigt werden soll. Der <modus> kann strip, whitespace, verbatim, scissors oder default sein.

strip

Entfernt führende und nachfolgende leere Zeilen, nachfolgende Leerzeichen, Kommentare und komprimiert aufeinanderfolgende leere Zeilen.

whitespace

Wie strip, mit der Ausnahme, dass #Kommentare nicht entfernt werden.

verbatim

Die Nachricht wird überhaupt nicht verändert.

scissors

Wie whitespace, mit der Ausnahme, dass alles ab (und einschließlich) der unten gefundenen Zeile abgeschnitten wird, falls die Nachricht bearbeitet werden soll. "#" kann mit core.commentChar angepasst werden.

# ------------------------ >8 ------------------------
default

Wie strip, wenn die Nachricht bearbeitet werden soll. Andernfalls whitespace.

Der Standard kann durch die Konfigurationsvariable commit.cleanup geändert werden (siehe git-config[1]).

-e
--edit

Lässt den Benutzer die Nachricht, die aus <datei> mit -F <datei>, von der Befehlszeile mit -m <nachricht> und aus <commit> mit -C <commit> übernommen wurde, weiter bearbeiten.

--no-edit

Verwendet die ausgewählte Commit-Nachricht, ohne einen Editor zu starten. Zum Beispiel, git commit --amend --no-edit ändert einen Commit, ohne seine Commit-Nachricht zu ändern.

--amend

Ersetzt die Spitze des aktuellen Branches durch einen neuen Commit. Der aufgezeichnete Baum wird wie üblich vorbereitet (einschließlich der Auswirkungen der Optionen -i und -o sowie expliziter Pfadangaben) und die Nachricht des ursprünglichen Commits wird als Ausgangspunkt verwendet, anstatt einer leeren Nachricht, wenn keine andere Nachricht über Befehlszeilenoptionen wie -m, -F, -c usw. angegeben wird. Der neue Commit hat dieselben Eltern und denselben Autor wie der aktuelle (die Option --reset-author kann dies überschreiben).

Dies ist eine grobe Entsprechung für

	$ git reset --soft HEAD^
	$ ... do something else to come up with the right tree ...
	$ git commit -c ORIG_HEAD

kann aber verwendet werden, um einen Merge-Commit zu ändern.

Sie sollten die Auswirkungen des Umschreibens der Historie verstehen, wenn Sie einen Commit ändern, der bereits veröffentlicht wurde. (Siehe den Abschnitt "RECOVERING FROM UPSTREAM REBASE" in git-rebase[1].)

--no-post-rewrite

Umgeht den post-rewrite Hook.

-i
--include

Bevor ein Commit aus den bisher vorbereiteten Inhalten erstellt wird, werden auch die Inhalte der auf der Befehlszeile angegebenen Pfade vorbereitet. Dies ist normalerweise nicht das, was Sie wollen, es sei denn, Sie beenden einen konfliktträchtigen Merge.

-o
--only

Erstellt einen Commit, indem die aktualisierten Arbeitsverzeichnis-Inhalte der auf der Befehlszeile angegebenen Pfade übernommen werden, wobei alle für andere Pfade vorbereiteten Inhalte ignoriert werden. Dies ist der Standardmodus von git commit, wenn Pfade auf der Befehlszeile angegeben werden, in diesem Fall kann diese Option weggelassen werden. Wenn diese Option zusammen mit --amend angegeben wird, müssen keine Pfade angegeben werden, was verwendet werden kann, um den letzten Commit zu ändern, ohne bereits vorbereitete Änderungen zu committen. Wenn zusammen mit --allow-empty verwendet, werden auch keine Pfade benötigt und ein leerer Commit wird erstellt.

--pathspec-from-file=<datei>

Gibt die Pfadangaben in <datei> anstelle von Befehlszeilenargumenten weiter. Wenn <datei> genau - ist, wird die Standardeingabe verwendet. Pfadangaben werden durch LF oder CR/LF getrennt. Pfadangaben können wie für die Konfigurationsvariable core.quotePath beschrieben (siehe git-config[1]) zitiert werden. Siehe auch --pathspec-file-nul und global --literal-pathspecs.

--pathspec-file-nul

Nur relevant mit --pathspec-from-file. Pfadangaben werden durch ein NUL-Zeichen getrennt und alle anderen Zeichen werden wörtlich genommen (einschließlich Zeilenumbrüchen und Anführungszeichen).

-u[<modus>]
--untracked-files[=<modus>]

Zeigt nicht verfolgte Dateien an.

Der Parameter <modus> ist optional (standardmäßig all) und wird zur Spezifizierung der Handhabung nicht verfolgter Dateien verwendet; wenn -u nicht verwendet wird, ist der Standard normal, d.h. nicht verfolgte Dateien und Verzeichnisse werden angezeigt.

Die möglichen Optionen sind

no

Zeigt keine nicht verfolgten Dateien an

normal

Zeigt nicht verfolgte Dateien und Verzeichnisse an

all

Zeigt auch einzelne Dateien in nicht verfolgten Verzeichnissen an.

Alle üblichen Schreibweisen für den booleschen Wert true werden als normal und false als no interpretiert. Der Standardwert kann mit der Konfigurationsvariable status.showUntrackedFiles geändert werden, die in git-config[1] dokumentiert ist.

-v
--verbose

Zeigt am Ende der Commit-Nachrichtenvorlage eine einheitliche Differenz zwischen dem HEAD-Commit und dem, was committet werden würde, an, um dem Benutzer zu helfen, den Commit zu beschreiben, indem er ihn an die vorgenommenen Änderungen erinnert. Beachten Sie, dass diese Diff-Ausgabe nicht mit #-Zeilenpräfixen versehen ist. Diese Diff ist nicht Teil der Commit-Nachricht. Siehe die Konfigurationsvariable commit.verbose in git-config[1].

Wenn zweimal angegeben, wird zusätzlich die einheitliche Differenz zwischen dem, was committet werden würde, und den Arbeitsverzeichnisdateien angezeigt, d.h. die nicht vorbereiteten Änderungen an verfolgten Dateien.

-q
--quiet

Unterdrückt die Commit-Zusammenfassungsnachricht.

--dry-run

Erstellt keinen Commit, sondern zeigt eine Liste der zu committenden Pfade, Pfade mit lokalen Änderungen, die nicht committet werden, und nicht verfolgte Pfade an.

--status

Schließt die Ausgabe von git-status[1] in die Commit-Nachrichtenvorlage ein, wenn ein Editor zur Vorbereitung der Commit-Nachricht verwendet wird. Standardmäßig aktiviert, kann aber die Konfigurationsvariable commit.status überschreiben.

--no-status

Schließt die Ausgabe von git-status[1] nicht in die Commit-Nachrichtenvorlage ein, wenn ein Editor zur Vorbereitung der Standard-Commit-Nachricht verwendet wird.

-S[<key-id>]
--gpg-sign[=<key-id>]
--no-gpg-sign

GPG-signiert Commits. Die Angabe von <key-id> ist optional und wird standardmäßig auf die Identität des Committenten gesetzt; wenn sie angegeben wird, muss sie ohne Leerzeichen an die Option angehängt werden. --no-gpg-sign ist nützlich, um sowohl die Konfigurationsvariable commit.gpgSign als auch frühere --gpg-sign-Angaben zu überschreiben.

--

Interpretiere keine weiteren Argumente mehr als Optionen.

<pfadangabe>...

Wenn <pfadangabe> auf der Befehlszeile angegeben wird, werden die Inhalte der Dateien, die mit der Pfadangabe übereinstimmen, committet, ohne die Änderungen aufzuzeichnen, die bereits zum Index hinzugefügt wurden. Die Inhalte dieser Dateien werden auch für den nächsten Commit über das hinaus, was zuvor vorbereitet wurde, vorbereitet.

Weitere Details finden Sie im Eintrag pfadspec in gitglossary[7].

BEISPIELE

Wenn Sie Ihre eigene Arbeit aufzeichnen, werden die Inhalte von geänderten Dateien in Ihrem Arbeitsverzeichnis mit git add temporär in einen Staging-Bereich namens "Index" gespeichert. Eine Datei kann im Index, aber nicht im Arbeitsverzeichnis, wieder auf den Stand des letzten Commits zurückgesetzt werden mit git restore --staged <datei>, was effektiv git add rückgängig macht und verhindert, dass die Änderungen dieser Datei am nächsten Commit teilnehmen. Nachdem der zu committende Zustand inkrementell mit diesen Befehlen aufgebaut wurde, wird git commit (ohne Parameter für den Pfadnamen) verwendet, um das bisher vorbereitete aufzuzeichnen. Dies ist die grundlegendste Form des Befehls. Ein Beispiel

$ edit hello.c
$ git rm goodbye.c
$ git add hello.c
$ git commit

Anstatt Dateien nach jeder einzelnen Änderung vorzubereiten, können Sie git commit anweisen, die Änderungen an den Dateien zu bemerken, deren Inhalte in Ihrem Arbeitsverzeichnis verfolgt werden, und entsprechende git add- und git rm-Befehle für Sie auszuführen. Das heißt, dieses Beispiel macht dasselbe wie das vorherige Beispiel, wenn keine anderen Änderungen in Ihrem Arbeitsverzeichnis vorhanden sind

$ edit hello.c
$ rm goodbye.c
$ git commit -a

Der Befehl git commit -a prüft zuerst Ihr Arbeitsverzeichnis, stellt fest, dass Sie hello.c geändert und goodbye.c entfernt haben, und führt die notwendigen git add- und git rm-Befehle für Sie aus.

Nachdem Sie Änderungen an vielen Dateien vorbereitet haben, können Sie die Reihenfolge, in der die Änderungen aufgezeichnet werden, ändern, indem Sie Pfadnamen an git commit übergeben. Wenn Pfadnamen angegeben werden, erstellt der Befehl einen Commit, der nur die Änderungen an den angegebenen Pfaden aufzeichnet

$ edit hello.c hello.h
$ git add hello.c hello.h
$ edit Makefile
$ git commit Makefile

Dies erstellt einen Commit, der die Änderung an Makefile aufzeichnet. Die für hello.c und hello.h vorbereiteten Änderungen sind nicht im resultierenden Commit enthalten. Ihre Änderungen gehen jedoch nicht verloren – sie sind immer noch vorbereitet und werden lediglich zurückgehalten. Nach der obigen Sequenz, wenn Sie Folgendes tun:

$ git commit

würde dieser zweite Commit die Änderungen an hello.c und hello.h wie erwartet aufzeichnen.

Nach einem Merge (eingeleitet durch git merge oder git pull), der wegen Konflikten abbricht, werden sauber gemergte Pfade bereits für den Commit vorbereitet, und Pfade, die Konflikte aufweisen, bleiben im ungemergten Zustand. Sie müssten zuerst prüfen, welche Pfade Konflikte aufweisen mit git status und nachdem Sie diese manuell in Ihrem Arbeitsverzeichnis behoben haben, würden Sie das Ergebnis wie gewohnt mit git add vorbereiten.

$ git status | grep unmerged
unmerged: hello.c
$ edit hello.c
$ git add hello.c

Nachdem die Konflikte gelöst und das Ergebnis vorbereitet wurden, würde git ls-files -u aufhören, den konfliktreichen Pfad zu erwähnen. Wenn Sie fertig sind, führen Sie git commit aus, um den Merge endgültig aufzuzeichnen.

$ git commit

Wie beim Aufzeichnen Ihrer eigenen Änderungen können Sie die Option -a verwenden, um Tipparbeit zu sparen. Ein Unterschied ist, dass Sie während einer Merge-Auflösung git commit mit Pfadnamen nicht verwenden können, um die Reihenfolge der aufgezeichneten Änderungen zu ändern, da der Merge als einzelner Commit aufgezeichnet werden sollte. Tatsächlich weigert sich der Befehl, wenn Pfadnamen angegeben werden (aber siehe Option -i).

COMMIT INFORMATION

Autor- und Committerinformationen werden aus den folgenden Umgebungsvariablen übernommen, falls gesetzt

  • GIT_AUTHOR_NAME

  • GIT_AUTHOR_EMAIL

  • GIT_AUTHOR_DATE

  • GIT_COMMITTER_NAME

  • GIT_COMMITTER_EMAIL

  • GIT_COMMITTER_DATE

(nb "<", ">" und "\n"s werden entfernt)

Die Namen des Autors und des Committers sind konventionell eine Form eines persönlichen Namens (d. h. der Name, mit dem andere Menschen Sie ansprechen), obwohl Git keine bestimmte Form erzwingt oder vorschreibt. Beliebige Unicode-Zeichen können verwendet werden, vorbehaltlich der oben genannten Einschränkungen. Dieser Name hat keine Auswirkungen auf die Authentifizierung; dazu siehe die Variable credential.username in git-config[1].

Falls (einige) dieser Umgebungsvariablen nicht gesetzt sind, werden die Informationen aus den Konfigurationselementen user.name und user.email übernommen, oder falls diese nicht vorhanden sind, aus der Umgebungsvariablen EMAIL, oder falls diese nicht gesetzt ist, aus dem Systembenutzernamen und dem Hostnamen, der für ausgehende E-Mails verwendet wird (entnommen aus /etc/mailname und zurückfallend auf den vollständig qualifizierten Hostnamen, wenn diese Datei nicht existiert).

Die Optionen author.name und committer.name sowie ihre entsprechenden E-Mail-Optionen überschreiben user.name und user.email, falls sie gesetzt sind, und werden selbst von den Umgebungsvariablen überschrieben.

Die typische Verwendung ist, nur die Variablen user.name und user.email zu setzen; die anderen Optionen sind für komplexere Anwendungsfälle vorgesehen.

DATUMSFORMATE

Die Umgebungsvariablen GIT_AUTHOR_DATE und GIT_COMMITTER_DATE unterstützen die folgenden Datumsformate:

Git-internes Format

Es ist <unix-timestamp> <time-zone-offset>, wobei <unix-timestamp> die Anzahl der Sekunden seit der UNIX-Epoche ist. <time-zone-offset> ist ein positiver oder negativer Offset von UTC. Zum Beispiel ist CET (das 1 Stunde vor UTC liegt) +0100.

RFC 2822

Das Standard-Datumsformat wie in RFC 2822 beschrieben, zum Beispiel Thu, 07 Apr 2005 22:13:13 +0200.

ISO 8601

Zeit und Datum gemäß dem ISO 8601-Standard, zum Beispiel 2005-04-07T22:13:13. Der Parser akzeptiert auch ein Leerzeichen anstelle des T-Zeichens. Bruchteile von Sekunden werden ignoriert, zum Beispiel wird 2005-04-07T22:13:13.019 als 2005-04-07T22:13:13 behandelt.

Hinweis
Zusätzlich werden Datumsangaben in den folgenden Formaten akzeptiert: JJJJ.MM.TT, MM/TT/JJJJ und TT.MM.JJJJ.

Zusätzlich zur Erkennung aller oben genannten Datumsformate versucht die Option --date auch, andere, menschenzentriertere Datumsformate zu verstehen, wie z. B. relative Daten wie "gestern" oder "letzten Freitag um die Mittagszeit".

DISKUSSION

Obwohl nicht vorgeschrieben, ist es eine gute Idee, die Commit-Nachricht mit einer einzelnen kurzen Zeile (nicht länger als 50 Zeichen) zu beginnen, die die Änderung zusammenfasst, gefolgt von einer Leerzeile und dann einer ausführlicheren Beschreibung. Der Text bis zur ersten Leerzeile in einer Commit-Nachricht wird als Commit-Titel behandelt, und dieser Titel wird in Git verwendet. Zum Beispiel wandelt git-format-patch[1] einen Commit in eine E-Mail um, und er verwendet den Titel in der Betreffzeile und den Rest des Commits im Körper.

Git ist bis zu einem gewissen Grad zeichenkodierungsunabhängig.

  • Der Inhalt der Blob-Objekte sind uninterpretierte Bytefolgen. Auf Kern-Ebene erfolgt keine Kodierungsumwandlung.

  • Pfadnamen werden in UTF-8 Normalisierungsform C kodiert. Dies gilt für Baum-Objekte, die Indexdatei, Ref-Namen sowie für Pfadnamen in Kommandozeilenargumenten, Umgebungsvariablen und Konfigurationsdateien (.git/config (siehe git-config[1]), gitignore[5], gitattributes[5] und gitmodules[5]).

    Beachten Sie, dass Git auf Kern-Ebene Pfadnamen einfach als Folgen von Nicht-NUL-Bytes behandelt, es gibt keine Pfadnamen-Kodierungskonvertierungen (außer unter Mac und Windows). Daher funktionieren nicht-ASCII-Pfadnamen meist auch auf Plattformen und Dateisystemen, die Legacy-Erweiterte-ASCII-Kodierungen verwenden. Repositories, die auf solchen Systemen erstellt wurden, funktionieren jedoch nicht ordnungsgemäß auf UTF-8-basierten Systemen (z. B. Linux, Mac, Windows) und umgekehrt. Zusätzlich gehen viele Git-basierte Werkzeuge einfach davon aus, dass Pfadnamen UTF-8 sind und werden andere Kodierungen nicht korrekt anzeigen.

  • Commit-Log-Nachrichten sind typischerweise in UTF-8 kodiert, aber auch andere erweiterte ASCII-Kodierungen werden unterstützt. Dazu gehören ISO-8859-x, CP125x und viele andere, aber *nicht* UTF-16/32, EBCDIC und CJK-Multibyte-Kodierungen (GBK, Shift-JIS, Big5, EUC-x, CP9xx etc.).

Obwohl wir ermutigen, dass die Commit-Log-Nachrichten in UTF-8 kodiert werden, sind sowohl der Kern als auch Git Porcelain so konzipiert, dass sie Projekten keine UTF-8 aufzwingen. Wenn alle Teilnehmer eines bestimmten Projekts es bequemer finden, Legacy-Kodierungen zu verwenden, verbietet Git dies nicht. Es gibt jedoch ein paar Dinge zu beachten.

  1. git commit und git commit-tree geben eine Warnung aus, wenn die ihnen übergebene Commit-Log-Nachricht keine gültige UTF-8-Zeichenkette zu sein scheint, es sei denn, Sie geben explizit an, dass Ihr Projekt eine Legacy-Kodierung verwendet. Dies geschieht durch Festlegen von i18n.commitEncoding in der Datei .git/config, wie folgt

    [i18n]
    	commitEncoding = ISO-8859-1

    Mit der obigen Einstellung erstellte Commit-Objekte speichern den Wert von i18n.commitEncoding in ihrer encoding-Kopfzeile. Dies soll anderen Personen helfen, die sie später betrachten. Das Fehlen dieser Kopfzeile impliziert, dass die Commit-Log-Nachricht in UTF-8 kodiert ist.

  2. git log, git show, git blame und Freunde betrachten den encoding Header eines Commit-Objekts und versuchen, die Log-Nachricht in UTF-8 neu zu kodieren, sofern nicht anders angegeben. Sie können die gewünschte Ausgabe-Kodierung mit i18n.logOutputEncoding in der .git/config-Datei angeben, wie folgt:

    [i18n]
    	logOutputEncoding = ISO-8859-1

    Wenn Sie diese Konfigurationsvariable nicht haben, wird stattdessen der Wert von i18n.commitEncoding verwendet.

Beachten Sie, dass wir uns bewusst entschieden haben, die Commit-Log-Nachricht nicht neu zu kodieren, wenn ein Commit durchgeführt wird, um UTF-8 auf der Ebene des Commit-Objekts zu erzwingen, da die Neukodierung nach UTF-8 nicht unbedingt eine reversible Operation ist.

UMGEBUNGS- UND KONFIGURATIONSVARIABLEN

Der Editor, der zum Bearbeiten der Commit-Log-Nachricht verwendet wird, wird aus der Umgebungsvariable GIT_EDITOR, der Konfigurationsvariable core.editor, der Umgebungsvariable VISUAL oder der Umgebungsvariable EDITOR (in dieser Reihenfolge) ausgewählt. Weitere Details finden Sie in git-var[1].

Alles oberhalb dieser Zeile in diesem Abschnitt ist nicht in der Dokumentation von git-config[1] enthalten. Der nachfolgende Inhalt ist derselbe wie dort zu finden.

commit.cleanup

Diese Einstellung überschreibt den Standardwert der Option --cleanup in git commit. Das Ändern des Standardwerts kann nützlich sein, wenn Sie Zeilen, die mit dem Kommentarzeichen (core.commentChar, Standard #) beginnen, immer in Ihrer Log-Nachricht behalten möchten. In diesem Fall würden Sie git config commit.cleanup whitespace ausführen (beachten Sie, dass Sie die Hilfzeilen, die mit dem Kommentarzeichen beginnen, in der Commit-Log-Vorlage selbst entfernen müssen, wenn Sie dies tun).

commit.gpgSign

Ein boolescher Wert, der angibt, ob alle Commits GPG-signiert werden sollen. Die Verwendung dieser Option bei Operationen wie Rebase kann dazu führen, dass eine große Anzahl von Commits signiert wird. Es kann praktisch sein, einen Agenten zu verwenden, um die Eingabe Ihrer GPG-Passphrase mehrmals zu vermeiden.

commit.status

Ein boolescher Wert, um die Einbeziehung von Statusinformationen in die Commit-Nachrichten-Vorlage bei der Verwendung eines Editors zur Vorbereitung der Commit-Nachricht zu aktivieren/deaktivieren. Standardmäßig ist dieser Wert auf true gesetzt.

commit.template

Gibt den Pfadnamen einer Datei an, die als Vorlage für neue Commit-Nachrichten verwendet werden soll.

commit.verbose

Ein boolescher Wert oder eine Ganzzahl, um den Grad der Ausführlichkeit bei git commit anzugeben.

HOOKS

Dieser Befehl kann die Hooks commit-msg, prepare-commit-msg, pre-commit, post-commit und post-rewrite ausführen. Weitere Informationen finden Sie in githooks[5].

DATEIEN

$GIT_DIR/COMMIT_EDITMSG

Diese Datei enthält die Commit-Nachricht eines gerade stattfindenden Commits. Wenn git commit aufgrund eines Fehlers abbricht, bevor ein Commit erstellt wurde, ist jede vom Benutzer bereitgestellte Commit-Nachricht (z. B. in einer Editiersitzung) in dieser Datei verfügbar, wird aber bei der nächsten Ausführung von git commit überschrieben.

GIT

Teil der git[1] Suite