2016-01-11 12 views
6

Ein Entwickler, der vor kurzem eine Menge Commits in einem Repo von einigen Monaten hinterlassen hat, die wie 'aktualisiert' sind. Im Idealfall möchte ich sie zu einem einzigen Commit zerquetschen, aber ich habe das erst kürzlich für Commits gemacht.Wie man am besten alte Commits zerquetscht

Wie würde ich es für die folgenden Commits tun (angenommen, dass das vor 2 Monaten bedeutet, dass es Hunderte von diesen gibt)?

.... von 2 Monaten

aabbcc updated 
aabbdd updated 
aabbee updated 
aabbff updated 

wollen nicht/etwas Besonderes, nur eine einfache Lösung benötigen. Diese Commits wurden nicht öffentlich geteilt (anders als bei mir heute), also kein Problem, die Commit-Geschichte anderer Leute zu stören.

Antwort

1

Um git Squash zu tun, befolgen Sie diese Schritte:

// X is the number of commits you wish to squash 
git rebase -i HEAD~X 

Sobald Sie Ihre Commits Squash - wählen Sie die s für Squash = es wird alle Commits in einem einzigen verpflichten kombinieren.

enter image description here


Sie auch die --root Flagge haben, falls Sie es brauchen

Versuch: git rebase -i --root

--root

Rebase all commits reachable from <branch>, instead of limiting them with 
an <upstream>. 

This allows you to rebase the root commit(s) on a branch. 
When used with --onto, it will skip changes already contained in `<newbase>` 
(instead of `<upstream>`) whereas without --onto it will operate on every 
change. When used together with both --onto and --preserve-merges, all root 
commits will be rewritten to have `<newbase>` as parent instead.` 
+0

Ich habe nicht - gibt es eine Möglichkeit, Rebase-i eine Reihe von Commit-IDs wie aabbcc.aabbbff – timpone

+0

@timpone Nein. Interaktive Rebase ist ein Skript, das 'git cherry-pick' unter der Haube verwendet. Mit 'cherry-pick' können Sie eine Auswahl treffen. – Kaz

+0

Nein, können Sie nicht Bereich – CodeWizard

1

Das Alter von den commits tut egal, Quetschen Commits ist Quetschen Commits.

Wenn rebasing nicht für Sie vorzuziehen ist, oder es gibt buchstäblich Tausende von Commits, die Sie quetschen wollen und damit nicht belästigt werden, können Sie einfach auf den ersten Commit-Hash zurücksetzen und alles neu einbinden:

$ git reset aabbff 
$ git commit -m "This commit now contains everything from the tip until aabbff" 

Sie hätten dann nur einen Commit, genauso wie Rebase -> Squash.

+0

haha, es ist nicht Tausende, aber wie 200 und sie sind aus einer Zeit, in der er einfach alles begehen. Gibt es eine Möglichkeit, von aabbff auf ein anderes spezifisches Commit zurückzusetzen (wie die Umkehrung des Tilde-Zeichens, denke ich). Tut mir leid, ich bin definitiv kein git guru, also ist meine größte Angst, Dinge zu vermasseln. – timpone

+0

Hey @timpone - nein, der 'reset'-Befehl wird von der Spitze der Verzweigung zurück auf die von Ihnen angegebene Revision/den Hash zurückgesetzt. Wenn Sie eine Reihe von Commits irgendwo in der Mitte der Verzweigungshistorie festlegen möchten, sollten Sie eine Rebase durchführen. –