645 Stimmen

Verschieben von übertragenen (aber nicht gepushten) Änderungen in einen neuen Zweig nach dem Ziehen

Ich habe einiges an Arbeit geleistet ("Ihr Zweig ist 'origin/master' um 37 Übertragungen voraus."), die eigentlich in einen eigenen Zweig und nicht in master . Diese Übertragungen existieren nur auf meinem lokalen Rechner und wurden nicht an origin aber die Situation ist insofern etwas kompliziert, als andere Entwickler darauf gedrängt haben, die origin/master und ich habe diese Änderungen zurückgezogen.

Wie verschiebe ich meine 37 lokalen Commits rückwirkend auf einen neuen Branch? Ausgehend von den Dokumenten scheint es, dass git rebase --onto my-new-branch master o ...origin/master sollte dies tun, aber beide geben mir nur die Fehlermeldung "fatal: Needed a single revision". man git-rebase sagt nichts darüber aus, ob eine Revision der rebase und seine Beispiele tun dies nicht, daher habe ich keine Ahnung, wie ich diesen Fehler beheben kann.

(Beachten Sie, dass es sich hierbei um no ein Duplikat von Verschieben vorhandener, nicht gebundener Arbeiten in einen neuen Zweig in Git o Wie führe ich meine lokalen nicht übertragenen Änderungen in einen anderen Git-Zweig ein? da sich diese Fragen auf nicht übertragene Änderungen im lokalen Arbeitsbaum beziehen, nicht auf Änderungen, die lokal übertragen wurden).

641voto

Mark Longair Punkte 412179

Das sollte in Ordnung sein, da Sie Ihre Commits noch nirgendwo anders gepusht haben und Sie die Geschichte Ihres Zweigs nach origin/master . Zuerst würde ich eine git fetch origin um sicherzustellen, dass origin/master ist auf dem neuesten Stand. Angenommen, Sie sind derzeit auf master sollten Sie in der Lage sein zu tun:

git rebase origin/master

... der alle Ihre Commits wiedergibt, die nicht in origin/master auf origin/master . Standardmäßig ignoriert rebase Merge-Commits (z. B. solche, die Ihr git pull s wahrscheinlich eingeführt) und es wird einfach versuchen, den Patch, der durch jeden Ihrer Commits eingeführt wurde, auf origin/master . (Möglicherweise müssen Sie auf dem Weg dorthin einige Konflikte lösen.) Dann können Sie auf der Grundlage des Ergebnisses Ihren neuen Zweig erstellen:

git branch new-work

... und setzen Sie dann Ihre master zurück zu origin/master :

# Use with care - make sure "git status" is clean and you're still on master:
git reset --hard origin/master

Bei dieser Art der Manipulation von Zweigen mit git branch , git reset , usw. Ich finde es nützlich, den Commit-Diagramm häufig zu betrachten mit gitk --all oder ein ähnliches Tool, nur um zu überprüfen, ob ich verstehe, worauf die verschiedenen Hinweise hinweisen.

Alternativ hätten Sie auch einfach einen Themenzweig erstellen können, der auf dem ursprünglichen Stand Ihres Masters basiert ( git branch new-work-including-merges ) und dann zurücksetzen master wie oben. Da Ihr Themenzweig jedoch auch Zusammenführungen von origin/master und Sie Ihre Änderungen noch nicht gepusht haben, würde ich vorschlagen, ein rebase zu machen, damit der Verlauf ordentlicher ist. (Außerdem werden die Änderungen deutlicher, wenn Sie Ihren Themenzweig wieder mit dem Masterzweig zusammenführen).

254voto

NiRmaL Punkte 2536

Ich bin mit dem gleichen Problem konfrontiert. Ich habe die einfachste Lösung gefunden, die ich gerne teilen möchte.

1) Erstellen Sie einen neuen Zweig mit Ihren Änderungen.

git checkout -b mybranch

2) (Optional) Schieben Sie den neuen Zweigcode auf den entfernten Server.

git push origin mybranch

3) Checken Sie zurück zum Master-Zweig.

git checkout master

4) Setzen Sie den Code des Master-Zweigs mit dem entfernten Server zurück und entfernen Sie den lokalen Commit.

git reset --hard origin/master

234voto

Stachu Punkte 5307

Wenn Sie eine geringe Anzahl von Commits haben und es Ihnen egal ist, ob diese zu einem Mega-Commit zusammengefasst werden, funktioniert dies gut und ist nicht so beängstigend wie git rebase :

unstage die Dateien (ersetzen Sie 1 durch die Anzahl der Übertragungen)

git reset --soft HEAD~1

einen neuen Zweig erstellen

git checkout -b NewBranchName

die Änderungen hinzufügen

git add -A

eine Übergabe machen

git commit -m "Whatever"

39voto

Andriy Punkte 907

Eine weitere Möglichkeit angenommen branch1 - ist der Zweig mit übertragenen Änderungen Zweig2 - ist der erwünschte Zweig

git fetch && git checkout branch1
git log

Wählen Sie die Commit-IDs, die Sie verschieben möchten

git fetch && git checkout branch2
git cherry-pick commit_id_first..commit_id_last
git push

Jetzt nicht gepushte Übertragungen aus dem ursprünglichen Zweig rückgängig machen

git fetch && git checkout branch1
git reset --soft HEAD~1

17voto

Andreas B Punkte 337

Alternativ können Sie direkt nach der Übergabe an den falschen Zweig diese Schritte durchführen:

  1. git log
  2. git diff {previous to last commit} {latest commit} > your_changes.patch
  3. git reset --hard origin/{your current branch}
  4. git checkout -b {new branch}
  5. git apply your_changes.patch

Ich kann mir vorstellen, dass es für die Schritte eins und zwei einen einfacheren Ansatz gibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X