Wie kann ich die beiden vorherigen Commits rückgängig machen?

80

Stellen Sie sich dieses Szenario vor:

  1. Entwickler A führt ein Commit durch: #n
  2. Dev. B schreibt # n + 1 fest
  3. Dev. A schreibt # n + 2 fest
  4. und begehen Sie # n + 3

und entdeckt dann, dass er in seinem Commit # n + 2 einen Defekt eingeführt hat.

Wie kann dev. Ein Rollback seiner letzten 2 Commits und Weiterentwicklung auf Commit # n + 1 ?

Versucht git reset --hard HEAD~2* , aber es kommt zurück zu dev A's Commit #n .

Marius Butuc
quelle
2
git reset HEAD ~ 2 sollte auf # n + 1 commit zurückgesetzt werden, wenn Sie zu diesem Zeitpunkt B-Commits gezogen haben. Hast du sie gezogen?
Snowbear
1
... nicht vor # n + 2 festschreiben. Es war: [0] B drückte commit# n + 1, [1] A committed # n + 2, [2] erfolglos push, [3] pull, [4] push. Auf github gibt es jetzt ein Commit (# n + 2) und einen Merge-Zweig 'master' (# n + 3).
Marius Butuc
2
Wenn Sie das Commit bereits veröffentlicht haben, sollten Sie das Zurücksetzen nicht zum Zurücksetzen verwenden. (Wenn ein anderer Ihnen unbekannter Entwickler gezogen hat, verursacht dies Schmerzen.) Verwenden Sie stattdessen "Zurücksetzen" und führen Sie ein neues Commit durch, das Sie in den gewünschten Zustand bringt. Ändern Sie niemals einen veröffentlichten Verlauf. Siehe book.git-scm.com/…
William Pursell

Antworten:

119

Es sollte zum n + 1-Commit zurückkehren. Wahrscheinlich haben Sie dort auch ein Merge-Commit. Sie können auch einegit reset --hard <sha1_of_where_you_want_to_be>

WARNUNG!! --hardbedeutet, dass alle nicht festgeschriebenen Änderungen, die Sie derzeit haben, dauerhaft verworfen werden.

Adam Dymitruk
quelle
2
Wie erhalte ich den sha1 eines Remote-Commits (nicht von mir durchgeführt)? Ich habe versucht, zu verwenden git reflog, aber ich kann nur auf meine lokalen Reflog-Informationen zugreifen, z. B. Commits #n, #n + 2, #n + 3 ... aber nicht
Marius Butuc
13
Ich habe die sha1 bekommen, die ich von a wollte git log, aber a git push -fwar auch erforderlich, damit die Modifikationen auf github reflektiert werden.
Marius Butuc
1
Ja, aber ich wusste nicht, dass Sie auch eine Fernbedienung aktualisieren
möchten
25
WARNUNG!! --hardbedeutet, dass alle nicht festgeschriebenen Änderungen, die Sie derzeit haben, dauerhaft verworfen werden. Verwenden Sie diese Option, um zu einem vorherigen Commit zurückzukehren, ohne Ihre Arbeit wegzuwerfen --soft.
Ken M. Haggerty
4
Bitte erklären Sie die Verwendung von --hard anstelle von --soft
iuridiniz