2016-07-18 8 views
1

Ich habe ein Start-Repository für ein Projekt geklont. Verbringen Sie die letzten paar Wochen untätig daran und machen Sie Commits. Jetzt wurde mir klar, dass es in meinem Repo Unmengen von alten Commits gibt, die nichts mit meinem Projekt zu tun haben. Ebenso wie mein Repo mit ein paar Dutzend Mitwirkenden, die nie zu dem Projekt beigetragen haben.Git, entfernen Sie die Commits vom übergeordneten Repo

Ich würde gerne die alten Commits loswerden, die nichts mit dem Projekt zu tun haben und meine eigenen behalten.

Verwenden

git rebase -i 

konnte ich squash alle alten in zwei Commits verpflichtet. Aber ich weiß nicht, wie ich diese beiden in meiner Geschichte zerreißen könnte. Weil Rebasieren mich dazu zwingt, das zweitälteste Commit als das zu verwenden, in das ich mich dränge.

mit So drei Commits:

  1. meine erste begehen
  2. Mitte begehen
  3. alt Anfangs begehen

Ich möchte sie alle in den ersten ein bis squash haben aber keine Ahnung wie es scheint, als ob ich nur in der Lage bin, in ältere Commits einzutauchen.

Hier wäre the repo.

+0

Ich bin mir nicht sicher, was Sie fragen. Ihre Beschreibung klingt so, als ob Sie Commits entfernen und nicht quetschen möchten ("Squash" führt zwei Commits zu einem zusammen und behält alle Änderungen bei). Außerdem "quetscht" man sich nicht wirklich in ein Commit ein: Es ist eine symmetrische Operation. – melpomene

+0

Ich möchte, dass der Code bleibt, während ich darauf aufbaue. Aber ich will keine Botschaften von Leuten begehen, die nichts mit meinem Projekt zu tun haben. –

+0

OK, was ist das Problem? A in B zu quetschen sollte den gleichen Effekt haben wie B in A zu quetschen. – melpomene

Antwort

1

Wenn ich Ihre Frage richtig gelesen habe, ist Ihr Problem, dass Sie kein Root-Commit haben, um die ursprünglichen Commits zu zerquetschen. Sie können durch Rebasing auf eine Waise Zweig dieses Problem umgehen, so dass eine neue Wurzel vor allem verpflichten Injektion anderes:

(master) $ git checkout --orphan newmaster 
(newmaster) $ git reset --hard 
(newmaster) $ git commit --allow-empty -m 'Initial commit' 
(newmaster) $ git checkout master 
(master) $ git rebase newmaster 
(master) $ git rebase -i "<<hash of root commit>>" 
(master) $ git push --force 

Dies ist ein sehr stumpfes Instrument. Es erinnert mich an das alte Sprichwort: "Nur weil du kannst, bedeutet nicht, dass du es solltest.".

Hinweis: Jeder Commit-Hash in Ihrem Master wird umgeschrieben, also stellen Sie sicher, dass Sie nirgends offene Zweige haben. Wenn Ihr Repository Tags enthält, die Sie behalten möchten, müssen Sie alle aktualisieren. Ich empfehle Ihnen, es zuerst auf einem Wegwerf-Klon zu versuchen, um sicherzustellen, dass Sie bekommen, wonach Sie suchen, zu einem Preis, den Sie bereit sind zu zahlen.

+1

Ich musste ein weiteres leeres Commit hinzufügen, um etwas hineinzuquetschen. Und damit funktionierte es wie ein Zauber. –

Verwandte Themen