Розширюючи те, що я написав у коментарі
Загальне правило полягає в тому, що ви не повинні переписувати (змінювати) історію, яку ви опублікували, тому що хтось, можливо, грунтувався на цій роботі. Якщо ви перезаписуєте (змінюєте) історію, у вас виникнуть проблеми зі злиттям їх змін та оновленням для них.
Таким чином, рішення полягає в створенні нового комітету, який скасовує зміни, які ви хочете позбутися. Це можна зробити за допомогою команди git revert .
У вас є така ситуація:
A <- B <- C <- D <- майстер <- ГОЛОВА
(стрілки тут посилаються на напрямок вказівника: посилання "батьків" у разі комітів, верхнє фіксування у випадку голови відділення (відгалуження гілки) та назва гілки у випадку посилання HEAD).
Вам потрібно створити наступне:
A <- B <- C <- D <- [(BCD) ^ - 1] <- master <- HEAD
де "[(BCD) ^ - 1]" означає коміту, яка повертає зміни у комітах B, C, D. Математика говорить нам, що (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1, так ви можете отримати потрібну ситуацію, скориставшись такими командами:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"
Альтернативним рішенням було б перевірити вміст комірки А та здійснити цей стан:
$ git checkout -f A -- .
$ git commit -a
Тоді у вас виникла б така ситуація:
A <- B <- C <- D <- A '<- майстер <- ГОЛОВА
Здійснення A 'має той самий зміст, що і команда A, але це інше виконання (повідомлення про вчинення, батьки, дата вчинення).
Рішення Джеффа Ферланд, модифіковане Чарльз Бейлі грунтується на ту ж ідею, але використовує GIT скидання :
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(припустимо, що віддалений відділення є головним). Так, ви можете підштовхнути будь-які такі дії.