Git: Unterdrückung aufeinanderfolgender Commits, die nicht die neuesten Commits sind und nicht am Stammverzeichnis beginnen
Ich habe mehrere verwandte Fragen zu @ geprüfsquashing die letzten Commits undsquashing ein Commit an der Wurzel, aber beides hilft mir auch nicht, nicht aktuelle Commits zu löschen, die sich nicht im Stammverzeichnis befinden.
Hier ist mein Startszenario:
D---E---F---G---H---I---J master
und mein gewünschtes Ergebnis:
D---E---Z---I---J master
woZ
ist der Kürbis vonF---G---H
, undF---G---H
, D---E
, undI---J
kann eine beliebig lange Folge von nicht verzweigten Commits sein.
Erste Ansatz
[lucas]/home/blah/$ git rebase -i D
rebase in progress; onto D
You are currently editing a commit while rebasing branch 'master' on 'D'.
No changes
You asked to amend the most recent commit, but doing so would make
it empty. You can repeat your command with --allow-empty, or you can
remove the commit entirely with "git reset HEAD^".
Could not apply F... "Comments from commit F"
[1]+ Done gitk
[lucas]/home/blah/$
wo ich Commits auswähleF---G---H
seinsquash
, während das älteste Commit - die erste Zeile in der interaktiven Rebase - als @ belassen wipick
. Warum funktioniert das nicht?
Update: Am Ende des Befehls wird am @ ein Rebase ausgeführD
mitE
ist das HEAD-Commit. Allerdings war beim Start kein Rebase im Gange und der Aufruf vongit rebase --abort
beim erneuten Laufen hat das gleiche Ergebnis. Wenn ich das bei root oder HEAD mache, funktioniert gemäß den obigen Links alles einwandfrei.
Zweiter Ansatz:
Ich habe einen weiteren Versuch unternommen [durch Zusammenführen eines neuen Zweigs (letzter Beitrag im Forum)] http: //git.661346.n2.nabble.com/Non-interactive-squash-a-range-td5251049.htm) welches @ verwendgit checkout -b <clean-branch> <start-id> and
git merge --squash `, aber ich bekomme folgendes:
[lucas-ThinkPad-W520]/home/.../.Solstice_WS/7K_FGHF$ git checkout -b clean-branch D
Switched to branch 'clean-branch'
[lucas-ThinkPad-W520]/home/.../.Solstice_WS/7K_FGHF$ git merge --squash I
Updating D..I
Fast-forward
Squash commit -- not updating HEAD
.../GraphUtilities/impl/DAG.java | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
[lucas]/home/blah/$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
asdf/GraphUtilities//DAG.java
Please, commit your changes or stash them before you can switch branches.
Aborting
was scheint dieses Ergebnis zu haben:
------------------- <clean-branch> with non-committed changes
/
D---E---F---G---H---I---J <master>
Ich bin ein bisschen ratlos, wie kann ich diese Commits quetschen?
Letztendlich plane ich, dies in @ zu implementiereJGit
, also einJGit
Implementierung wäre auch akzeptabel.
HINWEI
Es kann ein @ gebduplizieren Sie hier, aber es hat keine Antworten und ich denke, die Frage ist ein bisschen unklar.
AKTUALISIERE
Dies ist eine Antwort auf die Antwort von @ ryenus unten:
Der Cherry-Pick schlägt auf dem Commit fehlI2
, woI2
ist inI---I2---J
. Wenn dies fehlschlägt, wird der Status meineswork
branch hasD---E---Z
, wie beabsichtigt bis zum Cherry-Pick, und es folgen nicht festgeschriebene Änderungen. @ Anrufgit cherry-pick --abort
löscht diese nicht festgeschriebenen Änderungen und ich habe bestätigt, dass das FestschreibenZ
ist richtig, das ist der Squash vonF---G---H
. Nach dem Festschreiben vonZ
, dann Kirschpflücken, warum schlägt das Kirschpflücken bei @ feF
?
Es scheint, als obgit cherry-pick I...J
versucht, @ Cherry-PiI2
, was den Zusammenführungskonflikt erzeugt und fehlschlägt. Irgendwelche Vorschläge
Hier ist meine Ausgabe:
[lucas]/home$ git checkout -b work H
Switched to a new branch 'work'
[lucas]/home$ git reset E
Unstaged changes after reset:
M adf/GraphUtilities//graph/impl/DAG.java
[lucas]/home$ git commit -am "squashed commit here!"
[work Z] squashed commit here!
1 file changed, 2 insertions(+), 5 deletions(-)
[lucas]/home$ git cherry-pick I...J
error: could not apply I2... <Comments from commit I2>
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
[lucas]/home/$ git status
On branch work
You are currently cherry-picking commit I2.
(fix conflicts and run "git cherry-pick --continue")
(use "git cherry-pick --abort" to cancel the cherry-pick operation)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: 3b6863741967406c1888701eb139178187d429487b99787096441d67bed56/Gra
phUtilities/src/edu/washington/cs/utils/graph/impl/DAG.java
no changes added to commit (use "git add" and/or "git commit -a")
[lucas]/home$