Якщо ви вже перенесли речі на віддалений сервер (і у вас є інші розробники, які працюють над тією ж віддаленою гілкою), важливо пам’ятати, що ви не хочете переписувати історію
Не використовуйте git reset --hard
Вам потрібно скасувати зміни, інакше будь-яка перевірка, яка має в історії видалені коміти, додасть їх назад у віддалене сховище наступного разу, коли вони натиснуть; і будь-яка інша каса притягне їх до наступного потягу після цього.
Якщо ви не натискали зміни на пульт, ви можете використовувати
git reset --hard <hash>
Якщо є підштовхнули зміни, але впевнені , що ніхто не витягнув їх , ви можете використовувати
git reset --hard
git push -f
Якщо ви внесли зміни, і хтось втягнув їх у свою касу, ви все одно можете це зробити, але іншому члену команди / касі потрібно буде співпрацювати:
(you) git reset --hard <hash>
(you) git push -f
(them) git fetch
(them) git reset --hard origin/branch
Але загалом це перетворюється на безлад. Отже, повернення:
Комітети на видалення є останніми
Це, мабуть, найпоширеніший випадок, ви щось зробили - виштовхнули їх, а потім зрозуміли, що вони не повинні існувати.
Спочатку вам потрібно визначити коміт, до якого ви хочете повернутися, це можна зробити за допомогою:
git log
просто шукайте коміт перед вашими змінами та зверніть увагу на хеш коміту. Ви можете обмежити журнал найбільш повторними комітами, використовуючи -n
прапор:git log -n 5
Потім скиньте свою гілку до стану, який ви хочете бачити вашим іншим розробникам:
git revert <hash of first borked commit>..HEAD
Останній крок - створити свою власну локальну гілку, повторно застосувавши скасовані зміни:
git branch my-new-branch
git checkout my-new-branch
git revert <hash of each revert commit> .
Продовжуйте працювати, my-new-branch
поки не закінчите, а потім об’єднайте його з основною галуззю розвитку.
Комітети для видалення змішуються з іншими комітами
Якщо коміти, які ви хочете скасувати, не всі разом, можливо, найпростіше повернути їх окремо. Знову використовуючи git log
знайдіть коміти, які ви хочете видалити, а потім:
git revert <hash>
git revert <another hash>
..
Потім знову створіть свою гілку для продовження роботи:
git branch my-new-branch
git checkout my-new-branch
git revert <hash of each revert commit> .
Знову ж таки, зламайте і об’єднайтеся, коли закінчите.
У вас має вийти історія комітів, яка виглядає приблизно так 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
Кращий спосіб®
Тим більше, що тепер, коли ви усвідомлюєте небезпеку кількох розробників, що працюють в одній галузі, розгляньте можливість використання гілок функцій завжди для своєї роботи. Все це означає працювати у гілці, поки щось не закінчено, і лише потім об’єднувати це з основною гілкою. Також розгляньте можливість використання таких інструментів, як git-flow, для послідовної автоматизації створення гілок.