git diff — working directory, staging, commit lar orasida solishtirish

~15 daq · Git · Git Asoslari

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 add dan keyin git diff qilib, "bo'sh!" deb hayron qoladi. Chunki staging ga qo'yilgan o'zgarishlar endi git diff --staged da (--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; @@ — joy
  • git 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