Wenn Sie bereits Dinge auf einen Remote-Server übertragen haben (und andere Entwickler an demselben Remote-Zweig arbeiten), ist es wichtig zu beachten, dass Sie den Verlauf nicht neu schreiben möchten
Verwenden Sie nicht git reset --hard
Sie müssen Änderungen rückgängig machen, andernfalls werden sie beim Auschecken, bei dem die Commits entfernt wurden, beim nächsten Push wieder zum Remote-Repository hinzugefügt. und jede andere Kasse zieht sie beim nächsten Zug danach ein.
Wenn Sie keine Änderungen an eine Fernbedienung übertragen haben, können Sie diese verwenden
git reset --hard <hash>
Wenn Sie haben gedrückt Veränderungen, aber sind sicher , niemand sie gezogen hat , kann man verwenden
git reset --hard
git push -f
Wenn Sie haben Änderungen gedrückt, und jemand hat sie in ihre Kasse gezogen können Sie es immer noch , aber das andere Team-Mitglied / Kasse collaborate brauchen würde:
(you) git reset --hard <hash>
(you) git push -f
(them) git fetch
(them) git reset --hard origin/branch
Aber im Allgemeinen wird das zu einem Chaos. Also zurücksetzen:
Die zu entfernenden Commits sind die letzten
Dies ist möglicherweise der häufigste Fall. Sie haben etwas getan - Sie haben sie herausgeschoben und dann festgestellt, dass sie nicht existieren sollten.
Zuerst müssen Sie das Commit identifizieren, zu dem Sie zurückkehren möchten. Dies können Sie tun mit:
git log
Suchen Sie einfach vor Ihren Änderungen nach dem Commit und notieren Sie sich den Commit-Hash. Sie können das Protokoll mithilfe des -n
Flags auf die am häufigsten erneut gesendeten Commits beschränken :git log -n 5
Setzen Sie dann Ihren Zweig auf den Status zurück, den Ihre anderen Entwickler sehen sollen:
git revert <hash of first borked commit>..HEAD
Der letzte Schritt besteht darin, einen eigenen lokalen Zweig zu erstellen, in dem die zurückgesetzten Änderungen erneut angewendet werden:
git branch my-new-branch
git checkout my-new-branch
git revert <hash of each revert commit> .
Arbeiten my-new-branch
Sie weiter, bis Sie fertig sind, und führen Sie es dann in Ihrem Hauptentwicklungszweig zusammen.
Die zu entfernenden Commits werden mit anderen Commits vermischt
Wenn die Commits, die Sie zurücksetzen möchten, nicht alle zusammen sind, ist es wahrscheinlich am einfachsten, sie einzeln zurückzusetzen. Verwenden Sie erneut git log
find die Commits, die Sie entfernen möchten, und dann:
git revert <hash>
git revert <another hash>
..
Erstellen Sie dann erneut Ihren Zweig, um Ihre Arbeit fortzusetzen:
git branch my-new-branch
git checkout my-new-branch
git revert <hash of each revert commit> .
Dann hacken Sie weg und verschmelzen Sie, wenn Sie fertig sind.
Sie sollten am Ende einen Commit-Verlauf haben, der so aussieht my-new-branch
2012-05-28 10:11 AD7six o [my-new-branch] Revert "Revert "another mistake""
2012-05-28 10:11 AD7six o Revert "Revert "committing a mistake""
2012-05-28 10:09 AD7six o [master] Revert "committing a mistake"
2012-05-28 10:09 AD7six o Revert "another mistake"
2012-05-28 10:08 AD7six o another mistake
2012-05-28 10:08 AD7six o committing a mistake
2012-05-28 10:05 Bob I XYZ nearly works
Better way®
Insbesondere jetzt, da Sie sich der Gefahren mehrerer Entwickler bewusst sind, die in derselben Branche arbeiten, sollten Sie Feature-Zweige immer für Ihre Arbeit verwenden. Das bedeutet nur, dass Sie in einem Zweig arbeiten, bis etwas fertig ist, und es erst dann mit Ihrem Hauptzweig zusammenführen. Erwägen Sie auch die Verwendung von Tools wie git-flow, um die Erstellung von Zweigen auf konsistente Weise zu automatisieren.
git reset --hard <last_good_commit>
?