2017-01-08 1 views
1

Sagen wir, ich habe folgende Geschichte:Set begehen als root begehen

commit A 
[... list of commits] 
commit R 
[... list of commits] 
commit Z 

Ich möchte R als erste setzen begehen und löschen alle, bevor sie sind aber halten Geschichte von R nach A. begehen Das Ergebnis wäre:

commit A 
[... list of commits] 
commit R 

Ist das möglich?

+0

Der Inhalt des Commits 'R' enthält seine 'Eltern'-Linie (n), die ihn mit früheren Commits verbinden, so dass ein ansonsten äquivalentes Commit, das * ein * Root-Commit ist (ohne" Eltern "-Zeilen), zur Folge hat in einer neuen, anderen Hash-ID. Folglich muss jedes nachfolgende Commit (bis zu "A") * ebenfalls * in ein neues, anderes Commit (mit verschiedenen "Eltern" -Zeilen) kopiert werden. Ist das akzeptabel/wünschenswert? – torek

+0

Ja, neue Hashes sind völlig akzeptabel – Komo

+1

In diesem Fall können Sie 'git filter-branch' verwenden, um alle früheren Commits zu löschen. Es gibt mehrere Möglichkeiten, dies einzurichten, aber die einfachste allgemeine Methode besteht darin, 'git replace' zu ​​verwenden, um eine Kopie von' R' ohne Eltern zu erstellen (lesen Sie die man-Seiten für 'git replace'), dann führen Sie' git filter aus "-branch" mit '--all', und wenn es mit Tags versehene Tags gibt,' --tag-name-filter cat'. – torek

Antwort

0

können Sie Benutzer git rebase:

git rebase -i HEAD~3 

sollte Ihnen so etwas wie:

pick somehash A 
pick somehash R 
pick somehash Z 

# Commands: 
# p, pick = use commit 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

können Sie jetzt einfach die Commits in der Reihenfolge verschieben Sie sie haben wollen.

Die Dokumentation enthält Beispiele und Erklärungen zu verschiedenen Dingen, die Sie auf Ihre Commits anwenden können, lesen Sie sie für weitere Details.

+0

Ich hätte klarer sein sollen, aber es gibt tatsächlich viele Commits zwischen A und R und zwischen R und Z wollte ich wissen, ob es da ist eine Möglichkeit, dies zu tun ohne 'Rebase -i' – Komo

+0

Beachten Sie, dass Sie möglicherweise die Option --root verwenden müssen. http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git – Amida

Verwandte Themen