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-г авж болно.
Үндсэн хэрэглээ
# 1. Эхлээд commit hash-г олно
git log feature --oneline
Хариу:
f7a923c feat: шинэ функц нэмэх
e2b841d fix: нэвтрэх алдаа засах ← энэ commit хэрэгтэй
d3c719a chore: файл зохион байгуулах
# 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 хийх:
# d3c719a-с e2b841d хүртэлх commit-уудыг хуулна
# (d3c719a орохгүй, e2b841d орно)
git cherry-pick d3c719a..e2b841d
Эхнийхийг оруулан хуулах бол ^ тэмдэг нэмнэ:
git cherry-pick d3c719a^..e2b841d
Тасралтгүй бус олон commit:
git cherry-pick a1b2c3d e2b841d f7a923c
Conflict шийдвэрлэх
Cherry-pick хийх үед conflict үүсч болно — ялангуяа хуулах гэж байгаа commit-ийн файлууд target branch дээр ч өөрчлөгдсөн байвал.
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 шийдвэрлэх алхмууд:
# 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 цуцлах:
git cherry-pick --abort
Cherry-pick commit message хадгалах
Default-аар cherry-pick нь эх commit-ийн message-г хадгалдаг. Commit message өөрчлөхийг хүсвэл:
git cherry-pick e2b841d --edit
Практик жишээ
Тохиолдол: develop branch дээр алдааны засвар хийсэн. Яаралтай main-д хэрэгтэй боловч develop бэлэн биш.
# Алдааны засварын 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-г харьцуулж үзнэ.