2010-06-17 8 views
18

Gibt es eine Möglichkeit, alle Commits vor einem angegebenen Commit zu entfernen und dieses Commit als Initial zu verwenden?Entfernen von Commits vor dem spezifischen Commit

+0

Ich weiß, dass ich ein Tutorial irgendwo gesehen habe, um so etwas zu tun ... Es zeigte, wie Sie ein historisches Repo-Ende bei Commit X behalten und dann Commit X zu HEAD machen und ein neues Repo von ihnen machen, mit einer Anmerkung zu X über den Zugriff auf das historische Repo. Ich kann es jetzt nicht finden, aber es ist möglich. – Daenyth

Antwort

16

Lassen Sie uns die neue sagen älteste commit der Hash ist X, und wir können „oldroot“ und „newroot“ vorübergehend verwenden:

git checkout -b oldroot X 
TREE=`git write-tree` 
COMMIT=`echo "Killed history" | git commit-tree "$TREE"` 
git checkout -b newroot "$COMMIT" 
git rebase --onto newroot oldroot master 
# repeat for other branches than master that should use the new initial commit 
git checkout master 
git branch -D oldroot 
git branch -D newroot 
git gC# WARNING: if everything's done right, this will actually delete your history from the repo! 

, dass eine ‚newroot‘ begehen mit dem gleichen Inhalt wie die ‚oldroot‘ schaffen wird begehen, aber ohne irgendwelche Eltern. Dann bringt es alle anderen Zweige auf die neue Wurzel zurück, die in der Geschichte aller von ihnen sein sollte.

EDIT: getestet und behoben; etwas später, ein wenig

+2

Beachten Sie, dass "Killed history" die neue Commit-Nachricht für das initiale Commit wird. Wenn Sie etwas anderes möchten, wie zum Beispiel die ursprüngliche Nachricht, dann leiten Sie es einfach dorthin ein. –

0

Je einfachere Lösung wäre raffiniert, Betrachten ursprünglich Ihre Branche hat Haupt zu begehen und Sie haben Sie eine Festschreibung ersten, jetzt auch eine zweite oben auf begangen haben zuerst. So haben Sie so etwas wie:

main->first->second 

Jetzt wollen Sie zweite oben auf Haupt haben, anstatt auf der ersten. Etwas wie:

main->second->first or main->second 

Sie können einfach tun,

git rebase -i main 

Dies gibt Ihnen eine interaktive Shell, wo Sie die Reihenfolge der Commits neu anordnen oder entfernen können irgendwelche Ihre Wahl zu begehen.

Verwandte Themen