Frage Squash mein letztes X commits zusammen mit Git


Wie kann ich meine letzten X-Commits mit Git in einen Commit zerquetschen?


2314
2018-03-04 04:11


Ursprung


Antworten:


Benutzen git rebase -i <after-this-commit> und ersetze "pick" beim zweiten und folgenden commits mit "squash" oder "fixup", wie in beschrieben das Handbuch.

In diesem Beispiel <after-this-commit> ist entweder der SHA1-Hash oder die relative Position vom HEAD des aktuellen Zweiges, von dem Commits für den Rebase-Befehl analysiert werden. Wenn der Benutzer z. B. 5 Commits vom aktuellen HEAD in der Vergangenheit anzeigen möchte, lautet der Befehl git rebase -i HEAD~5.


1267
2018-03-04 04:18



Du kannst das ziemlich leicht ohne git rebase oder git merge --squash. In diesem Beispiel werden die letzten 3 Commits unterdrückt.

Wenn Sie die neue Commit-Nachricht von Grund auf neu schreiben möchten, reicht dies aus:

git reset --soft HEAD~3 &&
git commit

Wenn Sie die neue Commit-Nachricht mit einer Verkettung der vorhandenen Commit-Nachrichten bearbeiten möchten (d. H. Ähnlich wie bei einem Pick / Squash / Squash / ... / Squash) git rebase -i Instruktionsliste würde Sie mit starten), dann müssen Sie diese Nachrichten extrahieren und an sie weitergeben git commit:

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

Beide Methoden erzwingen auf die gleiche Weise die letzten drei Commits zu einem einzigen neuen Commit. Der Soft-Reset verweist HEAD nur noch auf den letzten Commit, den Sie nicht quetschen wollen. Weder der Index noch der Arbeitsbaum werden vom Soft-Reset berührt, so dass der Index für Ihr neues Commit im gewünschten Zustand bleibt (d. H. Er hat bereits alle Änderungen an den Commits, die Sie "wegwerfen" wollen).


2587
2018-03-05 04:19



Sie können verwenden git merge --squash Dafür ist das etwas eleganter als git rebase -i. Angenommen, Sie sind Master, und Sie möchten die letzten 12 Commits in einen zusammenfassen.

WARNUNG: Stellen Sie zuerst sicher, dass Sie Ihre Arbeit verpfichten - überprüfen Sie das git status ist sauber (seit git reset --hard wird inszenierte und nicht gestartete Änderungen wegwerfen)

Dann:

# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12

# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}

# Commit those squashed changes.  The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit

Das Dokumentation für git merge beschreibt die --squash Option ausführlicher.


Aktualisieren: der einzige wirkliche Vorteil dieser Methode gegenüber dem einfacheren git reset --soft HEAD~12 && git commit vorgeschlagen von Chris Johnsen in seine Antwort ist, dass Sie die Commit-Nachricht mit jeder Commit-Nachricht, die Sie quetschen, vorab ausfüllen.


573
2018-03-04 06:10



Ich empfehle zu vermeiden git reset wenn möglich - besonders für Git-Novizen. Es sei denn, Sie müssen einen Prozess basierend auf einem Prozess wirklich automatisieren Nummer von Commits gibt es einen weniger exotischen Weg ...

  1. Setze die zu zerquetschenden Commits auf einen funktionierenden Zweig (wenn sie es nicht schon sind) - benutze gitk dafür
  2. Überprüfen Sie den Zielzweig (z. B. "Master")
  3. git merge --squash (working branch name)
  4. git commit

Die Commit-Nachricht wird basierend auf dem Squash vorbelegt.


135
2018-03-14 23:24



Beyogen auf Chris Johnsens Antwort,

Fügen Sie einen globalen "Squash" Alias ​​von bash: (oder Git Bash unter Windows) hinzu

git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; };f'

... oder mit der Windows-Eingabeaufforderung:

git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Ihre ~/.gitconfig sollte jetzt diesen Alias ​​enthalten:

[alias]
    squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Verwendung:

git squash N

... was automatisch den letzten zusammendrückt N verpflichtet, inklusive.

Hinweis: Die resultierende Commit-Nachricht ist eine Kombination aller gequetschten Commits in dieser Reihenfolge. Wenn Sie damit unzufrieden sind, können Sie immer git commit --amendum es manuell zu ändern. (Oder bearbeiten Sie den Alias ​​entsprechend Ihren Vorlieben.)


97
2018-02-19 19:21



Wenn Sie TortoiseGit verwenden, können Sie die Funktion verwenden Combine to one commit:

  1. Öffnen Sie das TortoiseGit-Kontextmenü
  2. Wählen Show Log
  3. Markieren Sie die relevanten Commits in der Protokollansicht
  4. Wählen Combine to one commit aus dem Kontextmenü

Combine commits

Diese Funktion führt automatisch alle notwendigen Einzelschritte aus. Leider nur für Windows verfügbar.


46
2017-11-06 12:51



Dank an dieser praktische Blogbeitrag Ich habe festgestellt, dass Sie mit diesem Befehl die letzten 3 Commits quetschen können:

git rebase -i HEAD~3

Dies ist praktisch, da es auch funktioniert, wenn Sie sich in einer lokalen Niederlassung befinden, die keine Tracking-Informationen / Remote-Repos enthält.

Der Befehl öffnet den interaktiven Rebase-Editor, der es Ihnen ermöglicht, wie gewohnt neu zu sortieren, zu quetschen, umzuschreiben usw.


46
2018-05-17 06:19