Mundarija (40)
- Bu darsda
- 1. Nega bu kerak?
- 2. Todo ro'yxati
- 2.1 git rebase -i main
- 2.2 Ro'yxatni o'qish
- 2.3 Hech narsani o'zgartirmasak
- 3. Tozalash
- 3.1 Reja
- 3.2 Ro'yxatni tahrirlash
- 3.3 squash xabari
- 3.4 reword xabarlari
- 3.5 Natija
- 3.6 Nima o'zgardi — tekshirish
- 4. Tartibni o'zgartirish va xato todo
- 4.1 Qatorlarni ko'chirish
- 4.2 Birinchi qatorda squash
- 5. edit: commitni ikkiga bo'lish
- 5.1 Muammo
- 5.2 edit bilan to'xtash
- 5.3 Bo'lish
- 6. exec: har commitdan keyin tekshiruv
- 7. commit --fixup va --autosquash
- 7.1 Vaziyat
- 7.2 --fixup
- 7.3 --autosquash
- 8. Oltin qoida yana bir bor
- 9. Ko'p uchraydigan xatolar
- 9.1 Todo'dagi qatorni o'chirib yuborish
- 9.2 Todo'ni bo'shatib yopish
- 9.3 squash xabarini o'ylamasdan yopish
- 9.4 Muharrir ochilmaydi yoki "hint: Waiting for your editor"
- 9.5 main ni tozalash
- 10. Mashqlar
- 1-mashq (oson): Buyruqni tanlang
- 2-mashq (o'rta): Bo'sh joylarni to'ldiring
- 3-mashq (qiyin): Uch commitni bittaga
- 4-mashq: Portfolio qadami — PR'dan oldingi tozalash
- 11. Real ishda
- Xulosa
- Manbalar
Git interaktiv rebase: PR'dan oldin tarixni tozalash
Qisqacha:
git rebase -i mainbranch'dagi commitlar ro'yxatini muharrirda ochadi. Har qator oldidagi so'zni o'zgartirib, commitlarni birlashtirasiz (squash,fixup), xabarini tuzatasiz (reword), o'chirasiz (drop) yoki to'xtab o'zgartirasiz (edit). Faylni saqlab yopsangiz — Git ro'yxatni yuqoridan pastga bajaradi.git commit --fixup <sha>va--autosquashtuzatish commitini kerakli joyga o'zi joylaydi. Oltin qoida bu yerda ham amal qiladi: faqat hali hech kimga bermagan commitlar.
Bu darsda
git rebase -iochadigan todo ro'yxatini o'qiysiz va tahrirlaysiz.pick,squash,fixup,reword,dropbilan chalkash tarixni bir necha toza commitga aylantirasiz.editbilan bitta katta commitni ikkiga bo'lasiz.execbilan har commitdan keyin tekshiruv ishga tushirasiz.git commit --fixupva--autosquashbilan tuzatishni avtomatik joylaysiz.
Oldin bilishingiz kerak: Rebase: tarixni chiziqlash va oltin qoida, Yaxshi commit: atomar commit va xabar yozish, Xatoni tuzatish 2: reset va revert.
1. Nega bu kerak?
Ish paytida commit tarixi kamdan-kam chiroyli chiqadi. Aziz «Bahor»ga sharhlar sahifasini qo'shdi va bir soat ichida shunday commitlar to'plandi:
e547944 (HEAD -> feature/sharhlar) bosh sahifaga havola
3cfe2d5 debug
1a09aa4 ikkinchi
16af420 typo
2ceee85 wip
ed27468 sharhlar sahifasiBu tarixda nima yomon? Yaxshi commit darsidagi qoidalarni eslang:
wip("work in progress" — "ish jarayonida"),typo("imlo xatosi") — hech narsa demaydi.typo— oldingi commitdagi xatoni tuzatadi. Tarixda xato ham, tuzatish ham qoladi.debug— sinov uchun qo'yilganTEST TESTqatori. U umuman saytga chiqmasligi kerak edi.- Xabarlar kichik harf bilan va buyruq maylida emas.
Endi bu branch'ni hamkasbingiz tekshirishi (review) kerak. Jamoalarda bu PR (pull request) orqali bo'ladi: GitHub'da "mening branch'imni main ga qo'shing" degan so'rov ochiladi, hamkasblar commitlarni ko'rib chiqadi. PR'ni Pull Request darsida to'liq o'rganamiz — hozir shuni bilish yetarli: PR'dagi har commitni boshqa odam o'qiydi.
Hamkasbingiz oltita commitni birma-bir o'qib, qaysi biri muhim ekanini topishga majbur. Yaxshisi — uch toza commit: sahifa, ikkinchi sharh, havola.
Buni interaktiv rebase (interactive rebase) qiladi. Oldingi darsda rebase commitlarni birma-bir qayta qo'llashini ko'rdik. Interaktiv rebase shu ro'yxatni sizga ko'rsatadi va har commit bilan nima qilishni so'raydi. Xuddi xat jo'natishdan oldin qoralamani qayta o'qib, keraksiz jumlalarni o'chirib, bir nechtasini bittaga qo'shgandek.
2. Todo ro'yxati
2.1 git rebase -i main
-i — "interactive". main — qaysi commitdan keyingilar ro'yxatga tushishi: main da yo'q, faqat branch'dagi commitlar. Tekshiramiz:
cd ~/kurs/bahor
git log --oneline main..HEADmain..HEAD — "main da yo'q, HEAD da bor commitlar" (git diff darsidagi ikki nuqta). Natija — yuqoridagi oltita commit. Endi:
git rebase -i mainVS Code'da git-rebase-todo nomli fayl ochiladi. Todo ro'yxati (inglizcha "to do" — "qilinadigan ishlar") — Git bajaradigan buyruqlar ro'yxati: har qatorda bitta commit va u bilan nima qilish kerakligi. Xuddi bozorga chiqishdan oldin yozilgan xarid ro'yxati kabi: qatorlarni o'chirasiz, almashtirasiz, keyin ro'yxat bo'yicha ish boshlanadi. Biz faylni muharrir o'rniga ekranga chiqarib ko'rdik:
pick ed27468 # sharhlar sahifasi
pick 2ceee85 # wip
pick 16af420 # typo
pick 1a09aa4 # ikkinchi
pick 3cfe2d5 # debug
pick e547944 # bosh sahifaga havola
# Rebase 0be6fbb..e547944 onto 0be6fbb (6 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# create a merge commit using the original merge commit's
# message (or the oneline, if no original merge commit was
# specified); use -c <commit> to reword the commit message
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
# to this position in the new commits. The <ref> is
# updated at the end of the rebase
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#Qo'rqmang — pastki qism faqat yordam matni. Asosiy narsa — tepadagi olti qator.
2.2 Ro'yxatni o'qish
Diqqat: tartib git log ga teskari. Bu yerda eng eski commit tepada, eng yangisi pastda. Chunki bu — bajarish tartibi: Git ro'yxatni yuqoridan pastga, birma-bir bajaradi.
Har qator uch qismdan iborat: buyruq (pick), qisqa SHA va # dan keyin commit xabari (faqat siz uchun, Git uni o'qimaydi).
Yordam matnidagi eng kerakli buyruqlar:
| Buyruq | Qisqa | Nima qiladi |
|---|---|---|
pick |
p |
Commitni o'zgarishsiz qoldirish |
reword |
r |
Commitni qoldirish, faqat xabarini o'zgartirish |
squash |
s |
Oldingi commitga qo'shish, xabarlarni birlashtirish |
fixup |
f |
Oldingi commitga qo'shish, o'z xabarini tashlab |
drop |
d |
Commitni butunlay olib tashlash |
edit |
e |
Commitni qo'llab, to'xtash (o'zgartirish uchun) |
exec |
x |
Shu joyda terminal buyrug'ini ishga tushirish |
Qolgan uchtasi (label, reset, merge) — murakkab tarixni qayta qurish uchun, kursda kerak bo'lmaydi. break — ro'yxatning shu joyida to'xtab turish.
Yordam matnining oxirgi jumlalari muhim: "Qatorlar tartibini o'zgartirish mumkin. Qatorni o'chirsangiz, o'sha commit yo'qoladi. Hamma qatorni o'chirsangiz, rebase bekor qilinadi".
2.3 Hech narsani o'zgartirmasak
Faylni o'zgartirmay yopsak, Git hamma pick ni bajaradi:
Successfully rebased and updated refs/heads/feature/sharhlar.git log --oneline main..HEAD — aynan o'sha olti commit, SHA'lar ham o'sha. Commitlar allaqachon main uchida turgani uchun Git ularni qayta yaratmadi. Demak todo ro'yxatini ochib ko'rish xavfsiz.
3. Tozalash
3.1 Reja
Har commit uchun qaror qabul qilamiz:
| Commit | Qaror | Nega |
|---|---|---|
sharhlar sahifasi |
pick |
Asos — sahifaning o'zi |
wip |
squash |
Birinchi sharh — sahifa bilan bitta ish |
typo |
fixup |
Sarlavhadagi xato tuzatishi — xabari kerak emas |
ikkinchi |
reword |
Mazmuni to'g'ri, xabari yomon |
debug |
drop |
TEST TEST qatori saytga chiqmasin |
bosh sahifaga havola |
reword |
Xabarni qoidaga keltirish |
squash va fixup farqi: ikkalasi ham commitni oldingisiga qo'shadi. squash xabarlarni birlashtirib, sizga tahrirlashga beradi. fixup esa o'z xabarini jimgina tashlaydi — "typo" kabi xabar kimga kerak?
3.2 Ro'yxatni tahrirlash
Todo faylida faqat birinchi so'zlarni almashtiramiz. # dan keyingi qismni o'chirsak ham bo'ladi — Git SHA bo'yicha ishlaydi:
pick ed27468 sharhlar sahifasi
squash 2ceee85 wip
fixup 16af420 typo
reword 1a09aa4 ikkinchi
drop 3cfe2d5 debug
reword e547944 bosh sahifaga havolaFaylni saqlab (Ctrl + S), tabni yopamiz. Git ishni boshlaydi va kerakli joylarda to'xtab, sizdan xabar so'raydi.
3.3 squash xabari
Birinchi to'xtash — uch commit bitta bo'ldi, Git umumiy xabar so'raydi. VS Code'da ochilgan fayl:
# This is a combination of 3 commits.
# This is the 1st commit message:
sharhlar sahifasi
# This is the commit message #2:
wip
# The commit message #3 will be skipped:
# typo
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: Sat Oct 17 09:00:00 2026 +0500
#
# interactive rebase in progress; onto 0be6fbb
# Last commands done (3 commands done):
# squash 2ceee85 wip
# fixup 16af420 typo
# Next commands to do (3 remaining commands):
# reword 1a09aa4 ikkinchi
# drop 3cfe2d5 debug
# You are currently rebasing branch 'feature/sharhlar' on '0be6fbb'.
#
# Changes to be committed:
# new file: sharhlar/index.html
#Tarjimasi: "Bu — 3 ta commitning birikmasi. 1-commit xabari: ... 2-commit xabari: ... 3-commit xabari tashlab ketiladi: # typo". Ko'ryapsizmi: fixup qilingan typo xabari allaqachon # bilan izohga aylangan. Git uni hisobga olmaydi.
Butun faylni o'chirib, bitta yaxshi xabar yozamiz:
Sharhlar: sahifa va birinchi sharhni qo'shSaqlab yopamiz. Git davom etadi:
[detached HEAD 7334890] Sharhlar: sahifa va birinchi sharhni qo'sh
Date: Sat Oct 17 09:00:00 2026 +0500
1 file changed, 2 insertions(+)
create mode 100644 sharhlar/index.htmlDate: — yangi commit birinchi commitning muallif sanasini saqlab qoldi.
3.4 reword xabarlari
Keyingi to'xtash — ikkinchi commiti. Muharrirda birinchi qatorda eski xabar ikkinchi, pastda tanish izohlar. Uni Sharhlar: ikkinchi sharhni qo'sh ga almashtiramiz:
[detached HEAD 6b867e4] Sharhlar: ikkinchi sharhni qo'sh
Date: Sat Oct 17 09:15:00 2026 +0500
1 file changed, 1 insertion(+)debug — drop, Git uni to'xtamay tashlab ketadi. Oxirgi to'xtash — havola commiti, xabarini Bosh sahifa: sharhlar havolasini qo'sh qilamiz:
[detached HEAD 50b5117] Bosh sahifa: sharhlar havolasini qo'sh
Date: Sat Oct 17 09:25:00 2026 +0500
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/feature/sharhlar.(Oraliqdagi Rebasing (4/6) kabi yozuvlar terminalda bir-birining ustiga yozilib ketadi, ularni ko'rsatmadik.)
3.5 Natija
git log --oneline main..HEAD50b5117 (HEAD -> feature/sharhlar) Bosh sahifa: sharhlar havolasini qo'sh
6b867e4 Sharhlar: ikkinchi sharhni qo'sh
7334890 Sharhlar: sahifa va birinchi sharhni qo'shOlti commit o'rniga uchta. Har biri — bitta mantiqiy qadam, xabari aniq.
gitGraph
commit id: "0be6fbb main"
branch oldin
commit id: "ed27468 sahifasi"
commit id: "2ceee85 wip"
commit id: "16af420 typo"
commit id: "1a09aa4 ikkinchi"
commit id: "3cfe2d5 debug"
commit id: "e547944 havola"
checkout main
branch keyin
commit id: "7334890 sahifa+sharh"
commit id: "6b867e4 ikkinchi sharh"
commit id: "50b5117 havola"Nimaga qarang: bu ikki holatni yonma-yon ko'rsatish uchun chizilgan — oldin va keyin haqiqiy branch nomlari emas. Ikkalasi ham 0be6fbb dan o'sadi. Rebase'dan keyin feature/sharhlar pastki chiziqqa ko'chdi, yuqoridagi eski commitlarga esa endi hech kim ishora qilmaydi.
3.6 Nima o'zgardi — tekshirish
Tozalash fayllarni buzmaganiga ishonch hosil qilaylik. Eski uch ORIG_HEAD da (Rebase darsidan):
git log --oneline -1 ORIG_HEAD
git diff ORIG_HEAD HEADe547944 bosh sahifaga havola
diff --git a/sharhlar/index.html b/sharhlar/index.html
index 9c908b1..23e4203 100644
--- a/sharhlar/index.html
+++ b/sharhlar/index.html
@@ -1,4 +1,3 @@
<h1>Sharhlar</h1>
<p>«Osh zo'r!» — Malika</p>
<p>«Choy doim issiq» — Jasur</p>
-<p>TEST TEST</p>Eski va yangi uch orasidagi yagona farq — drop qilingan TEST TEST qatori. Aynan xohlaganimiz. Farq kutilmagan bo'lsa — git reset --hard ORIG_HEAD bilan hammasini qaytarish mumkin.
Maslahat: Har interaktiv rebase'dan keyin
git diff ORIG_HEAD HEAD— yaxshi odat. Bo'sh chiqsa, fayllar aynan avvalgidek, faqat tarix chiroyli bo'ldi.
Tekshirib ko'ring:
typocommitinifixupo'rnigasquashqilganimizda nima farq bo'lardi?
Javob
Fayllar bir xil bo'lardi. Faqat xabar muharririda typo qatori izoh emas, oddiy matn bo'lib chiqardi — uni qo'lda o'chirishga to'g'ri kelardi. fixup shu ishni o'zi qiladi.
4. Tartibni o'zgartirish va xato todo
4.1 Qatorlarni ko'chirish
Todo'dagi qatorlarni yuqoriga yoki pastga ko'chirsangiz, commitlar shu tartibda qo'llanadi. Bu squash/fixup bilan birga kerak bo'ladi: tuzatish commitini tuzatilayotgan commit ostiga olib kelish uchun. Faqat ehtiyot bo'ling: bir faylning qo'shni qatorlarini o'zgartirgan commitlarni almashtirsangiz, conflict chiqishi mumkin. Unda Rebase darsidagidek yechasiz: git add, git rebase --continue.
4.2 Birinchi qatorda squash
squash va fixup "oldingi commitga qo'sh" degani. Birinchi qatorda ulardan oldin hech narsa yo'q:
error: cannot 'squash' without a previous commit
You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.
Or you can abort the rebase with 'git rebase --abort'.Tarjimasi: "oldingi commitsiz squash qilib bo'lmaydi. Buni git rebase --edit-todo bilan tuzatib, git rebase --continue ni ishga tushirishingiz mumkin. Yoki rebase'ni git rebase --abort bilan bekor qiling". --edit-todo todo faylni qayta ochadi — birinchi qatorni pick qilasiz. Rebase to'xtab turgan bo'ladi, shuning uchun eng oddiy yo'l — git rebase --abort va boshidan.
5. edit: commitni ikkiga bo'lish
5.1 Muammo
Aziz shoshib bitta commitda ikki xil ishni qildi:
git commit -m "Bron va aloqa: ish vaqtini qo'sh"[feature/sharhlar df686eb] Bron va aloqa: ish vaqtini qo'sh
2 files changed, 2 insertions(+)Xabardagi "va" — atomar commit buzilganining belgisi. Ikki faylni ikki commitga ajratamiz.
5.2 edit bilan to'xtash
git rebase -i main va todo'da faqat oxirgi qatorni edit qilamiz:
pick 7334890 Sharhlar: sahifa va birinchi sharhni qo'sh
pick 6b867e4 Sharhlar: ikkinchi sharhni qo'sh
pick 50b5117 Bosh sahifa: sharhlar havolasini qo'sh
edit df686eb Bron va aloqa: ish vaqtini qo'shStopped at df686eb... Bron va aloqa: ish vaqtini qo'sh
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continueTarjimasi: "df686eb da to'xtaldi. Endi commitni git commit --amend bilan o'zgartirishingiz mumkin. Tayyor bo'lgach — git rebase --continue". Git commitni qo'llab, to'xtab turibdi.
5.3 Bo'lish
Commitni "bekor qilamiz", lekin o'zgarishlarni saqlaymiz. Reset darsidagi --mixed (standart) aynan shunday: commit yo'qoladi, o'zgarishlar ishchi papkada qoladi:
git reset HEAD^
git status -sUnstaged changes after reset:
M aloqa/index.html
M bron/index.html
M aloqa/index.html
M bron/index.htmlEndi ikkita alohida commit:
git add bron/index.html
git commit -m "Bron: ish boshlanish vaqtini qo'sh"
git add aloqa/index.html
git commit -m "Aloqa: ish vaqtini qo'sh"
git rebase --continue[detached HEAD df077fa] Bron: ish boshlanish vaqtini qo'sh
1 file changed, 1 insertion(+)
[detached HEAD c7c6cf7] Aloqa: ish vaqtini qo'sh
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/feature/sharhlar.git log --oneline main..HEADc7c6cf7 (HEAD -> feature/sharhlar) Aloqa: ish vaqtini qo'sh
df077fa Bron: ish boshlanish vaqtini qo'sh
50b5117 Bosh sahifa: sharhlar havolasini qo'sh
6b867e4 Sharhlar: ikkinchi sharhni qo'sh
7334890 Sharhlar: sahifa va birinchi sharhni qo'shBir commit ikkiga bo'lindi. edit da to'xtaganingizda istalgan ishni qilish mumkin: faylni tuzatib git commit --amend, yangi commit qo'shish yoki, bizdagidek, bo'lish.
Diqqat: Bir faylning ichidagi o'zgarishlarni ikkiga bo'lish kerak bo'lsa,
git addo'rnigagit add -pishlating — u o'zgarishlarni bo'lakma-bo'lak so'raydi (Yaxshi commit darsidan).
6. exec: har commitdan keyin tekshiruv
PR'dan oldin har bir commit o'zi alohida to'g'ri bo'lishi kerak. --exec har commitdan keyin buyruq ishga tushiradi. Masalan, git diff --check HEAD~1 HEAD — commitda qolib ketgan conflict markeri yoki qator oxiridagi ortiqcha bo'sh joyni qidiradi (Conflictlar darsidan):
git rebase -i --exec "git diff --check HEAD~1 HEAD" mainTodo'da har pick ostida exec qatori paydo bo'ladi:
pick 7334890 # Sharhlar: sahifa va birinchi sharhni qo'sh
exec git diff --check HEAD~1 HEAD
pick 6b867e4 # Sharhlar: ikkinchi sharhni qo'sh
exec git diff --check HEAD~1 HEAD
pick 50b5117 # Bosh sahifa: sharhlar havolasini qo'sh
exec git diff --check HEAD~1 HEAD
pick df077fa # Bron: ish boshlanish vaqtini qo'sh
exec git diff --check HEAD~1 HEAD
pick c7c6cf7 # Aloqa: ish vaqtini qo'sh
exec git diff --check HEAD~1 HEAD
...Faylni yopsak, har qadamda Executing: git diff --check HEAD~1 HEAD yozuvi chiqadi, oxirida esa Successfully rebased. Buyruq xato bilan tugasa (exit code 0 emas — Exit code darsidan), rebase o'sha joyda to'xtaydi va muammoli commitni ko'rsatadi.
Real loyihalarda bu yerga odatda testlar qo'yiladi: --exec "npm test" (testlarni kursda alohida o'rganamiz). Shunda "bu commitda testlar buzilgan" degan holat qolmaydi.
Nihoyat, tozalangan branch'ni main ga qo'shamiz — fast-forward:
git switch main
git merge feature/sharhlar
git branch -d feature/sharhlarUpdating 0be6fbb..c7c6cf7
Fast-forward
aloqa/index.html | 1 +
bron/index.html | 1 +
index.html | 1 +
sharhlar/index.html | 3 +++
4 files changed, 6 insertions(+)
create mode 100644 sharhlar/index.html
Deleted branch feature/sharhlar (was c7c6cf7).7. commit --fixup va --autosquash
7.1 Vaziyat
Tez-tez uchraydigan holat: siz bir necha commit qildingiz va oldingi commitlardan birida xato topdingiz. feature/bron-vaqt da ikki commit bor:
157b754 (HEAD -> feature/bron-vaqt) Bosh sahifa: bron havolasini qo'sh
3d18075 Bron: vaqt maydonini qo'shBirinchi commitdagi formada tipe="time" yozilgan — type bo'lishi kerak edi. Faylni tuzatdik. Oddiy commit qilsak, keyin qo'lda fixup qatorini ko'chirishga to'g'ri keladi. Git buni osonlashtiradi.
7.2 --fixup
git add bron/index.html
git commit --fixup 3d18075
git log --oneline main..HEAD[feature/bron-vaqt 91cdc3f] fixup! Bron: vaqt maydonini qo'sh
1 file changed, 1 insertion(+), 1 deletion(-)
91cdc3f (HEAD -> feature/bron-vaqt) fixup! Bron: vaqt maydonini qo'sh
157b754 Bosh sahifa: bron havolasini qo'sh
3d18075 Bron: vaqt maydonini qo'shGit xabarni o'zi yozdi: fixup! + tuzatilayotgan commitning xabari. Bu — belgi: "meni o'sha commitga qo'shing".
7.3 --autosquash
git rebase -i --autosquash mainTodo ochilganda ro'yxat allaqachon tayyor:
pick 3d18075 # Bron: vaqt maydonini qo'sh
fixup 91cdc3f # fixup! Bron: vaqt maydonini qo'sh
pick 157b754 # Bosh sahifa: bron havolasini qo'sh
...Tuzatish commiti o'z joyiga — tuzatilayotgan commit ostiga — ko'chirilgan va fixup qilingan. Sizga faqat faylni yopish qoladi:
git log --oneline main..HEAD
grep -n time bron/index.html8b9115d (HEAD -> feature/bron-vaqt) Bosh sahifa: bron havolasini qo'sh
8c861e6 Bron: vaqt maydonini qo'sh
5: <input name="vaqt" type="time">Tuzatish birinchi commit ichiga singib ketdi. Tarixda tipe xatosi hech qachon bo'lmagandek.
--autosquash ni har safar yozmaslik uchun:
git config --global rebase.autoSquash trueEndi har git rebase -i fixup! commitlarni o'zi joylaydi. Keyin git switch main, git merge feature/bron-vaqt — fast-forward.
Maslahat: Xabarni ham tuzatmoqchi bo'lsangiz —
git commit --fixup=reword:<sha>. Tuzatishning o'z xabarini saqlash kerak bo'lsa —git commit --squash <sha>(usquash!bilan boshlanadi). Ikkalasi ham--autosquashbilan ishlaydi.
Tekshirib ko'ring: Nega
--fixupga commit SHA'si beriladi, xabari emas?
Javob
SHA commitni aniq ko'rsatadi, Git esa undan xabarni o'zi oladi va fixup! <xabar> yozadi. --autosquash keyin shu xabar bo'yicha qaysi commit ostiga qo'yishni topadi. Shuning uchun tuzatilayotgan commitning xabarini rebase'gacha o'zgartirmang.
8. Oltin qoida yana bir bor
Interaktiv rebase — oddiy rebase'ning o'zi. U ham yangi SHA'lar yaratadi. Demak Rebase darsidagi qoida to'liq amal qiladi: faqat hali hech kimga bermagan commitlarni tozalang.
Amaliy tartib shunday:
- Branch'da erkin ishlang —
wip,typo,debugqo'rqinchli emas. - GitHub'ga yuborishdan va PR ochishdan oldin —
git rebase -i mainbilan tozalang. - PR ochilgach, reviewer izoh qoldirsa — tuzatishlarni
--fixupbilan qiling. - Tozalangan branch'ni qayta yuborish uchun maxsus xavfsiz push kerak — Ajralgan tarix darsida. PR bo'yicha to'liq jarayon — Pull Request va Yaxshi PR tayyorlash.
9. Ko'p uchraydigan xatolar
9.1 Todo'dagi qatorni o'chirib yuborish
"If you remove a line here THAT COMMIT WILL BE LOST" — yordam matni bejiz katta harf bilan yozmagan. Qatorni tasodifan o'chirsangiz, o'sha commit yangi tarixga tushmaydi. drop ham xuddi shunday, faqat niyatingiz aniq ko'rinadi — shuning uchun o'chirish o'rniga drop yozing. Adashsangiz: git reset --hard ORIG_HEAD, yoki Reflog darsidagi usullar.
9.2 Todo'ni bo'shatib yopish
Hamma qatorni o'chirsangiz, rebase bekor qilinadi — hech narsa o'zgarmaydi. Bu xavfli emas, faqat kutilmagan bo'lishi mumkin.
9.3 squash xabarini o'ylamasdan yopish
Muharrirda birlashgan xabar sharhlar sahifasi + wip holida qoladi — ikki qatorli, ma'nosiz xabar. Har squash dan keyin xabarni qayta yozing.
9.4 Muharrir ochilmaydi yoki "hint: Waiting for your editor"
core.editor sozlanmagan bo'lsa, Git Vim'ni ochadi (Vim darsida chiqishni o'rgangansiz). VS Code sozlangan bo'lsa, terminalda hint: Waiting for your editor to close the file... yozuvi turadi — Git tabni yopishingizni kutyapti. Tabni yopmaguningizcha rebase davom etmaydi.
9.5 main ni tozalash
main da turib git rebase -i HEAD~5 — umumiy tarixni qayta yozish. Oltin qoidaning eng og'ir buzilishi. Interaktiv rebase — faqat o'z feature branch'ingizda.
10. Mashqlar
1-mashq (oson): Buyruqni tanlang
Todo ro'yxatidagi har commit uchun to'g'ri buyruqni tanlang (pick, reword, squash, fixup, drop):
console.log qoldi— sinov qatori, saytga kerak emas.menyu— mazmuni to'g'ri, lekin xabari hech narsa demaydi.imlo— oldingi commitdagi so'z xatosini tuzatadi.Menyu: ichimliklar narxini qo'sh— yaxshi commit.
Yechim
drop— commit butunlay olib tashlanadi.reword— mazmun qoladi, xabarni qayta yozasiz.fixup— oldingi commitga qo'shiladi,imloxabari tashlanadi.pick— o'zgarishsiz.
2-mashq (o'rta): Bo'sh joylarni to'ldiring
Oxirgi commitdan oldingi commitda xato topildi. Uni avtomatik joylash bilan tuzating:
git log --oneline main..HEAD
# 7a1b2c3 Aloqa: xarita havolasini qo'sh
# 4d5e6f7 Aloqa: telefonni qo'sh <- shu yerda xato
# (faylni tuzatamiz)
git add aloqa/index.html
git commit 4d5e6f7
git rebase -i mainIshora: «commit --fixup va --autosquash» bo'limi. (SHA'lar misol uchun — sizda boshqacha bo'ladi.)
Yechim
git commit --fixup 4d5e6f7
git rebase -i --autosquash mainBirinchi buyruq fixup! Aloqa: telefonni qo'sh xabarli commit yaratadi. Ikkinchisi todo'da uni 4d5e6f7 ostiga fixup bilan qo'yadi — faylni yopish kifoya. rebase.autoSquash true sozlangan bo'lsa, --autosquash ni yozmasa ham bo'ladi.
3-mashq (qiyin): Uch commitni bittaga
Mashq mashqlar reposida, 07/19-interaktiv-rebase/ papkasida bo'ladi. Avval "chalkash" tarixni yarating:
cd ~/kurs/mashqlar
mkdir -p 07/19-interaktiv-rebase
cd 07/19-interaktiv-rebase
echo start > r.txt
git add r.txt
git commit -m "07/19: hisobot faylini qo'sh"
git switch -c feature/hisobot
echo "qator 1" >> r.txt
git commit -am "wip 1"
echo "qator 2" >> r.txt
git commit -am "wip 2"
echo "qator 3" >> r.txt
git commit -am "wip 3"Uchta wip commitni bitta commitga aylantiring, xabari: 07/19: hisobotga uch qatorni qo'sh. Fayl mazmuni o'zgarmasin. Oxirida branch'ni main ga fast-forward bilan qo'shib, o'chiring.
Ishora: birinchi commit xabarini o'zgartirish — reword; qolganlari o'z xabarisiz qo'shilsin — fixup.
Yechim
git rebase -i mainTodo'ni shunday tahrirlaysiz (SHA'lar sizda boshqacha):
reword 47d9a1b wip 1
fixup fdbf952 wip 2
fixup ee185b3 wip 3reword uchun muharrir ochiladi — wip 1 o'rniga 07/19: hisobotga uch qatorni qo'sh yozasiz. Biz sinab ko'rdik:
git log --oneline -2
cat r.txt9bfacb7 (HEAD -> feature/hisobot) 07/19: hisobotga uch qatorni qo'sh
21abd8c (main) 07/19: hisobot faylini qo'sh
start
qator 1
qator 2
qator 3Bitta commit, fayl esa uchala qator bilan. squash ishlatsangiz ham bo'lardi — faqat xabar muharririda uchala wip ni o'chirib, yangisini yozishga to'g'ri kelardi. Yakunda:
git switch main
git merge feature/hisobot
git branch -d feature/hisobotSwitched to branch 'main'
Updating 21abd8c..9bfacb7
Fast-forward
07/19-interaktiv-rebase/r.txt | 3 +++
1 file changed, 3 insertions(+)
Deleted branch feature/hisobot (was 9bfacb7).4-mashq: Portfolio qadami — PR'dan oldingi tozalash
Portfolio'da "Loyihalar" sahifasiga «Bahor» kartasini qo'shamiz — ataylab chalkash commitlar bilan — va GitHub'ga chiqishdan oldin tozalaymiz.
feature/bahor-kartasibranch'ini oching.- Kartani uch qadamda qo'shing va har qadamni "yomon" xabar bilan commit qiling:
wip(kartaning o'zi),wip 2(sarlavha),tavsif(qisqa tavsif). git rebase -i main: birinchisinireword, qolgan ikkitasinifixup. Xabar:Loyihalar: Bahor kartasini qo'sh.git diff ORIG_HEAD HEADbo'sh chiqishini tekshiring.mainga fast-forward bilan qo'shing va branch'ni o'chiring.
Yechim
cd ~/kurs/portfolio
git switch -c feature/bahor-kartasi
# 1-qadam: <article>Bahor</article>
git commit -am "wip"
# 2-qadam: sarlavha
git commit -am "wip 2"
# 3-qadam: tavsif
git commit -am "tavsif"
git rebase -i mainTodo:
reword 973f7ac wip
fixup b056ee5 wip 2
fixup 0446fdb tavsifQisqa sinov portfolio'sida natija:
[detached HEAD 7bc135a] Loyihalar: Bahor kartasini qo'sh
Date: Sat Oct 17 18:00:00 2026 +0500
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/feature/bahor-kartasi.7bc135a — reword paytidagi oraliq commit, keyingi ikki fixup unga qo'shilgach SHA yana o'zgaradi. Yakunda:
git diff ORIG_HEAD HEAD
git switch main
git merge feature/bahor-kartasi
git branch -d feature/bahor-kartasi
git log --oneline -3Updating b61fb7a..ea542a6
Fast-forward
sayt/loyihalar/index.html | 1 +
1 file changed, 1 insertion(+)
Deleted branch feature/bahor-kartasi (was ea542a6).
ea542a6 (HEAD -> main) Loyihalar: Bahor kartasini qo'sh
b61fb7a Loyihalar: landing havolasini qo'sh
cbc0687 404: tushuntirish matnini qo'shgit diff ORIG_HEAD HEAD hech narsa chiqarmadi — fayllar o'zgarmadi, faqat tarix uch commitdan bittaga qisqardi. Branch hali GitHub'da emas, shuning uchun tozalash xavfsiz edi.
11. Real ishda
- PR'dan oldingi odat. Ko'p jamoalarda "PR'da
wip,fix typocommitlari bo'lmasin" degan qoida bor. Interaktiv rebase — shu qoidani bajarish vositasi. - Review'dan keyin
--fixup. Reviewer "bu yerda nom noto'g'ri" desa, tuzatishgit commit --fixupbilan qilinadi. Merge'dan oldin--autosquashhammasini joyiga qo'yadi. - GitHub'dagi "Squash and merge" — PR'ning hamma commitlarini bitta commitga birlashtiradi. Bu interaktiv rebase'ning server tomondagi soddalashtirilgan varianti (Pull Request).
- Intervyuda so'raladi: "Bir nechta commitni qanday birlashtirasiz?", "
squashvafixupfarqi?" Bu dars ikkalasiga ham javob.
Xulosa
git rebase -i mainbranch commitlarini todo ro'yxatida ochadi: eng eskisi tepada, yuqoridan pastga bajariladi.pick— qoldirish,reword— xabarni o'zgartirish,squash/fixup— oldingisiga qo'shish,drop— o'chirish.editcommitda to'xtaydi:git reset HEAD^bilan uni bir necha commitga bo'lish mumkin.--exechar commitdan keyin tekshiruv ishga tushiradi; xato bo'lsa, rebase to'xtaydi.git commit --fixup <sha>+--autosquash(yokirebase.autoSquash true) tuzatishni o'zi joylaydi.- Natijani
git diff ORIG_HEAD HEADbilan tekshiring; faqat hali hech kimga bermagan commitlarni tozalang.
Keyingi dars: Stash: yarim ishni vaqtincha chetga olish — tugallanmagan ishni commit qilmasdan saqlab, boshqa branch'ga o'tishni o'rganamiz.
Manbalar
- Pro Git kitobi: "Git Tools — Rewriting History" — git-scm.com/book
- Git hujjati: "git-rebase" (INTERACTIVE MODE, SPLITTING COMMITS), "git-commit" (
--fixup,--squash) — git-scm.com/docs
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!