Ich habe einiges an Arbeit geleistet ("Ihre Niederlassung liegt um 37 Commits vor 'origin / master'."), Die eigentlich eher in eine eigene Niederlassung als in eine eigene hätte gehen sollen master
. Diese Commits sind nur auf meinem lokalen Computer vorhanden und wurden nicht übertragen origin
, aber die Situation ist etwas kompliziert, da andere Entwickler darauf hingewiesen haben origin/master
und ich diese Änderungen vorgenommen habe.
Wie verschiebe ich meine 37 lokalen Commits rückwirkend in eine neue Niederlassung? Basierend auf den Dokumenten scheint es, dass dies getan werden sollte git rebase --onto my-new-branch master
oder ...origin/master
sollte, aber beide geben mir nur den Fehler "fatal: Benötigte eine einzige Revision". man git-rebase
sagt nichts über das Bereitstellen einer Revision aus rebase
und seine Beispiele tun dies nicht, daher habe ich keine Ahnung, wie dieser Fehler behoben werden kann.
(Beachten Sie, dass dies kein Duplikat von Verschieben vorhandener, nicht festgeschriebener Arbeit in einen neuen Zweig in Git ist oder wie ich meine lokalen nicht festgeschriebenen Änderungen in einem anderen Git-Zweig zusammenführe, da diese Fragen nicht festgeschriebene Änderungen im lokalen Arbeitsbaum betreffen, nicht Änderungen, die vorhanden sind wurde vor Ort begangen.)
Antworten:
Dies sollte in Ordnung sein, da Sie Ihre Commits noch nirgendwo anders gepusht haben und Sie den Verlauf Ihrer Niederlassung danach neu schreiben können
origin/master
. Zuerst würde ich a ausführengit fetch origin
, um sicherzustellen, dassorigin/master
es auf dem neuesten Stand ist. Angenommen, Sie sind gerade aktivmaster
, sollten Sie in der Lage sein:... , die alle Ihre Commits wiedergeben , die nicht in
origin/master
auforigin/master
. Die Standardaktion von Rebase besteht darin, Zusammenführungs-Commits zu ignorieren (z. B. diejenigen, die Siegit pull
wahrscheinlich eingeführt haben), und es wird nur versucht, den von jedem Ihrer Commits eingeführten Patch auf anzuwendenorigin/master
. (Möglicherweise müssen Sie unterwegs einige Konflikte lösen.) Anschließend können Sie Ihren neuen Zweig basierend auf dem Ergebnis erstellen:... und setzen Sie dann Ihren
master
Rücken zurück auforigin/master
:Wenn Sie mit dieser Art von Manipulation Zweigen tun
git branch
,git reset
etc. Ich finde nützlich es häufig zu betrachten das Diagramm begeht mitgitk --all
oder einem ähnlichen Werkzeug, nur um zu überprüfen , dass ich verstehe , wo alle die verschiedenen Refs zeigen.Alternativ hätten Sie einfach einen Themenzweig erstellen können, der darauf basiert, wo sich Ihr Master an erster Stelle befindet (
git branch new-work-including-merges
), und dannmaster
wie oben zurückgesetzt. Da Ihrorigin/master
Themenzweig jedoch Zusammenführungen von enthält und Sie Ihre Änderungen noch nicht vorangetrieben haben, würde ich vorschlagen, eine Neubasis durchzuführen, damit der Verlauf aufgeräumter wird. (Wenn Sie Ihren Themenzweig schließlich wieder zum Master zusammenführen, werden die Änderungen offensichtlicher.)quelle
master
. Die Rebase schreibt denmaster
Zweig so um, dass die neuen Commits linear über dem Zweig liegenorigin/master
, undgit branch new-work
erstellt dann einennew-work
Zweig, der auf die Spitzemaster
(des aktuellen Zweigs) zeigt, ohne den aktuellen Zweig auf zu schaltennew-work
.new-work
Enthält nun also alle neuen Commits. Dann verschiebt der Reset den aktuellen Zweig (nochmaster
) zurück zuorigin/master
.git reset
verschiedene andere Arten verschoben werden können. Dasgit branch new-work
heißt nur "Erstellen Sie einen Zweig, der auf dieses Commit zeigt, während ich in meinem aktuellen Zweig bleibe (der in diesem Fall Master ist)". Es gibt also keine Notwendigkeit , einen Befehl haben , dass bewegt sich die Festschreibungen von Meister zu den neuen Zweig - man muss nur eine Niederlassung schaffen es , und wenn Sie Master - Reset wird der neue Zweig links , wo Meister warWenn Sie eine geringe Anzahl von Commits haben und es Ihnen egal ist, ob diese zu einem Mega-Commit kombiniert werden, funktioniert dies gut und ist nicht so beängstigend wie
git rebase
:Entfernen Sie die Dateien (ersetzen Sie 1 durch Anzahl der Commits).
Erstellen Sie einen neuen Zweig
Fügen Sie die Änderungen hinzu
ein Commit machen
quelle
git log --all --decorate --oneline --graph
.Ich blieb bei dem gleichen Problem. Ich habe die einfachste Lösung gefunden, die ich gerne teile.
1) Erstellen Sie einen neuen Zweig mit Ihren Änderungen.
2) (Optional) Neuen Zweigcode auf Remote-Server übertragen.
3) Kasse zurück zum Hauptzweig.
4) Setzen Sie den Hauptzweigcode mit dem Remote-Server zurück und entfernen Sie das lokale Commit.
quelle
Eine weitere Möglichkeit ist die Annahme, dass Zweig1 - Zweig mit festgeschriebenen Änderungen Zweig2 - ein wünschenswerter Zweig ist
Wählen Sie Commit-IDs aus, die Sie verschieben möchten
Setzen Sie nun nicht gepusste Commits vom ersten Zweig zurück
quelle
Alternativ können Sie direkt nach dem Festschreiben des falschen Zweigs die folgenden Schritte ausführen:
git log
git diff {previous to last commit} {latest commit} > your_changes.patch
git reset --hard origin/{your current branch}
git checkout -b {new branch}
git apply your_changes.patch
Ich kann mir vorstellen, dass es für die Schritte eins und zwei einen einfacheren Ansatz gibt.
quelle
Wie wäre es mit:
git reset
Zurück zum letzten Commit, bevor Sie Änderungen vorgenommen haben.git pull
um nur die Fernbedienungsänderungen erneut abzurufen, die Sie beim Zurücksetzen weggeworfen haben.Oder explodiert das, wenn Sie versuchen, den Zweig erneut zusammenzuführen?
quelle
Hier ist ein viel einfacherer Weg:
Erstellen Sie einen neuen Zweig
Führen Sie in Ihrem neuen Zweig Folgendes aus:
git merge master
Dadurch werden Ihre festgeschriebenen (nicht übertragenen) Änderungen in Ihrem neuen Zweig zusammengeführtLöschen Sie Ihren lokalen Hauptzweig
git branch -D master
Verwenden Sie-D
statt,-d
weil Sie das Löschen des Zweigs erzwingen möchten.Führen Sie einfach eine
git fetch
in Ihrer Hauptniederlassung und einegit pull
in Ihrer Hauptniederlassung durch, um sicherzustellen, dass Sie den neuesten Code Ihres Teams haben.quelle
Ein einfacherer Ansatz, den ich verwendet habe (vorausgesetzt, Sie möchten 4 Commits verschieben):
(Suchen Sie in dem Verzeichnis, aus dem Sie den letzten Befehl für die 4
.patch
Dateien ausgeführt haben.)Dann:
In welcher Reihenfolge auch immer Sie wollten.
quelle
Kasse frische Kopie Ihrer Quellen
git clone ........
Machen Sie einen Zweig von der gewünschten Position
git checkout {position}
git checkout -b {branch-name}
Remote-Repository hinzufügen
git remote add shared ../{original sources location}.git
Holen Sie sich Remote-Quellen
git fetch shared
Kasse gewünschte Filiale
git checkout {branch-name}
Quellen zusammenführen
git merge shared/{original branch from shared repository}
quelle
Für mich war das der beste Weg:
git fetch
git branch my-changes
und drücken Sie auf Remotegit master -u upstream-branch remotes/origin/my-changes
git branch master --set-upstream-to remotes/origin/master
quelle