Bosh sahifa Wiki Rebase

Rebase

Rebase — Gitda commitlar ketma-ketligini boshqa base commit ustida qayta yaratish amali. U feature branchni yangilangan main branchdan davom etgandek ko‘rsatib, tarixni chiziqli qilishi mumkin. Rebase mavjud commit obyektlarini joyida ko‘chirmaydi; har patchni yangi parentga qo‘llab, yangi commit IDlar yaratadi.

Oddiy rebase

Feature branch maindan ajralgan, main keyin yangi commit olgan bo‘lsa:

git switch feature
git rebase main

Git feature’ning main’da yo‘q commitlarini topadi, branchni main uchiga vaqtincha ko‘chiradi va commitlarni ketma-ket qayta qo‘llaydi. Muallif ma’lumoti saqlanishi mumkin, committer va commit hash o‘zgaradi.

Conflict jarayoni

Har commit yangi basega qo‘llanganda conflict yuz berishi mumkin. Fayl hal qilinib stage qilingach:

git rebase --continue

--skip joriy commitni tashlab ketadi va uning o‘zgarishi yo‘qolishi mumkin. --abort branchni rebase boshlanishidan oldingi holatga qaytaradi. Conflict bir necha ketma-ket commitda takrorlanishi mumkin, chunki har patch alohida qo‘llanadi.

rerere oldingi conflict yechimini eslab, o‘xshash conflictga qayta qo‘llashga yordam beradi. Avtomatik natija baribir test va diff bilan tekshiriladi.

Interactive rebase

git rebase -i tanlangan commitlarni reorder, squash, fixup, edit yoki drop qilish imkonini beradi. Bu pull requestdan oldin lokal tarixni mantiqiy commitlarga tozalash uchun ishlatiladi. Commit xabarini o‘zgartirish ham yangi ID yaratadi.

Interactive rebase faqat kosmetika emas. Commitlarni qayta tartiblashda har oraliq commit build qilinadigan va mantiqan izchil bo‘lishi mumkin. Bisection va revert uchun toza tarix foydali.

Shared history

Remote’ga push qilingan commitlar rebase qilinsa, boshqa clone’larda eski va yangi tarix parallel paydo bo‘ladi. Yangi tarixni push qilish uchun force kerak. --force-with-lease remote’da kutilmagan yangi commit bo‘lsa operatsiyani rad etadi.

Umumiy main branch odatda rebase bilan qayta yozilmaydi. Feature branchni faqat egasi ishlatsa yoki jamoa kelishgan bo‘lsa rewrite boshqariladigan bo‘ladi. “Public commitni rebase qilmaslik” Gitning texnik taqiqi emas, hamkorlik xavfsizligi qoidasidir.

Rebase va merge

Merge ikki tarixni parentlari bilan saqlaydi va merge commit yaratishi mumkin. Rebase feature commitlarini main ustiga ko‘chirib chiziqli tarix beradi. Yakuniy fayl snapshoti bir xil bo‘lishi mumkin, tarix semantikasi esa farq qiladi.

Rebase conflictni yo‘q qilmaydi; uni integratsiyadan oldin feature muallifiga hal qildiradi. Merge branchning qayerda ajralib, qayerda birlashganini tarixda ochiq saqlaydi.

Commit identifikatorining o‘zgarishi

Commit identifikatori uning mazmuni bilan birga parent, muallif va vaqt kabi metadata asosida hisoblanadi. Rebase har commitni yangi parent ustida qayta yaratgani sababli fayl farqi o‘zgarmasa ham yangi hash hosil bo‘ladi. Eski commitga bog‘langan tashqi CI natijasi, review izohi yoki deploy yozuvi avtomatik ravishda yangi commitga ko‘chmasligi mumkin. Force pushdan keyin boshqa ishlab chiquvchi eski branchni merge qilsa, takroriy tarix paydo bo‘ladi. Umumiy branchda rebase siyosati shu sabab aniq kelishiladi; shaxsiy branchda esa --force-with-lease masofadagi kutilmagan o‘zgarishni bosib ketish xavfini kamaytiradi.

rebase --onto bir commit oralig‘ini eski bazadan ajratib, boshqa bazaga ko‘chirish imkonini beradi. U noto‘g‘ri branchdan boshlangan ishni tuzatishda foydali, ammo chegara commitlari aniq tanlanmasa, kerakli commit tushib qolishi yoki ortiqcha commit ko‘chishi mumkin.

Bog‘liq tushunchalar

Git, branch, merge, commit history, interactive rebase, conflict, force-with-lease