Rozszerzanie tego, co napisałem w komentarzu
Ogólna zasada mówi, że nie powinieneś przepisywać (zmieniać) historii, którą opublikowałeś, ponieważ ktoś mógł na tym oprzeć swoją pracę. Jeśli przepiszesz (zmienisz) historię, będziesz miał problemy z scaleniem ich zmian i aktualizacją.
Dlatego rozwiązaniem jest utworzenie nowego zatwierdzenia, które przywróci zmiany , których chcesz się pozbyć. Możesz to zrobić za pomocą polecenia git revert .
Masz następującą sytuację:
A <- B <- C <- D <- master <- HEAD
(strzałki tutaj odnoszą się do kierunku wskaźnika: odniesienie „nadrzędne” w przypadku zatwierdzeń, górne zatwierdzenie w przypadku główki gałęzi (odniesienie do gałęzi) i nazwa gałęzi w przypadku odniesienia HEAD).
Co musisz stworzyć, to:
A <- B <- C <- D <- [(BCD) ^ - 1] <- master <- HEAD
gdzie „[(BCD) ^ - 1]” oznacza zatwierdzenie, które odwraca zmiany w zatwierdzeniach B, C, D. Matematyka mówi nam, że (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1, więc wymaganą sytuację można uzyskać za pomocą następujących poleceń:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"
Alternatywnym rozwiązaniem byłoby pobranie zawartości zatwierdzenia A i zatwierdzenie tego stanu:
$ git checkout -f A -- .
$ git commit -a
Wtedy miałbyś następującą sytuację:
A <- B <- C <- D <- A '<- master <- HEAD
Zatwierdzenie A 'ma taką samą treść jak zatwierdzenie A, ale jest innym zatwierdzeniem (komunikat zatwierdzenia, rodzice, data zatwierdzenia).
Rozwiązanie Jeff Ferland, zmodyfikowany przez Charles Bailey opiera się na tej samej idei, ale korzysta git resetu :
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(zakładając, że zdalna gałąź jest masterem). Tak, możesz wcisnąć dowolne takie zatwierdzenie.