git reset
git reset: скинути HEAD і поточну гілку до іншого коміту.
git reset — команда Git, яка насамперед переміщує HEAD і поточну гілку назад до конкретного коміту, фактично «перемотуючи» історію проєкту до попереднього стану. Ця команда стане в пригоді, коли треба скасувати коміти, зроблені в поточній гілці.
Використати git reset — це наче сказати репозиторію: «забудь, що ці зміни взагалі були, і вважай поточним станом проєкту ранішу версію». Це дуже зручно, коли треба скасувати зміни, спростити заплутану історію чи навіть об'єднати кілька комітів в один перед тим, як ділитися ними з іншими.
Історично git reset використовували для різних завдань, зокрема для скидання робочого дерева та області підготовки. Розробники зі стажем досі користуються git reset для цього. Проте з появою команди git restore у Git 2.23.0 для роботи з робочим деревом та областю підготовки тепер рекомендують саме git restore, а git reset варто залишити переважно для переміщення HEAD і вказівника поточної гілки.
З git restore менше шансів випадково щось зламати: ця команда точковіша й менш руйнівна, ніж git reset. Щоправда, тим, хто звик до старого git reset, може знадобитися час, щоб перелаштуватися. Але якщо знайомство з Git тільки починається, краще одразу розібратися в різниці й там, де це доречно, використовувати git restore замість git reset.
Приклади
Перемістити поточну гілку на один коміт назад і скинути область підготовки до стану цього коміту, не змінюючи робочу директорію. Правки з коміту, що перестав входити до історії гілки, опиняться поза областю підготовки.
Поширений сценарій — розділити поспішний коміт на кілька акуратних або знову додати до області підготовки лише частину правок:
git reset HEAD~1Перемістити поточну гілку на три коміти назад, не змінюючи область підготовки та робочу директорію. Правки з цих комітів опиняться разом в області підготовки.
Поширений сценарій — замінити кілька дрібних або неакуратних локальних комітів одним чистим комітом:
git reset --soft HEAD~3Перемістити поточну гілку на два коміти назад і привести область підготовки та робочу директорію до стану того коміту. Правки з цих двох комітів, а також незакомічені правки у відстежуваних файлах буде видалено. Незакомічені правки можна втратити назавжди.
Поширений сценарій — повністю відмовитися від локального експерименту, коли його коміти чи правки у відстежуваних файлах точно не знадобляться:
git reset --hard HEAD~2У цих прикладах HEAD~1 означає «один коміт перед HEAD». Число після ~ показує Git, на скільки комітів потрібно повернутися: наприклад, HEAD~3 означає «три коміти перед HEAD». Також можна вказати хеш коміту, гілку чи інше посилання на коміт.
Із git reset варто бути обережніше, особливо з опцією --hard: вона може безповоротно знищити зміни. Завжди перевіряй, що скидаєш гілку саме до того коміту, який потрібен. А якщо незакомічені зміни ще можуть знадобитися, перед скиданням збережи їх через git stash.
Зверни увагу: git reset не видаляє коміти повністю — насправді команда просто переміщує вказівник гілки. «Видалені» коміти залишаються в історії репозиторію (до них можна дістатися за хешем коміту), але вони більше не досяжні з поточної гілки. Тобто за потреби їх можна відновити, однак в історії гілки вони вже не з'являться.
.gitignoregit checkoutgit configgit taggit worktree