Rebase: bu nima, Merge-dan nimasi bilan farq qiladi va ishlash prinsipi

Muallif: IT Sectr Nashr etilgan: 2026-05-10 O'qish vaqti: 10 daq

Rebase — bu Git-da commitlar ketma-ketligini yangi bazaviy commitga ko'chiradigan, filial tarixini qayta yozadigan operatsiyadir. Merge-dan farqli o'laroq, Rebase birlashtiruvchi commit yaratmaydi, balki commitlarni maqsadli filialning joriy holati ustiga qayta qo'llaydi. git-scm.com, 2026 ma'lumotlariga ko'ra, rebase Git loyihalarining 58 foizida toza chiziqli commit tarixini saqlash uchun ishlatiladi.

Asosiy fikrlar

  • Rebase — commitlarni yangi bazaga ko'chiradi, filial tarixini qayta yozadi
  • Chiziqli tarix — rebase-ning asosiy afzalligi: git log tarmoqlanmasdan o'qiladi
  • Ommaviy filiallar uchun emas — rebase commitlarni qayta yozadi, bu hamkasblar tarixini buzadi
  • Interactive rebase commitlarni birlashtirish, nomlash va o'chirish imkonini beradi
  • Oltin qoida: kimdir allaqachon push qilgan filialni hech qachon rebase qilmang

Rebase nima?

Rebase (bazani o'zgartirish) — joriy filialdan commitlarni yangi tayanch nuqtasiga (bazaga) ko'chiradigan Git operatsiyasidir. Birlashtiruvchi commit yaratish o'rniga, rebase har bir commitni manba filialdan olib, navbat bilan yangi baza ustiga qo'llaydi. Natijada tarmoqlanmasdan chiziqli commitlar ketma-ketligi hosil bo'ladi.

Rebase nomi „re-base" — bazani o'zgartirish ma'nosidan keladi. Agar merge ikki filialni bir nuqtada birlashtirsa, rebase butun filialingizni yangi joyga ko'chiradi, go'yo ishni maqsadli filialning joriy holatidan boshlagandek tuyuladi. Bu ideal ketma-ket ish taassurotini yaratadi.

Atlassian, 2025 ma'lumotlariga ko'ra, feature filiallari uchun rebase ishlatadigan jamoalar commit tarixini tahlil qilishga faqat merge ishlatadigan jamoalarga nisbatan 30% kam vaqt sarflashadi. Chiziqli tarix git blame, bisect va git log --oneline orqali jurnalni ko'rishni soddalashtiradi.

Merge-dan asosiy farq

Merge ikkita ota-onaga ega commit yaratib filiallarni birlashtiradi. Rebase tarixni qayta yozadi: yangi commitlar asl o'zgarishlar bilan bir xil bo'lsa-da, yangi hashlar bilan qaytadan yaratiladi. Bu rebase commitlarning SHA identifikatorlarini o'zgartiradi, bu ommaviy filiallar uchun juda muhimdir.

Rebase qanday ishlaydi

Rebase mexanizmi to'rt qadamdan iborat: Git joriy va maqsadli filialning umumiy ajdodini (merge base) aniqlaydi, so'ngra joriy filialning har bir commitini ketma-ket maqsadli filial ustiga qo'llaydi. Agar biror qadamda ziddiyat yuzaga kelsa — rebase to'xtaydi va yechimni kutadi.

bash
# Boshlang'ich holat: feature develop-dan 3 commit orqada
git checkout feature/new-login
git rebase develop

# Git feature-dan 3 commitni oladi va ularni develop ustiga qo'llaydi
# Ziddiyatlar bo'lmasa — rebase avtomatik yakunlanadi
# Bo'lsa — Git ziddiyatli commitda to'xtaydi

Rebase-dan so'ng feature filiali develop-dan barcha commitlarni va o'z commitlarini o'z ichiga oladi, ular develop-ning davomi kabi ko'rinadi. Bu birlashtiruvchi commit yaratmasdan develop-ga fast-forward orqali qo'shilish imkonini beradi.

Bosqichma-bosqich jarayon

Batafsil misolni ko'rib chiqaylik: dasturchi develop-dan feature filialini yaratdi, ikkita commit qildi, bu vaqtda boshqa dasturchilar develop-ga uchta commit qo'shdilar. Rebase feature-ning ikkita commitini yangi joyga ko'chiradi, ularning yangi SHA bilan nusxalarini yaratadi.

bash
# 1. Feature filialini yaratish
git checkout -b feature/payment-refactor develop

# 2. Feature-da commitlar qilish
git commit -m "refactor: extract payment validation"
git commit -m "refactor: add payment gateway interface"

# 3. Develop-ni yangilash (hamkasblar ishi)
git checkout develop
git pull

# 4. Feature-ni yangi develop ustiga rebase qilish
git checkout feature/payment-refactor
git rebase develop

# 5. Endi feature fast-forward orqali birlashtirilishi mumkin
git checkout develop
git merge feature/payment-refactor

4-qadamda ziddiyat yuzaga kelsa, Git muammoli commitda to'xtaydi. Dasturchi ziddiyatni hal qiladi, git add qiladi va git rebase --continue ni bajaradi. Agar commitni o'tkazib yuborish kerak bo'lsa — git rebase --skip, butun rebase-ni bekor qilish uchun — git rebase --abort.

Bo'sh commitlarni avtomatik o'tkazib yuborish

--empty bayrog'i bo'sh commitlarda rebase xatti-harakatini boshqaradi — commitning barcha o'zgarishlari allaqachon maqsadli filialda mavjud bo'lgan holatlar. Odatiy bo'lib, rebase to'xtaydi va qaror so'raydi. --empty=drop bayrog'i bilan Git bunday commitlarni to'xtamasdan avtomatik o'tkazib yuboradi, bu ko'p sonli commitlar bilan ommaviy bazani o'zgartirishni tezlashtiradi.

Interaktiv Rebase

Interactive rebase (git rebase -i) — commit tarixini tahrirlash uchun kuchli vositadir. U commitlar ro'yxati va asosiy buyruqlar bilan muharrir ochadi: pick (saqlash), reword (xabarni o'zgartirish), edit (mazmunni o'zgartirish), squash (oldingisi bilan birlashtirish), fixup (xabarsiz birlashtirish), drop (o'chirish).

bash
# Oxirgi 4 commitning interaktiv rebase-i
git rebase -i HEAD~4

# Muharrirda rebase rejasi ochiladi:
# pick a1b2c3 feat: add login screen
# pick d4e5f6 fix: login validation
# pick g7h8i9 fix: login layout
# pick j0k1l2 docs: add login comments

# O'zgartiramiz:
# pick a1b2c3 feat: add login screen
# squash d4e5f6 fix: login validation
# squash g7h8i9 fix: login layout
# drop j0k1l2 docs: add login comments

Natija: uchta commit (kirish ekrani, validatsiya, tartib) bittaga siqildi, sharhlar bilan commit o'chirildi. Bu kod tekshiruviga qoralama va tuzatishlarsiz toza tarixni taqdim etish imkonini beradi. Interactive rebase — Pull Request-dan oldin feature filialini tayyorlash uchun standart vositadir.

Rebase vs Merge: taqqoslash

Rebase va Merge bir vazifani — o'zgarishlarni integratsiyalashni — hal qiladi, lekin tubdan farqli usullar bilan. Ularning o'rtasida tanlov git log-da qanday tarixni ko'rishni xohlayotganingizga va filialingiz bilan kim ishlayotganiga bog'liq.

MezonMergeRebase
TarixTarmoqlanishni saqlaydiChiziqli, filialsiz
Birlashtiruvchi commitYaratiladi (ff dan tashqari)Yaratilmaydi
Commit SHA siO'zgarmaydiYangilari yaratiladi
XavfsizlikOmmaviy filiallar uchun xavfsizXavfli — tarixni qayta yozadi
Jurnal o'qilishiTarmoqlanish grafigiTo'g'ri chiziq
git bisectQulay — birlashish nuqtasi ko'rinadiQulay — chiziqli ketma-ketlik

Amaliy qoida: umumiy filiallarga (develop, main) integratsiya uchun merge, shaxsiy feature filiallarini joriy holatga keltirish uchun rebase dan foydalaning. Ko'p jamoalar birlashtiradi: feature-ni develop-ga rebase, keyin develop-ga --no-ff merge.

git bisect ga ta'siri

Git bisect — regressiyaga sabab bo'lgan commitni topish uchun vositadir. Merge ishlatilganda, git bisect ikkala ota-onani hisobga olgan holda birlashtiruvchi commitlardan to'g'ri o'tadi. Rebase-da bisect tezroq ishlaydi, chunki tarix chiziqli va tarmoqlanishni talab qilmaydi. Biroq rebase commitlar jamoaga ma'lum bo'lgandan keyin qilingan bo'lsa, asl SHA yo'qoladi va bisect muammoli commitni topa olmasligi mumkin.

Rebase qachon qo'llaniladi

Rebase uchta stsenariyda optimaldir: feature filialini Pull Request-ga tayyorlash, shaxsiy filialni main/develop ning joriy holatiga yangilash va birlashishdan oldin tarixni tozalash. Har bir holatda rebase jamoa ishi uchun xavf tug'dirmasdan tarixning o'qilishini yaxshilaydi.

Pull Request oldidan ishchi commitlarni (WIP, tekshiruvdan keyingi tuzatishlar) mazmunli mantiqiy birliklarga birlashtirish uchun interactive rebase bajarish tavsiya etiladi. Bu kod tekshiruvini osonlashtiradi: tekshiruvchi 15 mayda commitni emas, balki tushunarli xabarlar bilan 3-5 tuzilgan o'zgarishlarni ko'radi.

Feature filialini yangilash uchun rebase merge-dan afzal, chunki u keraksiz birlashtiruvchi commitlarni yaratmaydi. Feature filialida vaqti-vaqti bilan git rebase develop qilsangiz, yakuniy birlashishdan keyin 10 ta birlashtiruvchi commit kaskadi bo'lmaydi — faqat develop ustida toza funksiya commitlari.

Tarixni tozalash birlashishdan oldin interactive rebase orqali kichik tuzatishlarni (matn xatolari, formatlash) yashirish va commitlarni funksionallik bo'yicha guruhlash imkonini beradi. Git xabarlari Conventional Commits (fix:, feat:, refactor:, docs:) kelishuviga mos kelishi kerak, bu avtomatik changelog yaratadi.

Rebase xavflari va qoidalari

Rebase — noto'g'ri qo'llanilsa xavfli operatsiya. Asosiy xavf — nashr etilgan tarixni qayta yozish. Agar dasturchi boshqalar allaqachon push qilgan va ishlatayotgan filialni rebase qilsa, ularning mahalliy nusxalari desinxronlashadi va ma'lumot yo'qotish xavfi bilan force-pull qilishga majbur bo'ladilar.

  • Oltin qoida: umumiy omborda allaqachon mavjud commitlarni hech qachon rebase qilmang. Bu jamoa a'zolari kirish huquqiga ega bo'lgan har qanday filiallarga tegishli
  • Force push: mahalliy feature filialining rebase-dan so'ng --force-with-lease bayrog'i bilan push talab qilinadi, bu --force-dan xavfsizroq, chunki serverda filialni kimdir yangilaganligini tekshiradi
  • Kontekst yo'qolishi: rebase feature filiali qachon va qaysi filialdan yaratilganligi haqidagi ma'lumotni yo'q qiladi. Filialning yaratilish sanalarini saqlash muhim bo'lsa — merge dan foydalaning
  • Ziddiyatlar: rebase paytida ziddiyatlar har bir commit uchun alohida hal qilinishi kerak, bu ko'p sonli commitlar bilan zerikarli bo'lishi mumkin

Xavflarni kamaytirish uchun qoidaga rioya qiling: rebase faqat nashr etilmagan shaxsiy filiallar uchun. Agar filial allaqachon umumiy omborda bo'lsa — --no-ff bilan merge dan foydalaning. Nashr etilgan filialni rebase qilish zarur bo'lsa — jamoani ogohlantiring va force push-ni oldindan kelishib oling.

Xavfli rebase-dan avtomatik himoya server-side hooks orqali amalga oshiriladi: Git server tomonidagi pre-receive hook push nashr etilgan commitlarni qayta yozayotganligini tekshirishi mumkin. GitHub va GitLab himoyalangan filiallar uchun o'rnatilgan himoyani ta'minlaydi — administrator himoyani olib tashlamasa, force push bloklanadi.

Tez-tez beriladigan savollar

Ommaviy filialning rebase qilinsa nima bo'ladi?

Filial tarixi o'zgaradi — commitlarning SHA-lari boshqacha bo'ladi. Bu filialni allaqachon push qilgan yoki undan olingan filiallar yaratgan har bir kishi git pull paytida ziddiyatlarga duch keladi. Qayta tiklash qo'lda aralashuvni talab qiladi va commitlarning yo'qolishiga olib kelishi mumkin.

Rebase-ni bekor qilish mumkinmi?

Tugatishdan oldingit rebase --abort. Tugatgandan keyin — faqat git reflog orqali, agar rebase yaqinda qilingan bo'lsa. reflog HEAD harakatlari tarixini saqlaydi, uning yordamida rebase-dan oldingi holatga qaytish mumkin: git reset --hard HEAD@{1}.

Rebase cherry-pick-dan qanday farq qiladi?

Rebase commitlar ketma-ketligini yangi bazaga ko'chiradi. Cherry-pick bir yoki bir nechta aniq commitlarni joriy filialda qo'llaydi. Rebase butun zanjir uchun avtomatik, cherry-pick — har bir commitni qo'lda tanlashdir.

Har bir Pull Request-dan oldin rebase qilish kerakmi?

Tavsiya etiladi, lekin majburiy emas. PR-dan oldin rebase filialni main/develop ning joriy holatiga yangilaydi va tarixni tozalaydi. Agar filial yaqinda yaratilgan va yangilashni talab qilmasa — commitlarni tozalash uchun interactive rebase yetarli.

Rebase teglarga qanday ta'sir qiladi?

Teglar rebase paytida ko'chirilmaydi. Agar rebase qilingan commitda teg bo'lgan bo'lsa, bu teg hozir filial tarixiga kirmaydigan eski commitda qoladi. Feature filiallarida commitlarni teglamaslik, faqat main-da teglash tavsiya etiladi.

Xulosa

  • Rebase — commitlarni chiziqli tarix bilan yangi bazaga ko'chirish
  • Merge-dan farqli birlashtiruvchi commit yaratmaydi va commit SHA larini qayta yozadi
  • Interactive rebase commitlarni siqish, nomlash va o'chirish imkonini beradi
  • Oltin qoida: faqat shaxsiy filiallarni rebase qiling, ommaviylarini hech qachon
  • Rebase-dan so'ng force push talab qilinadi (afzal --force-with-lease)
  • Pull Request uchun rebase + -i bilan tarixni tozalash tavsiya etiladi
  • Gibrid yondashuv: feature filialini yangilash uchun rebase, fiksatsiya uchun --no-ff merge

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing