git reset ба git revert
Буруу commit хийсэн үед засах хоёр үндсэн арга бий: git reset болон git revert. Хоёулаа "буцаах" ажил хийдэг ч арга зам нь өөр.
HEAD гэж юу вэ?
HEAD нь одоо байгаа commit-г заах заалт юм. Ихэвчлэн хамгийн сүүлийн commit руу заана.
A --- B --- C --- D ← HEAD (main)
HEAD~1 нь HEAD-с нэг commit өмнөх, HEAD~2 нь хоёр commit өмнөх гэсэн утгатай:
A --- B --- C --- D
↑ ↑
HEAD~1 HEAD
git reset
git reset нь HEAD-г өмнөх commit руу буцаана. Commit түүхийг өөрчилдөг.
--soft
Commit-г устгана, гэхдээ өөрчлөлтүүд staging area-д үлдэнэ:
git reset --soft HEAD~1
Өмнө: A --- B --- C (HEAD)
Дараа: A --- B (HEAD)
C-ийн өөрчлөлтүүд staging-д байна → дахин commit хийж болно
Хэрэглэх тохиолдол: commit message буруу бичсэн, дахин commit хийхийг хүсэж байна.
--mixed (default)
Commit-г устгана, өөрчлөлтүүд working directory-д үлдэнэ (staging-аас гарна):
git reset HEAD~1
# эсвэл
git reset --mixed HEAD~1
Хэрэглэх тохиолдол: буруу файлуудыг commit хийсэн, дахин git add хийж засахыг хүсэж байна.
--hard
Commit-г устгана, өөрчлөлтүүд бүрэн устна:
git reset --hard HEAD~1
⚠️ Анхааруулга: --hard ашиглахад өөрчлөлтүүд бүрэн алдагдана. Сэргээх боломжгүй.
Хэрэглэх тохиолдол: хийсэн бүх өөрчлөлтийг орхиж, цэвэр эхлэхийг хүсэж байна.
Харьцуулалт
| Тохируулга | Commit | Staging area | Working directory |
| ---------- | ------ | ------------ | ----------------- |
| --soft | Устна | Хадгалагдана | Хадгалагдана |
| --mixed | Устна | Цэвэрлэгдэнэ | Хадгалагдана |
| --hard | Устна | Цэвэрлэгдэнэ | Цэвэрлэгдэнэ |
git revert
git revert нь тухайн commit-ийн эсрэг шинэ commit үүсгэнэ — түүхийг өөрчилдөггүй.
git revert HEAD
Өмнө: A --- B --- C (HEAD)
Дараа: A --- B --- C --- C' (HEAD)
↑
C-ийн эсрэг commit (C-ийн өөрчлөлтийг буцаана)
Commit message оруулахыг хүсэхгүй бол:
git revert HEAD --no-edit
Тодорхой commit-г revert хийх:
# Эхлээд commit hash-г олно
git log --oneline
# Тухайн commit revert хийнэ
git revert a3f2c1d
reset vs revert — аль тохиолдолд аль нь?
git reset ашиглах:
- Local-д ажиллаж байна, push хийгээгүй
- Туршилтын commit-уудыг цэвэрлэхийг хүсэж байна
- Commit түүхийг нэмэлтгүй цэвэр байлгахыг хүсэж байна
git revert ашиглах:
- Commit аль хэдийн push хийгдсэн, GitHub-д байна
- Багийн бусад хүмүүс тэр commit-г татаж авсан байж болзошгүй
- Алдааг аюулгүй, нийтэд харагдах байдлаар засахыг хүсэж байна
⚠️ Дүрэм: Push хийсний дараа git reset ашиглахаас зайлсхий. Бусдын repo-г эвдэж болзошгүй. Үүний оронд git revert ашигла.
Практик жишээ
Тохиолдол 1: Commit message буруу бичсэн, push хийгээгүй:
git reset --soft HEAD~1
git commit -m "feat: зөв commit message"
Тохиолдол 2: Буруу файл commit хийсэн, push хийгээгүй:
git reset HEAD~1
# Зөв файлуудаа засаад
git add зөвфайл.ts
git commit -m "feat: зөвхөн хэрэгтэй файлуудыг нэмэх"
Тохиолдол 3: Push хийсэн commit-д алдаа олдсон:
git revert HEAD
git push origin main
Дараагийн хичээлд:
git cherry-pick — нэг commit-ийг branch хооронд хуулах аргыг үзнэ.