Git Push zum falschen Zweig

97

Als ich mit git arbeitete, stellte ich nach einigem 'Commit' und ein paar 'Push' fest, dass ich den falschen Zweig benutze!

Jetzt muss ich meine Änderungen in false_branch auf irgendeine Weise entfernen und die Änderungen in right_branch festschreiben und pushen

Was ist der beste (und einfachste) Weg, das zu tun?

Danke

Alessandro De Simone
quelle
Gute Frage @tokland: 99% der Ruby-Entwickler verwenden Git, und das Projekt, an dem ich arbeite, ist in RoR ... aber ich weiß, dass dies keine gute Motivation sein könnte
Alessandro De Simone
3
Aus meiner Sicht ist dies kein Duplikat dessen, was Halfdan bemerkt hat, da es auch darum geht, Commits in einen anderen Zweig zu verschieben und nicht nur zu entfernen.
Olenz

Antworten:

140

Wechseln Sie zu diesem Zweig, überprüfen Sie die git logund git revertdiese Commits einzeln. Sobald Sie dies getan haben, wechseln Sie zurück zum gewünschten Zweig. Dort können Sie git cherry-pickbestimmte Commits aus den Git-Refs auswählen und in den richtigen Zweig einfügen.

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Wenn die Commits zusammengefasst sind und keine Commits nach Ihren Dirty Commits verschoben werden, können Sie sogar den git resetfalschen Zweig kurz vor Ihren Commits in einen Zustand versetzen und anschließend erneut folgen, git cherry-pickum Ihre Commits in den richtigen Zweig zu bringen.

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2
Dhruva Sagar
quelle
Revert + Cherry-Pick scheint viel einfacher zu sein als andere mögliche Methoden, bei denen der Kopf zurückgesetzt und / oder neu basiert wird.
ChrisV
2
Für Git Cherry-Pick können Sie mehrere Shas in eine einzige Zeile setzen, dh git cherry-pick commitsha1 commitsha2.
ThomasW
Lebensretter! Und nicht kompliziert. Danke dir!
Craig Silver
Was passiert, wenn Sie false_branch (z. B. Develop) in right_branch (z. B. Feature / X) zusammenführen möchten? Dann werden die Änderungen rückgängig gemacht, die Sie vorgenommen haben.
timB33
3

Der einfachste Weg ist die Verwendung git rebase. Angenommen, Sie haben diese Einstellung:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

Sie möchten die Änderung C3, C4 in den rechten Zweig verschieben.

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

Jetzt ist die Einstellung

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

Dann müssen Sie Ihre Ergebnisse mit Gewalt pushen (WENN noch niemand mit Ihrem Remote-Repo synchronisiert hat):

git push -f remote:right_branch
Olivier Verdier
quelle
Ich habe diese Lösung nicht ausprobiert, ich habe bereits in der ersten Antwort gearbeitet (und es hat funktioniert). Ich habe nicht daran gedacht, bei Rebase, es sieht nach einer guten Alternative aus, danke
Alessandro De Simone
1
Anstatt git push -fbesser zu nutzen git push --force-with-lease. Zumindest wird sichergestellt, dass die Remote-Referenz nur aktualisiert wird, wenn niemand andere Commits über Ihre Commits verschoben hat.
Pierre-Olivier Vares
2

Eine Abkürzung zu Dhruvas Antwort

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
Tarikakyol
quelle