Git / git reset ба git revert

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-д үлдэнэ:

bash
git reset --soft HEAD~1
код
Өмнө:  A --- B --- C   (HEAD)
Дараа: A --- B          (HEAD)
       C-ийн өөрчлөлтүүд staging-д байна → дахин commit хийж болно

Хэрэглэх тохиолдол: commit message буруу бичсэн, дахин commit хийхийг хүсэж байна.

--mixed (default)

Commit-г устгана, өөрчлөлтүүд working directory-д үлдэнэ (staging-аас гарна):

bash
git reset HEAD~1
# эсвэл
git reset --mixed HEAD~1

Хэрэглэх тохиолдол: буруу файлуудыг commit хийсэн, дахин git add хийж засахыг хүсэж байна.

--hard

Commit-г устгана, өөрчлөлтүүд бүрэн устна:

bash
git reset --hard HEAD~1

⚠️ Анхааруулга: --hard ашиглахад өөрчлөлтүүд бүрэн алдагдана. Сэргээх боломжгүй.

Хэрэглэх тохиолдол: хийсэн бүх өөрчлөлтийг орхиж, цэвэр эхлэхийг хүсэж байна.

Харьцуулалт

| Тохируулга | Commit | Staging area | Working directory | | ---------- | ------ | ------------ | ----------------- | | --soft | Устна | Хадгалагдана | Хадгалагдана | | --mixed | Устна | Цэвэрлэгдэнэ | Хадгалагдана | | --hard | Устна | Цэвэрлэгдэнэ | Цэвэрлэгдэнэ |

git revert

git revert нь тухайн commit-ийн эсрэг шинэ commit үүсгэнэ — түүхийг өөрчилдөггүй.

bash
git revert HEAD
код
Өмнө:  A --- B --- C          (HEAD)
Дараа: A --- B --- C --- C'   (HEAD)
                        ↑
                   C-ийн эсрэг commit (C-ийн өөрчлөлтийг буцаана)

Commit message оруулахыг хүсэхгүй бол:

bash
git revert HEAD --no-edit

Тодорхой commit-г revert хийх:

bash
# Эхлээд 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 хийгээгүй:

bash
git reset --soft HEAD~1
git commit -m "feat: зөв commit message"

Тохиолдол 2: Буруу файл commit хийсэн, push хийгээгүй:

bash
git reset HEAD~1
# Зөв файлуудаа засаад
git add зөвфайл.ts
git commit -m "feat: зөвхөн хэрэгтэй файлуудыг нэмэх"

Тохиолдол 3: Push хийсэн commit-д алдаа олдсон:

bash
git revert HEAD
git push origin main

Дараагийн хичээлд:

git cherry-pick — нэг commit-ийг branch хооронд хуулах аргыг үзнэ.