14-bo‘lim

Stash va cherry-pick

Ishni vaqtincha saqlab qo'yish, kerakli kommitni boshqa tarmoqdan olib kelish va patch fayllar.

🕑 18 daqiqa o‘qish 📄 645 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. git stash - ishni yashirib qo'yish
  2. Stash ni qaytarish
  3. Stash ro'yxati
  4. Nom bilan saqlash
  5. Foydali variantlar
  6. Stash dan tarmoq yaratish
  7. Amaliy stsenariy
  8. git cherry-pick
  9. Cherry-pick variantlari
  10. Konflikt paytida
  11. Cherry-pick qachon kerak?
  12. Patch fayllar
  13. git cherry - nima ko'chirilmagan?
  14. Xulosa

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.

Terminal
git status
Natija
On branch feature/hisobot
Changes not staged for commit:
        modified:   manba/hisobot.php
        modified:   manba/index.php
Terminal
git stash
Natija
Saved working directory and index state WIP on feature/hisobot: 7d4e2f8 Hisobot boshlandi
Terminal
git status
Natija
On branch feature/hisobot
nothing to commit, working tree clean

Ish papkasi toza - endi bemalol tarmoq almashtirishingiz mumkin.

Ish papkasi tugallanmagan ish 2 fayl o'zgargan Stash omborchasi stash@{0}, stash@{1} ... Toza ish papkasi tarmoq almashtirish mumkin Qaytarish stash pop ish davom etadi stash pop Stash butun repozitoriy uchun umumiy - tarmoqqa bog'liq emas
Stash - vaqtinchalik "cho'ntak", tarmoqdan mustaqil

Stash ni qaytarish #

Terminal
# 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}
Natija
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 #

Terminal
git stash list
Natija
stash@{0}: WIP on feature/hisobot: 7d4e2f8 Hisobot boshlandi
stash@{1}: WIP on main: c9d2e71 Kitoblar sahifasi
stash@{2}: On feature/savat: savat validatsiyasi
Terminal
# Mazmunini ko'rish
git stash show stash@{0}
Natija
 manba/hisobot.php | 24 ++++++++++++++++++++
 manba/index.php   |  3 +-
 2 files changed, 26 insertions(+), 1 deletion(-)
Terminal
# To'liq diff
git stash show -p stash@{0}

Nom bilan saqlash #

Terminal
git stash push -m "savat validatsiyasi tugallanmagan"
Har doim nom bering

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 #

Terminal
# 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
Terminal
# O'chirish
git stash drop stash@{1}

# Hammasini o'chirish
git stash clear
git stash clear qaytarilmaydi

Bu 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 #

Terminal
git stash branch feature/yangi-ish stash@{0}

Bu:

  1. Stash qilingan paytdagi kommitdan yangi tarmoq yaratadi
  2. Unga o'tadi
  3. Stash ni qo'llaydi
  4. Stash ni o'chiradi
Konflikt bo'lganda

Stash ni qaytarganda konflikt chiqsa, stash branch eng oson yechim - u asl kommitdan boshlagani uchun konflikt bo'lmaydi.

Amaliy stsenariy #

Terminal
# 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.

Terminal
git switch main
git cherry-pick 8f3a1d0
Natija
[main 4b8e2a1] Narx yaxlitlash tuzatildi
 Date: Mon Jun 10 14:22:31 2026 +0500
 1 file changed, 3 insertions(+), 3 deletions(-)
nusxa main kerakli kommit feature cherry-pick Faqat bitta kommit ko'chiriladi, qolganlari tegilmaydi
Cherry-pick ham nusxa yaratadi - yangi xesh bilan

Cherry-pick variantlari #

Terminal
# 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:

Natija
Narx yaxlitlash tuzatildi

(cherry picked from commit 8f3a1d0e4b7c2a5f9d1e3b6c8a0f2d4e7b9c1a35)
-x ni ishlating

Bir necha oydan keyin "bu kommit qayerdan keldi?" degan savol tug'iladi. -x unga javob beradi.

Konflikt paytida #

Terminal
git cherry-pick 8f3a1d0
Natija
CONFLICT (content): Merge conflict in manba/narx.php
Terminal
# 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? #

Amaliy vaziyatlar

1. Hotfix ni ikki tarmoqqa qo'llash

Terminal
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

Terminal
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.

Cherry-pick ni ko'p ishlatmang

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:

Terminal
# Oxirgi 3 kommitdan patch yaratish
git format-patch -3
Natija
0001-Savat-sahifasi-yaratildi.patch
0002-Savat-mantiqi-qo-shildi.patch
0003-Narx-hisobi-tuzatildi.patch
Terminal
# Ikki nuqta orasidagilar
git format-patch main..feature/savat

# Bitta faylga
git format-patch main --stdout > ozgarishlar.patch

Qabul qilish:

Terminal
# 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 farqi
  • git apply - faqat fayl o'zgarishlarini qo'llaydi
  • git am - kommitni to'liq tiklaydi: muallif, sana, xabar

Linux yadrosi ko'p yillar aynan shu usulda - email orqali patch yuborish bilan ishlab kelgan.

Terminal
# Oddiy diff faylini yaratish
git diff main feature/savat > ozgarish.diff
git apply ozgarish.diff

git cherry - nima ko'chirilmagan? #

Terminal
git cherry -v main feature/savat
Natija
+ 8f3a1d0 Savat validatsiyasi
- 2c7b4e9 Narx tuzatildi
+ 5a1d3f8 Savat testlari
BelgiMa'nosi
+Bu kommit main da yo'q
-Bu kommit main da allaqachon bor (mazmuni bo'yicha)
Amaliy topshiriq
  1. Faylni o'zgartiring va git stash push -m "test" bilan saqlang.
  2. git status toza ekanini ko'ring.
  3. git stash list bilan ro'yxatni ko'ring.
  4. Boshqa tarmoqqa o'ting va qayting.
  5. git stash pop bilan ishni qaytaring.
  6. Ikkita stash yarating va ularni nomi bilan qaytaring.
  7. git stash -u bilan yangi faylni ham saqlang.
  8. Yangi tarmoqda kommit qiling va uni main ga cherry-pick -x qiling.
  9. Ikkala tarmoqda ham kommit borligini git log bilan tekshiring.
  10. git format-patch -1 bilan patch yarating va uni ochib ko'ring.

Xulosa #

  • git stash tugallanmagan ishni vaqtincha saqlab, ish papkasini tozalaydi.
  • pop qaytaradi va o'chiradi, apply ro'yxatda qoldiradi.
  • Stash tarmoqqa bog'liq emas - istalgan tarmoqda qaytarish mumkin.
  • -u bayrog'i kuzatilmayotgan fayllarni ham saqlaydi.
  • Stash ga har doim nom bering: git stash push -m "...".
  • git cherry-pick bitta kommitni boshqa tarmoqdan olib keladi.
  • -x bayrog'i manba kommit havolasini xabarga qo'shadi.
  • Cherry-pick ni ko'p ishlatish ish oqimida muammo borligini bildiradi.
  • format-patch va am Git siz kod almashish imkonini beradi.

Keyingi bo'limda teglar va relizlarni o'rganamiz.

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.