git diff — working directory, staging, commit lar orasida solishtirish
Muammodan boshlaylik
git status aytadi: modified: src/tolov.js. Lekin nima o'zgargan? Ikki soat ishladingiz, nimalarni o'zgartirganingizni eslay olmaysiz. Commit qilishdan oldin ko'rib chiqish kerak — tasodifiy console.log yoki o'chirilgan qator qolmadimi?
Yoki: kecha hammasi ishlardi, bugun yo'q. Kechagi commit va hozirgi holat orasida nima farq bor?
git diff — ikki holat orasidagi aniq farqni qator-ba-qator ko'rsatadi.
Diff ni o'qish
git diff
diff --git a/src/tolov.js b/src/tolov.js
index 3f2a1b4..8c9d0e2 100644
--- a/src/tolov.js
+++ b/src/tolov.js
@@ -12,8 +12,9 @@ export async function tolovQil(buyurtma) {
const summa = buyurtma.jami;
- if (summa > 0) {
+ if (summa > 0 && summa <= 50000000) {
const natija = await payme.yarat(summa);
+ console.log('DEBUG natija:', natija);
return natija.id;
}
- return null;
+ throw new Error("Noto'g'ri summa");
}
| Qism | Ma'nosi |
|---|---|
--- a/... |
Eski versiya |
+++ b/... |
Yangi versiya |
@@ -12,8 +12,9 @@ |
Joy: eski versiyada 12-qatordan 8 qator, yangisida 12-qatordan 9 qator |
- (qizil) |
O'chirilgan qator |
+ (yashil) |
Qo'shilgan qator |
| bo'shliq bilan | O'zgarmagan qator — kontekst uchun |
Qatordagi o'zgarish = eski qatorni o'chirish + yangisini qo'shish. Yuqorida — console.log ni ko'rdik: commit dan oldin olib tashlash kerak.
Nimani nima bilan solishtirish
6-darsdagi uch zona — diff ning uch asosiy shakli:
Working Directory Staging Area Oxirgi commit (HEAD)
│ │ │
└─── git diff ───────┘ │
└─ git diff --staged ┘
└──────────── git diff HEAD ──────────────┘
| Buyruq | Nimani ko'rsatadi |
|---|---|
git diff |
Working ↔ Staging: hali add qilinmagan o'zgarishlar |
git diff --staged |
Staging ↔ HEAD: commit ga kiradigan o'zgarishlar |
git diff HEAD |
Working ↔ HEAD: oxirgi commit dan beri hammasi |
[!INFO] Ko'p yangi boshlovchilar
git adddan keyingit diffqilib, "bo'sh!" deb hayron qoladi. Chunki staging ga qo'yilgan o'zgarishlar endigit diff --stagedda (--cached— xuddi shu).
Commit dan oldin — eng muhim odat
git add .
git diff --staged # nima commit qilinayotganini ko'rib chiqish
git commit -m "..."
O'z kodingizni bir marta ko'rib chiqish — debug qatorlarini, tasodifiy o'chirishlarni, unutilgan TODO larni ushlaydi.
Commitlar va branch lar orasida
git diff a3f9c2b 7b2e9c4 # ikki commit orasida
git diff HEAD~3 HEAD # oxirgi 3 commit dagi barcha o'zgarishlar
git diff HEAD~1 # oldingi commit ↔ hozirgi working directory
git diff main feature/tolov # ikki branch orasida
git diff main...feature/tolov # feature/tolov da main dan ajralgandan beri nima qilingan
Uch nuqta ... — branch lar bilan ishlashda muhim (15-dars): "ajralish nuqtasidan beri faqat shu branch dagi o'zgarishlar". Pull Request da GitHub aynan shuni ko'rsatadi.
Faqat ma'lum fayl yoki papka
git diff src/tolov.js
git diff HEAD~5 -- src/
git diff main feature/tolov -- package.json
Qisqa ko'rinishlar
git diff --stat
src/tolov.js | 6 ++++--
src/savat.js | 14 ++++++++++++++
tests/tolov.test.js | 22 ++++++++++++++++++++++
3 files changed, 40 insertions(+), 2 deletions(-)
git diff --name-only # faqat fayl nomlari
git diff --name-status # + holat: M (o'zgargan), A (yangi), D (o'chirilgan)
So'z darajasida
Matn, Markdown, uzun qatorlar uchun — qator emas, so'z bo'yicha:
git diff --word-diff
Narx [-120 000-]{+135 000+} so'm
Bo'shliq o'zgarishlari
Muharrir formatlash qildi — diff da yuzlab "o'zgargan" qator, aslida faqat bo'shliqlar:
git diff -w # bo'shliq o'zgarishlarini e'tiborsiz qoldirish
Vizual vositalar
Terminal diff i kichik o'zgarishlar uchun yaxshi. Kattalari uchun:
- VS Code — Source Control panelida faylni bosing: yonma-yon ko'rinish. Har qanday ikki commit uchun — GitLens kengaytmasi
- GitHub — Pull Request ning "Files changed" bo'limi; ikki commit/branch:
github.com/user/repo/compare/main...feature - difftool — tashqi dasturda:
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
git difftool HEAD~1
Chiroyliroq terminal diff
delta — sintaksis ranglari va yonma-yon ko'rinish bilan:
# o'rnatilgandan keyin
git config --global core.pager delta
git config --global delta.side-by-side true
Patch — o'zgarishni fayl sifatida
Diff ni faylga saqlab, boshqa joyda qo'llash mumkin:
git diff > tuzatish.patch
# ... boshqa nusxada:
git apply tuzatish.patch
Git dan oldingi davrda va hozir ham ba'zi loyihalarda (Linux yadrosi) o'zgarishlar shunday — pochta orqali patch sifatida yuboriladi.
Nima uchun shunday?
Nima uchun Git fayllarning to'liq suratlarini saqlaydi (1-dars), lekin bizga farqlarni ko'rsatadi?
Chunki odam uchun "nima o'zgardi" — "hammasi qanday" dan ancha muhimroq. 500 qatorli faylda bitta qator o'zgargan bo'lsa, siz 500 qatorni emas, o'sha bittani ko'rishni xohlaysiz. Diff — inson diqqatini o'zgarishga qaratadi. Shuning uchun butun dasturchilik madaniyati diff atrofida qurilgan: code review — bu diff ni o'qish; Pull Request — bu diff ni muhokama qilish; yaxshi commit — bu o'qish oson bo'lgan kichik diff. Kichik, toza diff lar — tez review, kam xato.
Xulosa
Eslab qoling:
-o'chirilgan,+qo'shilgan;@@— joygit diff— add qilinmaganlar;git diff --staged— commit ga kiradiganlar;git diff HEAD— hammasi- Commit dan oldin:
git diff --staged git diff A B— ikki commit/branch;main...feature— branch dagi o'zgarishlar-- fayl— faqat shu fayl;--stat,--name-only— qisqa--word-diff— so'z bo'yicha;-w— bo'shliqlarsiz- Katta diff lar — VS Code, GitHub compare, delta
Keyingi dars
11-dars: .gitignore — qaysi fayllarni kuzatmaslik, shablonlar, global gitignore