14-bo‘lim
Stash va cherry-pick
Ishni vaqtincha saqlab qo'yish, kerakli kommitni boshqa tarmoqdan olib kelish va patch fayllar.
Ushbu bo‘lim mundarijasi
Kundalik ishda ikki holat tez-tez uchraydi: "ishni to'xtatib, boshqa vazifaga o'tish kerak" va "faqat shu bitta kommit kerak".
git stash - ishni yashirib qo'yish #
Vaziyat: siz yarim ishni bajardingiz, shu payt shoshilinch xato tuzatish kerak bo'lib qoldi.
git status
On branch feature/hisobot
Changes not staged for commit:
modified: manba/hisobot.php
modified: manba/index.php
git stash
Saved working directory and index state WIP on feature/hisobot: 7d4e2f8 Hisobot boshlandi
git status
On branch feature/hisobot
nothing to commit, working tree clean
Ish papkasi toza - endi bemalol tarmoq almashtirishingiz mumkin.
Stash ni qaytarish #
# Oxirgisini qaytarish va ro'yxatdan o'chirish
git stash pop
# Qaytarish, lekin ro'yxatda qoldirish
git stash apply
# Ma'lum birini
git stash pop stash@{2}
On branch feature/hisobot
Changes not staged for commit:
modified: manba/hisobot.php
modified: manba/index.php
Dropped refs/stash@{0} (8c3f1a9d2e5b7042f6a8c1e3b5d7f902a4c6e810)
pop yoki apply?pop- qaytaradi va o'chiradi (odatiy holat)apply- qaytaradi, nusxasi ro'yxatda qoladi
Bir stash ni bir necha tarmoqqa qo'llamoqchi bo'lsangiz apply ishlating.
Stash ro'yxati #
git stash list
stash@{0}: WIP on feature/hisobot: 7d4e2f8 Hisobot boshlandi
stash@{1}: WIP on main: c9d2e71 Kitoblar sahifasi
stash@{2}: On feature/savat: savat validatsiyasi
# Mazmunini ko'rish
git stash show stash@{0}
manba/hisobot.php | 24 ++++++++++++++++++++
manba/index.php | 3 +-
2 files changed, 26 insertions(+), 1 deletion(-)
# To'liq diff
git stash show -p stash@{0}
Nom bilan saqlash #
git stash push -m "savat validatsiyasi tugallanmagan"
WIP on main: c9d2e71 degan yozuvdan bir hafta o'tib hech nima
tushunmaysiz.
Nom bilan saqlash odatini qiling - stash ro'yxati o'qilishi mumkin bo'ladi.
Foydali variantlar #
# Kuzatilmayotgan fayllarni ham saqlash
git stash -u
git stash --include-untracked
# Chetlab o'tilgan fayllarni ham
git stash -a
# Faqat ma'lum fayllarni
git stash push manba/hisobot.php
# Sahnadagilarni qoldirib, faqat qolganini saqlash
git stash --keep-index
# Interaktiv - qismlarni tanlab
git stash -p
# O'chirish
git stash drop stash@{1}
# Hammasini o'chirish
git stash clear
git stash clear qaytarilmaydiBu buyruq barcha saqlangan ishlarni o'chiradi.
git fsck --unreachable | grep commit bilan topishga urinish mumkin,
lekin bu ishonchli emas. Ehtiyot bo'ling.
Stash dan tarmoq yaratish #
git stash branch feature/yangi-ish stash@{0}
Bu:
- Stash qilingan paytdagi kommitdan yangi tarmoq yaratadi
- Unga o'tadi
- Stash ni qo'llaydi
- Stash ni o'chiradi
Stash ni qaytarganda konflikt chiqsa, stash branch eng oson yechim -
u asl kommitdan boshlagani uchun konflikt bo'lmaydi.
Amaliy stsenariy #
# Ish jarayonida
git switch feature/hisobot
# ... yarim ish qildingiz ...
# Shoshilinch xato keldi
git stash push -m "hisobot yarim ish"
git switch main
git switch -c hotfix/tolov-xatosi
# ... tuzatdingiz ...
git commit -am "To'lov xatosi tuzatildi"
git push -u origin hotfix/tolov-xatosi
# Ishga qaytish
git switch feature/hisobot
git stash pop
git cherry-pick #
Boshqa tarmoqdagi bitta kommitni joriy tarmoqqa olib kelish.
git switch main
git cherry-pick 8f3a1d0
[main 4b8e2a1] Narx yaxlitlash tuzatildi
Date: Mon Jun 10 14:22:31 2026 +0500
1 file changed, 3 insertions(+), 3 deletions(-)
Cherry-pick variantlari #
# Bir nechta kommit
git cherry-pick 8f3a1d0 2c7b4e9 5a1d3f8
# Oraliq (birinchisini o'z ichiga olmaydi)
git cherry-pick 8f3a1d0..2c7b4e9
# Oraliq (birinchisini ham)
git cherry-pick 8f3a1d0^..2c7b4e9
# Kommit yaratmasdan, faqat sahnaga qo'yish
git cherry-pick -n 8f3a1d0
# Xabarga manba kommit havolasini qo'shish
git cherry-pick -x 8f3a1d0
-x bilan xabar shunday bo'ladi:
Narx yaxlitlash tuzatildi
(cherry picked from commit 8f3a1d0e4b7c2a5f9d1e3b6c8a0f2d4e7b9c1a35)
-x ni ishlatingBir necha oydan keyin "bu kommit qayerdan keldi?" degan savol tug'iladi.
-x unga javob beradi.
Konflikt paytida #
git cherry-pick 8f3a1d0
CONFLICT (content): Merge conflict in manba/narx.php
# Hal qiling
nano manba/narx.php
git add manba/narx.php
git cherry-pick --continue
# Yoki
git cherry-pick --abort
git cherry-pick --skip
Cherry-pick qachon kerak? #
1. Hotfix ni ikki tarmoqqa qo'llash
git switch main
git cherry-pick 8f3a1d0 # tuzatish main ga
git switch release/1.5
git cherry-pick 8f3a1d0 # va eski relizga ham
2. Noto'g'ri tarmoqqa kommit qilingan
git switch to-g-ri-tarmoq
git cherry-pick 8f3a1d0
git switch noto-g-ri-tarmoq
git reset --hard HEAD~1
3. Katta tarmoqdan faqat bitta foydali kommitni olish Tarmoq tashlab yuborilgan, lekin undagi bitta tuzatish kerak.
Agar doim cherry-pick qilayotgan bo'lsangiz - ish oqimingizda muammo bor.
Bir xil kommit ikki tarmoqda ikki xil xesh bilan turadi. Keyinchalik merge qilganda Git buni tushunmasligi va konflikt berishi mumkin.
Odatiy holatda merge yoki rebase to'g'riroq.
Patch fayllar #
Git siz kod almashish kerak bo'lganda:
# Oxirgi 3 kommitdan patch yaratish
git format-patch -3
0001-Savat-sahifasi-yaratildi.patch
0002-Savat-mantiqi-qo-shildi.patch
0003-Narx-hisobi-tuzatildi.patch
# Ikki nuqta orasidagilar
git format-patch main..feature/savat
# Bitta faylga
git format-patch main --stdout > ozgarishlar.patch
Qabul qilish:
# Ko'rib chiqish
git apply --check 0001-*.patch
# Faqat o'zgarishni qo'llash
git apply 0001-*.patch
# Kommit ma'lumotlari bilan qo'llash
git am 0001-*.patch
apply va am farqigit apply- faqat fayl o'zgarishlarini qo'llaydigit am- kommitni to'liq tiklaydi: muallif, sana, xabar
Linux yadrosi ko'p yillar aynan shu usulda - email orqali patch yuborish bilan ishlab kelgan.
# Oddiy diff faylini yaratish
git diff main feature/savat > ozgarish.diff
git apply ozgarish.diff
git cherry - nima ko'chirilmagan? #
git cherry -v main feature/savat
+ 8f3a1d0 Savat validatsiyasi
- 2c7b4e9 Narx tuzatildi
+ 5a1d3f8 Savat testlari
| Belgi | Ma'nosi |
|---|---|
+ | Bu kommit main da yo'q |
- | Bu kommit main da allaqachon bor (mazmuni bo'yicha) |
- Faylni o'zgartiring va
git stash push -m "test"bilan saqlang. git statustoza ekanini ko'ring.git stash listbilan ro'yxatni ko'ring.- Boshqa tarmoqqa o'ting va qayting.
git stash popbilan ishni qaytaring.- Ikkita stash yarating va ularni nomi bilan qaytaring.
git stash -ubilan yangi faylni ham saqlang.- Yangi tarmoqda kommit qiling va uni
maingacherry-pick -xqiling. - Ikkala tarmoqda ham kommit borligini
git logbilan tekshiring. git format-patch -1bilan patch yarating va uni ochib ko'ring.
Xulosa #
git stashtugallanmagan ishni vaqtincha saqlab, ish papkasini tozalaydi.popqaytaradi va o'chiradi,applyro'yxatda qoldiradi.- Stash tarmoqqa bog'liq emas - istalgan tarmoqda qaytarish mumkin.
-ubayrog'i kuzatilmayotgan fayllarni ham saqlaydi.- Stash ga har doim nom bering:
git stash push -m "...". git cherry-pickbitta kommitni boshqa tarmoqdan olib keladi.-xbayrog'i manba kommit havolasini xabarga qo'shadi.- Cherry-pick ni ko'p ishlatish ish oqimida muammo borligini bildiradi.
format-patchvaamGit siz kod almashish imkonini beradi.
Keyingi bo'limda teglar va relizlarni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.