Git / git cherry-pick

git cherry-pick

git cherry-pick нь нэг branch дээрх тодорхой commit-г өөр branch руу хуулдаг команд. Бүх branch-г merge хийхгүйгээр зөвхөн хэрэгтэй commit-г авах боломжтой.

Яагаад хэрэгтэй вэ?

Дараах нөхцөлийг төсөөлье:

код
main:    A --- B --- C
                      \
feature:               D --- E --- F

feature branch дээр E commit нь main-д яаралтай хэрэгтэй алдааны засвар байна. Гэхдээ D болон F commit бэлэн биш. Тэгэхэд бүх branch-г merge хийхгүйгээр зөвхөн E-г авж болно.

Үндсэн хэрэглээ

bash
# 1. Эхлээд commit hash-г олно
git log feature --oneline

Хариу:

код
f7a923c feat: шинэ функц нэмэх
e2b841d fix: нэвтрэх алдаа засах   ← энэ commit хэрэгтэй
d3c719a chore: файл зохион байгуулах
bash
# 2. main branch руу шилжинэ
git checkout main

# 3. Хэрэгтэй commit-г cherry-pick хийнэ
git cherry-pick e2b841d

Үр дүн:

код
main:    A --- B --- C --- E'
                            ↑
                     cherry-pick хийсэн commit
                     (агуулга ижил, hash өөр)

E' нь E-тэй ижил өөрчлөлттэй боловч шинэ hash авна.

Cherry-pick range — олон commit хуулах

Хэд хэдэн дараалсан commit-г нэг дор cherry-pick хийх:

bash
# d3c719a-с e2b841d хүртэлх commit-уудыг хуулна
# (d3c719a орохгүй, e2b841d орно)
git cherry-pick d3c719a..e2b841d

Эхнийхийг оруулан хуулах бол ^ тэмдэг нэмнэ:

bash
git cherry-pick d3c719a^..e2b841d

Тасралтгүй бус олон commit:

bash
git cherry-pick a1b2c3d e2b841d f7a923c

Conflict шийдвэрлэх

Cherry-pick хийх үед conflict үүсч болно — ялангуяа хуулах гэж байгаа commit-ийн файлууд target branch дээр ч өөрчлөгдсөн байвал.

bash
git cherry-pick e2b841d

Conflict үүсвэл:

код
error: could not apply e2b841d...
hint: After resolving the conflicts, mark them with
hint: git add <pathspec>, then run
hint: git cherry-pick --continue

Conflict шийдвэрлэх алхмууд:

bash
# 1. Conflict файлуудыг харна
git status

# 2. Файл нээж conflict-г гараар шийднэ
# <<<<<<< HEAD
# таны main дээрх код
# =======
# cherry-pick хийж байгаа commit-ийн код
# >>>>>>> e2b841d

# 3. Засагдсан файлыг staging-д нэмнэ
git add засагдсан-файл.ts

# 4. Cherry-pick үргэлжлүүлнэ
git cherry-pick --continue

Cherry-pick цуцлах:

bash
git cherry-pick --abort

Cherry-pick commit message хадгалах

Default-аар cherry-pick нь эх commit-ийн message-г хадгалдаг. Commit message өөрчлөхийг хүсвэл:

bash
git cherry-pick e2b841d --edit

Практик жишээ

Тохиолдол: develop branch дээр алдааны засвар хийсэн. Яаралтай main-д хэрэгтэй боловч develop бэлэн биш.

bash
# Алдааны засварын commit hash олно
git log develop --oneline
# → 9f3a21b fix: төлбөрийн алдаа засах

# main branch руу шилжинэ
git checkout main

# Зөвхөн тэр засварыг авна
git cherry-pick 9f3a21b

# GitHub руу push хийнэ
git push origin main

Cherry-pick хэрэглэх, хэрэглэхгүй байх

Хэрэглэх тохиолдол:

  • Нэг branch дээрх алдааны засварыг яаралтай өөр branch-д авах
  • Туршилтын branch-с зөвхөн тодорхой commit-г авах

Хэрэглэхгүй байх тохиолдол:

  • Их хэмжээний өөрчлөлт хуулах — merge илүү тохиромжтой
  • Тогтмол ашиглах — duplicate commit үүсгэж, түүхийг эвдэж болзошгүй

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

Git workflow — GitFlow, trunk-based development, GitHub Flow-г харьцуулж үзнэ.