Git, Wie setze ich origin / master auf ein Commit zurück?


244

Ich setze meinen lokalen Master mit diesem Befehl auf ein Commit zurück:

git reset --hard e3f1e37

Wenn ich einen $ git statusBefehl eingebe, sagt das Terminal:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Da ich auch origin / header zurücksetzen möchte, checke ich auf origin / master aus:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

und setzen Sie den Header mit diesem Befehl zurück:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Dann habe ich versucht, Commit zu Origin / Header hinzuzufügen, was mir nicht gelungen ist.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Schließlich checke ich zu meinem lokalen Meister aus.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Da ich den Head of Origin / Master zurückgesetzt habe, erwarte ich, dass Local und Origin in die gleiche Richtung weisen, aber wie Sie sehen, sagt Git, dass mein Local / Master um 7 Commits hinter Origin / Master liegt.

Wie kann ich dieses Problem beheben? Die Dinge, die ich suche, sind Head of Local / Master und Origin / Master Point auf dasselbe Commit. Das folgende Bild zeigt, was ich getan habe. Vielen Dank.

Geben Sie hier die Bildbeschreibung ein


Antworten:


562

origin/xxxZweige sind immer Zeiger auf eine Fernbedienung. Sie können sie nicht auschecken, da sie nicht auf Ihr lokales Repository verweisen (Sie checken nur das Commit aus. Aus diesem Grund wird der Name nicht in der Verzweigungsmarkierung der Befehlszeilenschnittstelle angezeigt, sondern nur der Commit-Hash).

Um die Fernbedienung zu aktualisieren, müssen Sie Ihre lokalen Änderungen zwangsweise an den Master senden:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
das macht die angeforderte Operation, aber denken Sie daran, dass es diejenigen Leute unglücklich machen wird, die bereits die Commits vom Master gezogen haben.
Mnagel

Ich folgte diesen Schritten und es rollte zurück. Aber der Ursprung / KOPF zeigt jetzt auf einen anderen Zweig als den Master. Was kann ich tun, um dies zu beheben?
Daniil Shevelev

1
Sie sollten sich nicht um Herkunft / KOPF kümmern, sondern einfach den guten Verweis auf Ursprung /
Simon Boudrias

Einverstanden, musste dies heute tun, nachdem versehentlich die falschen Zweige zusammengeführt und dann zum Ursprung gedrängt wurden. Es funktioniert gut, aber es könnte sehr störend sein, wenn andere Leute die betroffenen Zweige vom Ursprung her überprüft haben. Mit Vorsicht verwenden.
Nick W.

1
Funktioniert nicht remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

Die hier gefundene Lösung hat uns geholfen, den Master auf ein vorheriges Commit zu aktualisieren, das bereits gepusht wurde:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

Der Hauptunterschied zur akzeptierten Antwort ist der Commit-Hash "e3f1e37:" vor dem Master im Push-Befehl.


1
Funktioniert nicht:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

@ m0skit0 wie die Nachricht sagt you should pull first:)
intuitivepixel

Die Antwort darauf finden Sie unter stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falseaber tatsächlich habe ich das manuell in meinem lokalen Git-Repository festgelegt /opt/git, das ich erstellt habe, um mit den Ideen hier zu spielen. Ich bin mir nicht sicher, wie oder ob dies für Bitbucket, Github usw. möglich ist. Und @intuitivepixel ist sinnlos, da es das umkehrt, was Sie mit dem Hard-Reset erreichen wollten.
HankCa

Hallo @jkovacs, ich möchte nicht, dass neue Änderungen im Master entfernt werden. Ich möchte nur diesen Commit-Hash "e3f1e37" an den Ursprungsmaster senden. Ist es möglich, den 2. Befehl git reset --hard "e3f1e37" zu überspringen?
KarenAnne

Hallo @jkovacs, ich habe gerade bestätigt, dass ich den 2. Schritt überspringen kann. :)
KarenAnne

2

Angenommen, Ihre Niederlassung wird mastersowohl hier als auch remote aufgerufen , und Ihre Fernbedienung wird aufgerufen, können originSie Folgendes tun:

git reset --hard <commit-hash>
git push -f origin master

Sie sollten dies jedoch vermeiden, wenn jemand anderes mit Ihrem Remote-Repository arbeitet und Ihre Änderungen abgerufen hat. In diesem Fall ist es besser, die nicht gewünschten Commits zurückzusetzen und dann wie gewohnt zu pushen.


1

Da ich eine ähnliche Situation hatte, dachte ich, ich würde meine Situation teilen und wie diese Antworten mir halfen (danke an alle).

Deshalb habe ich mich entschlossen, vor Ort zu arbeiten, indem ich mein letztes Commit jedes Mal geändert habe, wenn ich meinen Fortschritt im Hauptzweig speichern wollte (ich weiß, ich hätte mich verzweigen, mich darauf festlegen, weiter pushen und später wieder zum Master zusammenführen sollen).

Eines späten Abends beschloss ich aus paranoider Angst, meinen Fortschritt aufgrund eines Hardwarefehlers oder etwas aus dem Äther zu verlieren, den Meister zum Ursprung zu bringen. Später änderte ich meine lokale Hauptniederlassung weiter und als ich beschloss, dass es Zeit ist, erneut zu pushen, sah ich mich mit verschiedenen Hauptniederlassungen konfrontiert und stellte fest, dass ich origin / upstream ( duh! ) Nicht wie lokale Entwicklungszweige ändern kann.

Ich habe den Master also nicht lokal ausgecheckt, da ich bereits nach einem Commit war. Der Meister war unverändert. Ich musste nicht einmal zurücksetzen - hart, mein aktuelles Commit war in Ordnung.

Ich habe nur den Push-to-Origin erzwungen, ohne auch nur anzugeben, welches Commit ich dem Master aufzwingen wollte, da es in diesem Fall das ist, worauf sich HEAD bezieht. Überprüft, git diff master..origin/masterdamit es keine Unterschiede gab und das war's. Alles behoben. Vielen Dank! (Ich weiß, ich bin ein Idiot, bitte vergib!).

Wenn Sie mit Ihrer Hauptniederlassung vor Ort bereits einverstanden sind, gehen Sie einfach wie folgt vor:

git push --force origin master
git diff master..origin/master
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.