Wie kann ich keine Änderung und neue Nachricht festschreiben?

136

Wie kann ich eine neue commitund eine neue Nachricht erstellen, wenn keine Änderungen an Dateien vorgenommen werden?

Ist dies nicht möglich, da der Commit-Code (SHA?) Der gleiche ist?

d -_- b
quelle

Antworten:

167

Es gibt selten einen guten Grund dafür, aber der Parameter gilt --allow-emptyfür leere Commits (keine Dateien geändert), im Gegensatz zu --allow-empty-messageleeren Commit-Nachrichten. Sie können auch mehr lesen, indem git help commitSie die Online-Dokumentation eingeben oder besuchen .

Während das Baumobjekt (das einen eigenen Hash hat) identisch ist, hat das Commit tatsächlich einen anderen Hash, da es vermutlich einen anderen Zeitstempel und eine andere Nachricht hat und definitiv ein anderes übergeordnetes Commit hat. Alle drei Faktoren sind in gitden Objekt-Hash-Algorithmus integriert.


Es gibt einige Gründe, warum Sie möglicherweise ein leeres Commit wünschen (einschließlich einiger Kommentare):

  • Als "deklaratives Commit", um eine Erzählung oder Dokumentation (über DavidNeiss ) hinzuzufügen, einschließlich nachträglicher Daten über das Bestehen von Tests oder Flusen (über Robert Balicki ).
  • gitBefehle testen , ohne willkürliche Änderungen zu generieren (über Vaelus ).
  • So erstellen Sie ein gelöschtes Bare-Repository mit gitolite(über Tatsh ) neu.
  • Willkürliches Erstellen eines neuen Commits, z. B. zum erneuten Auslösen von Build-Tools (über mattLummus ) oder zum Zwecke der persönlichen Protokollierung oder von Metriken (über DynamiteReed ). Überlegen Sie jedoch zweimal: Abhängig von Ihrer Zweig- / Zusammenführungsstruktur können Commits sehr lange dauern. Daher kann eine Strategie "Nur nichts festschreiben" das Repository Ihres Teams versehentlich mit temporären Workflow-Artefakten verschmutzen und es schwierig machen, Code-Revisionen von diesen zu trennen kurzlebige Kruft.

Andere Strategien zum Hinzufügen von Metadaten zu einem Festschreibungsbaum umfassen:

  • Separate Zweige oder Lightweight-Tags, die immer auf ein Commit mit einem bestimmten Status verweisen (z. B. "zuletzt akzeptiertes Commit" oder "aktuelles Staging-Commit").
  • Kommentierte Tags für eine Möglichkeit zum Aufzeichnen von Zeitstempel, Committer und Nachricht, die auf ein vorhandenes Commit verweisen, ohne einen Eintrag im Commit-Baum selbst hinzuzufügen.
  • git notes eine veränderbare Notiz zusätzlich zu einem bestehenden unveränderlichen Commit zuzuordnen.
Jeff Bowman
quelle
2
Ich habe begonnen, dem Git-Flow- Branch-Modell zu folgen . Wenn Sie ein devVerzweigungsformular masterund dann eine featVerzweigung unmittelbar von erstellen, scheint die Verzweigung von devder featVerzweigung zu stammen master, da für die devVerzweigung, von der die featVerzweigung stammt, kein Unterscheidungs-Commit vorhanden ist . Ein leeres Commit, wenn Sie den devZweig zum ersten Mal erstellen, hilft dabei, den devZweig als einen eigenen, unbegrenzt dauerhaften Zweig unabhängig davon zu etablieren master. Im Allgemeinen ist es hilfreich, wenn Sie Zweige als Ebenen verwenden und zwei Ebenen aus einem einzigen Commit erstellen
Novice C
2
Ein weiterer Grund: Wenn Sie vor dem Push etwas Wichtiges in Ihrer Commit-Nachricht weglassen, können Sie dies nicht tun, commit --amendwenn die Fernbedienung kein Force-Push zulässt. Auf diese Weise können Entwickler eine wichtige Nachricht sehen, die zum vorherigen Commit gehört.
Andy J
1
Ich möchte dies tun, weil ich ein Commit gedrückt habe, aber vergessen habe, etwas in der Commit-Nachricht zu erwähnen. Unsere Festschreibungsnachrichten sind in die Software zur Problemverfolgung und kontinuierlichen Integration integriert, und der Inhalt der Festschreibungsnachricht wirkt sich auf diese Anwendungen aus. Gibt es einen besseren Weg? Dies scheint in meinem Fall die beste Lösung zu sein. Das einzige, was ich mir vorstellen kann, wäre, das vorherige Commit irgendwie rückgängig machen zu können.
Sytech
1
Ich habe dies nur verwendet, um unseren Pre-Commit-Hook auszulösen, der die Datenbank skriptiert. Es gab also Änderungen, nur Git konnte sie erst sehen, nachdem das Skript ausgeführt wurde. Hätte es natürlich manuell ausführen können, aber dann würde das Skript zweimal ausgeführt.
Yoyodyn
1
Sehr nützlich bei der Interaktion mit der Problemverfolgung, die in Git-Servern wie Github und Gogs integriert ist.
SimonF
37

Wenn ich Sie richtig verstanden habe, möchten Sie ein leeres Commit durchführen. In diesem Fall benötigen Sie:

git commit --allow-empty
Dima
quelle
34

Leeres Commit mit einer Nachricht

git commit --allow-empty -m "Empty test commit"

Leeres Commit mit einer leeren Nachricht

git commit --allow-empty --allow-empty-message
Adobels
quelle
3

Wenn Sie ein System wie gitversion verwenden, ist es sehr sinnvoll, diese Art von Commit durchzuführen . Sie könnten ein Commit haben, das speziell dafür gedacht ist, die Hauptversion mit einem + semver: major-Kommentar zu stoßen.

Kevin Johnson
quelle
3

Als sinnvollere Alternative könnten Sie möglicherweise ein mit Anmerkungen versehenes Tag erstellen (ein benanntes Commit mit einer Nachricht). Siehe die git tag -aOption.

kan
quelle