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> andgit 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$ 

Antworten auf die Frage(1)

Ihre Antwort auf die Frage