Gibt es eine Möglichkeit, Zwischengit-Commits zu beschneiden?

361
mike rodent

Hoffe das ist das richtige Forum für diese Frage ... sag mir wenn nicht.

Ich bin ein grundlegender Benutzer von git, aber ich habe diese App in den letzten Monaten entwickelt, wobei das Prinzip "häufig begehen" verwendet wird. Also bin git rev-list --all --countich jetzt gerannt und habe 425 Commits gefunden.

Das kann verrückt sein ... oder es kann völlig normal sein. Ich habe keine Ahnung.

Die Sache ist nur, dass das Repository etwas unhandlich wird, und was ich in einer idealen Welt gerne tun würde, ist, die Commits durchzugehen und zwei von drei zu eliminieren: Ich möchte die Botschaften der Commits, die dazu bestimmt sind gelöscht werden, um irgendwie zu den Nachrichten derjenigen hinzugefügt zu werden, die bleiben sollen ...

Es gibt einen "manuellen" Weg, dies zu tun: Ich durchstreife das gesamte Repo, überprüfe jeden dritten Commit, beachte sorgfältig den Text aus den Commits, die ich nicht speichere, und füge sie systematisch zu dem "jeden dritten" hinzu Botschaft.

Zur gleichen Zeit erstelle ich natürlich ein neues Repo, das nur die "jeden dritten Commits" verwendet. Ich habe das noch nicht ausprobiert, zum Teil weil es mir ein bisschen langweilig erscheint, was sehr viel Zeit in Anspruch nehmen wird: Gibt es etwas in Git oder irgendein Werkzeug, das jemand erfunden hat, das bei dieser Art von Aufgabe helfen kann?

0
Was macht eine ~ 400-Commit-Repository "etwas unhandlich"? grawity vor 7 Jahren 0
Vielen Dank. Zumindest hat es dich nicht zum Lachen gebracht: Zuerst wurde die Hürde erledigt. Nun, ich unterstütze dieses Repo gelegentlich auf Google Drive: Im Moment sind es 11 MB, nicht zu haarig. Aber der Grundgedanke in meinem Kopf ist: Nachdem ich diese einzelnen Schritte nach und nach vor einiger Zeit erledigt habe, muss ich nicht alle 425 winzigen Step-Commits von vor Monaten beibehalten. Es ist wirklich eine Frage des Prinzips der Sache als (noch) eine praktische Angelegenheit. mike rodent vor 7 Jahren 0

1 Antwort auf die Frage

1
grawity

Warum

Git-Geschichte funktioniert am besten, wenn sie tatsächlich die Geschichte des Entwicklungsprozesses erzählt. Wenn Sie die Historie durchforsten müssen (z. B. zum Suchen, wann ein Fehler eingeführt wurde, wenn er behoben wurde usw.), hilft es nicht, Commits mit dem Titel "Füge die heutigen Änderungen hinzu" zu sehen . Sie sagen Ihnen, wie der Code geändert wurde, nicht aber warum.

Das Überschreiben der Festschreibungshistorie wird häufig durchgeführt (um Zusagen zusammenzuführen, umzuwechseln usw.) - wenn Sie jedoch nur 2 von 3 Zusagen willkürlich löschen, ist dies wahrscheinlich genauso nutzlos wie zuvor. Schreiben Sie stattdessen den Verlauf um, um Dinge wie "Whoops, einen Tippfehler korrigieren" zu bereinigen oder um mehr Details zum Festschreiben von Nachrichten hinzuzufügen.

Natürlich ist das Obige eine Ansichtssache, aber im Allgemeinen ist es praktischer, wenn der Computer sich an Dinge erinnert, damit Sie dies nicht tun müssen.

425 Commits sind für ein mehrmonatiges Projekt normal. Verglichen mit vielen echten Git-Repositories (die Commits in Tausendern messen) ist es relativ klein. Wenn Ihre Besorgnis die Speicherplatzbelegung betrifft und Git die Periodic git gcnoch nicht ausgeführt hat, versuchen Sie es manuell auszuführen, und prüfen Sie, ob dies hilfreich ist.

Backups über das Netzwerk sind git pushweitaus effizienter als das manuelle Hochladen ganzer Repositorys, da sie genau wissen, was hochgeladen werden muss und was bereits vorhanden ist.

Zurück zum Punkt

Git hat viele Werkzeuge zum Umschreiben des Verlaufs. Die gebräuchlichsten sind die git rebase --interactive, die genau die gewünschten Bearbeitungen ausführen können.

; on a feature branch, to rewrite everything that's not yet in master git rebase -i master  ; on master, to go through the *entire history* git rebase -i --root 

Wenn Sie es im interaktiven Modus ausführen, wird eine "ToDo-Liste" in einem Texteditor geöffnet, mit einer Zeile pro Commit und einer "Aktion" davor.

  • Durch Verschieben der Zeilen werden die Commits neu angeordnet. (Durch das Ändern des Texts werden jedoch keine Commit-Nachrichten aktualisiert. Es handelt sich lediglich um eine Vorschau. Verwenden Sie diese Option reword, um die echte Nachricht zu bearbeiten.)

  • Wenn Sie die Aktion von pickbis squashändern, wird das Commit mit dem oben genannten kombiniert. Dies führt zu einem einzigen Commit, das beide Nachrichten enthält.

  • Die fixupAktion ist ähnlich, behält aber nur die 1. Nachricht bei.

Das sind die Grundlagen, denn viele Tutorials wurden bereits viel detaillierter geschrieben. Zum Beispiel kann das Git Buch hat ein Kapitel über die Geschichte Umschreiben .

Danke ... das ist sehr informativ für mein niedriges Niveau und ich werde das, was Sie sagen, genau prüfen. Können Sie zu einem tatsächlich bei Google Drive residierenden Repo "pushen", frage ich mich, oder müssen Sie beispielsweise etwas bei GitHub einrichten? Ich habe tatsächlich ein noch nicht gelesenes E-Book auf GitHub, da es für jemanden wie mich (kein IT-Profi) ziemlich schwierig ist zu verstehen, wie es funktioniert. mike rodent vor 7 Jahren 0
Google Drive - nicht standardmäßig, nein. (Es gibt zwar ein Plugin für Pushbox.) Im Allgemeinen können Sie entweder einen Personal Server nutzen, auf dem Sie über SSH-Zugriff verfügen, oder sich irgendwo für ein Git-Hosting-Konto anmelden. (GitHub ist beliebt bei öffentlichen Projekten, während BitBucket und GitLab zwei Alternativen sind, die auch private Repositories kostenlos anbieten.) grawity vor 7 Jahren 0
Danke noch einmal. Ich werde BitBucket und / oder GitLab so schnell wie möglich nachschlagen! mike rodent vor 7 Jahren 0
Beachten Sie, dass auf beiden Websites kostenlose Hosting-Konten angeboten werden _und_ installierbare "Unternehmen" -Produkte bieten. Verwechseln Sie also nicht die Werbung auf der Startseite. Gehen Sie einfach direkt auf den Link "Anmelden". Auch wenn Sie GitHub nicht verwenden, enthält der Hilfebereich viele Tutorials für git push und SSH, die für alle Sites gleichermaßen gelten. grawity vor 7 Jahren 0