2015-11-06 17 views

Antwort

4

Ein geändertes Commit ist nicht anders als jedes andere Commit. In diesem Sinne ist es durchaus möglich, zwischen einem "normalen" und einem geänderten Commit zu unterscheiden.

Mit anderen Worten speichert git geänderte Commits in der Geschichte irgendwo?

Es gibt keine Liste, die alle Commits enthält, die geändert wurden, nein. Geänderte Commits sind in der Geschichte genauso wie alle anderen Commits.

Wenn Sie ein Commit ändern, wird es grundsätzlich entfernt und durch ein neues ersetzt (es erhält auch einen neuen Commit-Hash), der die Änderungen vom ursprünglichen Commit + den geänderten Änderungen enthält.

In der git reflog können Sie Ihre letzten Aktionen sehen, und das zeigt die Änderung von Commits. Referenzen von dort können verwendet werden, um zum Beispiel eine git commit --amend rückgängig zu machen. Siehe auch How to undo "git commit --amend" done instead of "git commit" für weitere Details.

+1

OK, danke Tim, _git reflog_ -> _git diff commit1_hash ändere_commit_hash_ hat mein Problem gelöst! –

0

Ich glaube nicht, dass ich die Frage verstehe, aber ich denke, ein Teil davon ist, weil ich denke, dass Sie die falsche Vorstellung haben, was git commit --amend tut.

Ein Commit, in git, kann nicht wirklich geändert werden. Alles, was git commit --amend tut, ist, das neue Commit mit einer absichtlich veränderten Eltern-ID zu schreiben.

Lassen Sie uns einen Blick auf den normalen Prozess für ein neues Commit werfen.

Bevor Sie den neuen Festschreibevorgang durchführen, ändern Sie einige Dateien in Ihrer Arbeitshierarchie und verwenden dann git add, um diese Änderungen zu übernehmen, sodass die neuen Versionen der Dateien festgeschrieben werden. Diese git add setzt die neue Version der Datei in den "Index" von git, d. H. In den Staging-Bereich.

Dateien, die sich bereits im vorherigen Commit befanden, befinden sich bereits im Staging-Bereich. Das neue Commit, das Sie vornehmen werden, enthält also alle Originaldateien, außer dass Sie nichts geändert haben und dann git add -ed die neue Version anstelle der alten Version ist.

Jetzt laufen Sie git commit (ohne --amend) und git macht folgendes:

  • sammeln, um eine Nachricht begehen (von -m, -F oder Editor ausgeführt wird);
  • erhalten Sie Ihren Namen und E-Mail, und die aktuelle Zeit;
  • erhalten Sie die SHA-1 ID des aktuellen Commits (nicht die neue);
  • Verwenden Sie den Staging-Bereich, um ein "Baum" -Objekt zu schreiben: Dies ist der Quellbaum, der dem neuen Festschreiben zugeordnet wird;
  • Erstellen Sie ein Commit-Objekt mit all diesen Informationen (Autor + Committer, Baum, Eltern-ID und Ihre Nachricht) -dieses neue Commit-Objekt hat eine neue eindeutige SHA-1-ID;
  • und schreiben Sie schließlich die neue ID in die Verzweigung, so dass die Verzweigungsbezeichnung auf die neue ID verweist, anstatt auf den Zweig, der am weitesten oben liegt.

Der letzte Schritt "wächst der Zweig", so dass, wenn Sie ein paar Commits verwendet haben, so etwas wie dieses:

... <- E <- F <- G <-- master 

Sie jetzt ein mehr haben:

... <- E <- F <- G <- H <-- master 

Die Branchenname (master oder was auch immer es sein mag) zeigt jetzt auf Ihr neuestes Commit H, und H verweist zurück, was verwendet, um Ihr neuestes commit 01 zu sein.

Wenn Sie git commit --amend, git Änderungen diese Sequenz nur ein kleines bisschen: Statt die zur Herstellung neuer commit (H) Punkt zurück zum aktuellen (G), git macht den neuen Punkt zurück zu den Eltern aktuellen (in diesem Fall F):

   G 
      /
... <- E <- F <- H <-- master 

Jetzt master (oder was auch immer Zweig Sie auf) zeigt auf H sind, die zu F Punkte, und so weiter.

Wenn Sie git log laufen beginnt git mit dem aktuellen commit (H) und meldet sie, und bewegt sich dann zu seinen Eltern (F) und meldet es, und so weiter. Commit G scheint weg zu sein.

Die SHA-1-ID für Gist noch um (für 30 Tage) Standardmäßig in dem "reflogs". Es gibt einen Reflog für HEAD und einen für Ihre aktuelle Niederlassung. Wenn Sie auf Zweig master sind und Sie gerade H gemacht haben, dann ist [email protected]{1} der vorherige Tipp von master, der commit G ist. Oder wenn Sie die SHA-1-ID irgendwo auf Ihrem Bildschirm gespeichert haben, können Sie sie ausschneiden und einfügen, um das Commit G zu sehen.

(Der --amend Schalter kann auch eine Zusammenführung ändern begehen. Das funktioniert genauso wie oben, es bedeutet nur, dass git all die Eltern-IDs aus der Altarm-Spitze auf den neuen zu kopieren hat.)