Git – Probleme mit interaktivem Rebase und Squashing
Frage
Ich weiß, dass es auf SO viele Fragen zu diesem Thema gibt, aber ich kann anscheinend überhaupt nicht die Antwort finden, nach der ich suche.
Ich habe gerade meinen Task-Zweig mit meinem Master zusammengeführt und bin bereit, meine Änderungen an den Remote-Master-Zweig zu übertragen.Sie werden jedoch als zwei Commits angezeigt:
commit 878c07412aab6a6b06b7fc8dd84c2418cc4f31d8
Merge: 9ffa590 c9f5552
Author: ***
Date: Mon May 21 16:02:36 2012 +0100
Merge branch 'modelUpdate4'
Conflicts:
***.xcodeproj/project.pbxproj
commit c9f5552862872673317701c3dffd7fb6b6daa02c
Author: ***
Date: Mon May 21 15:03:21 2012 +0100
Modified model according to requests. Repopulated seeded database.
Dies ist die Ausgabe von Git Log und den beiden Commits, die ich zu einem zusammenfassen möchte.Wenn ich es jedoch tue:
git rebase -i HEAD~2
Tatsächlich werden nur vier zuvor festgeschriebene (und gepushte) Festschreibungen angezeigt.Verstehe ich falsch, wie meine Zweige wieder zusammengeführt werden?Wenn ich versuche, git rebase -i auszuführen, wird nur der erste Commit in der Git-Log-Liste angezeigt.
Danke!
Lösung
Da Sie sagten, dass bereits vier Commits gepusht wurden, vermute ich, dass Ihr Diagramm (git log --oneline --decorate --graph
) sieht in etwa so aus, zwischen denen es Verzweigungs-Commits gibt master
Und modelUpdate4
bereits auf das Remote-Repo übertragen:
* (master, modelUpdate4, HEAD) Merge branch 'modelUpdate4'
| \
| * (origin/modelUpdate4) Modified model according to requests. [HEAD^2]
| |
| * Another commit on modelUpdate4
| |
| * Yet another commit on modelUpdate4!
| |
* | (origin/master) Something that conflics with a commit in modelUpdate4 [HEAD~1]
| /
* Previous commit on master [HEAD~2]
HEAD~2
ist der erste Elternteil des ersten Elternteils und seit Ihrem HEAD
ist eine Verschmelzung von modelUpdate4
hinein master
, es bezieht sich auf zwei Commits im Nachhinein master
Linie. HEAD^2
Ist HEAD's
zweiter Elternteil, also das Commit vorher HEAD
unten modelUpdate4
Linie.(Siehe auch: http://paulboxley.com/blog/2011/06/git-caret-and-tilde)
Wenn HEAD~2
ist Ihre neue Basis, Sie erhalten alle Verpflichtungen dazwischen HEAD~2
Und master
in einer geraden Linie.Sie müssen sich auch mit dem Zweigkonflikt in der auseinandersetzen modelUpdate4
begehen, wo es passiert.
* (master, HEAD) Merge branch 'modelUpdate4'
|
* Modified model according to requests. Repopulated seeded database.
|
* Another commit on modelUpdate4
|
* Yet another commit on modelUpdate4!
|
* Something on master that conflics with modelUpdate4
|
* Previous commit on master
Wenn jemand anderes diese Remote-Zweige verwendet oder Sie Ihren Verzweigungsverlauf beibehalten möchten, führen Sie kein Rebase durch.Dadurch wird der bereits im Remote-Repo enthaltene Verlauf neu geschrieben, was allen anderen nur Kopfschmerzen bereiten wird.Schieben Sie den Merge-Commit raus und Sie werden goldrichtig sein.
Alternativ können Sie auch direkt auf umbasieren origin/master
. origin/modelUpdate4
würde in den Git-Boonies landen, aber da es sich um einen Task-Zweig handelt, wette ich, dass Sie ihn sowieso einfach löschen würden.