Jak cofnąć dwa poprzednie zatwierdzenia?

83

Rozważ ten scenariusz:

  1. Programista A wykonuje zatwierdzenie: #n
  2. Dev. B zatwierdza # n + 1
  3. Dev. A zatwierdza # n + 2
  4. i zatwierdź # n + 3

a potem odkrywa, że ​​w swoim zatwierdzeniu # n + 2 wprowadził defekt.

Jak można dev. Cofnąć ostatnie 2 zatwierdzenia i kontynuować rozwój po zatwierdzeniu nr n + 1 ?

Próbowałem git reset --hard HEAD~2* , ale wraca do zatwierdzenia Dev A #n .

Marius Butuc
źródło
2
git reset HEAD ~ 2 powinien zresetować się do zatwierdzenia # n + 1, jeśli w tym momencie wyciągnąłeś B zatwierdzeń. Wyciągnąłeś je?
Snowbear,
1
... nie przed zatwierdzeniem # n + 2. Było: [0] B pchnął commit# n + 1, [1] A committed # n + 2, [2] nieudany push, [3] pull, [4] push. Tak więc na githubie jest teraz zatwierdzenie (# n + 2) i 'master' gałęzi Merge (# n + 3).
Marius Butuc
2
Jeśli opublikowałeś już zatwierdzenie, nie powinieneś używać resetowania do jego wycofania. (Jeśli jakiś inny nieznany ci programista pociągnął, spowoduje to ból). Zamiast tego użyj przywracania i wykonaj nowe zatwierdzenie, które doprowadzi cię do pożądanego stanu. Nigdy nie zmieniaj opublikowanej historii. Zobacz book.git-scm.com/…
William Pursell

Odpowiedzi:

122

Powinien wrócić do zatwierdzenia n + 1. Prawdopodobnie masz tam również zatwierdzenie scalające. Możesz także zrobićgit reset --hard <sha1_of_where_you_want_to_be>

OSTRZEŻENIE!! --hardoznacza, że ​​wszelkie niezatwierdzone zmiany, które obecnie posiadasz, zostaną trwale wyrzucone.

Adam Dymitruk
źródło
2
Jak uzyskać sha1 zdalnego zatwierdzenia (nie zrobione przeze mnie)? Próbowałem użyć git reflog, ale mam dostęp tylko do moich lokalnych informacji
reflog, np. Commits #n
13
Otrzymałem sha1, które chciałem, od a git log, ale git push -fbyło też wymagane, więc modyfikacje zostaną odzwierciedlone na githubie.
Marius Butuc,
1
Tak, ale nie wiedziałem, że chcesz zaktualizować pilota :)
Adam Dymitruk
25
OSTRZEŻENIE!! --hardoznacza, że ​​wszelkie niezatwierdzone zmiany, które obecnie posiadasz, zostaną trwale wyrzucone. Aby wrócić do poprzedniego zatwierdzenia bez wyrzucania swojej pracy, użyj --soft.
Ken M. Haggerty,
4
Proszę wyjaśnić użycie --hard zamiast --soft
iuridiniz