IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari7/36-dars19 daqiqa
Mundarija (34)

Git diff: o'zgarishlarni ko'rish, --staged va commitlar orasidagi farq

Qisqacha: git diff "nima o'zgardi?" savoliga qatorma-qator javob beradi: - — olib tashlangan, + — qo'shilgan qator. Oddiy git diff — ishchi papka va staging orasidagi farq, git diff --staged — staging va oxirgi commit orasidagi, ya'ni commitga aynan nima ketishi. git diff A B ikki commitni solishtiradi. --word-diff so'z darajasida, --stat va --name-only esa qisqa ro'yxat ko'rsatadi.

Bu darsda

  • Diff natijasining har qatorini — sarlavha, @@ bo'lak boshi, + va - — o'qiysiz.
  • git diff, git diff --staged va git diff HEAD qaysi hududlarni solishtirishini ajratasiz.
  • Ikki commit orasidagi farqni ko'rasiz va .. hamda ... yozuvlari nimani bildirishini bilasiz.
  • --word-diff, --stat, --name-only bilan farqni qulay ko'rinishga keltirasiz.
  • Farqni VS Code'da ochishni sozlaysiz.

Oldin bilishingiz kerak: Tarixni o'qish: git log, Uch hudud.

1. Nega bu kerak?

Oldingi darsda git log -p bilan o'tgan commitlarning farqini ko'rdik. Endi savol boshqa: hali commit qilinmagan o'zgarishlarim qanday? Commit qilishdan oldin nima ketayotganini qanday tekshiraman?

git status faqat qaysi fayl o'zgarganini aytadi. Fayl ichida nima o'zgargani — bitta harfmi yoki yuz qatormi — noma'lum. Shu sababli xatolar commitga tushib qoladi: tasodifan o'chirilgan qator, sinash uchun qoldirilgan matn, noto'g'ri narx.

Jasur aka telefon qildi: "Osh narxini 38 000 qiling, bron sahifasiga esa 2 soat oldin bron qilish qoidasini yozing". Aziz ikkalasini bajardi. Commitdan oldin u aniq nima o'zgarganini ko'rmoqchi. Bu ishni git diff qiladi.

Uch hudud darsida qutini muhrlashdan oldin "ichiga qaraysiz" degan edik — git status va git diff --staged bilan. Bugun ikkinchi vositani o'rganamiz. Tajribali dasturchilar commitdan oldin farqqa qarashni refleksga aylantiradi.

2. Birinchi git diff

2.1 Natija

Ikki o'zgarishdan keyin:

bash
git status -s
text
 M bron/index.html
 M menyu/index.html

Ikkala fayl stolda, qutida hech narsa yo'q. Farqni ko'ramiz:

bash
git diff
text
warning: in the working copy of 'bron/index.html', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'menyu/index.html', LF will be replaced by CRLF the next time Git touches it
diff --git a/bron/index.html b/bron/index.html
index 72dee2c..56318a4 100644
--- a/bron/index.html
+++ b/bron/index.html
@@ -1,2 +1,3 @@
 <h1>Stol band qilish</h1>
 <p>Telefon: +998 90 000 00 00</p>
+<p>Bron kamida 2 soat oldin qilinadi.</p>
diff --git a/menyu/index.html b/menyu/index.html
index a874f85..866271a 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -1,4 +1,4 @@
 <h1>Bahor menyusi</h1>
-<p>Osh — 35 000 so'm</p>
+<p>Osh — 38 000 so'm</p>
 <p>Lag'mon — 30 000 so'm</p>
 <p>Manti — 30 000 so'm</p>

Boshidagi ikki warning — tanish CRLF ogohlantirishi. Git farqni hisoblash uchun fayllarni o'qidi va yana eslatdi. Keyingi misollarda bu qatorlarni tashlab ketamiz.

Natija ikki bo'limdan iborat — har o'zgargan fayl uchun bittadan. Fayllar alifbo tartibida: avval bron, keyin menyu.

2.2 Sarlavha qatorlari

Menyu bo'limini qatorma-qator o'qiymiz:

Qator Ma'nosi
diff --git a/menyu/... b/menyu/... Solishtirilayotgan fayl: a — eski, b — yangi
index a874f85..866271a 100644 Eski va yangi mazmunning qisqa ID'lari, fayl turi
--- a/menyu/index.html - belgili qatorlar eski versiyadan
+++ b/menyu/index.html + belgili qatorlar yangi versiyadan

a/ va b/ — haqiqiy papkalar emas, "chap tomon" va "o'ng tomon" belgisi. index qatoridagi ID'lar commit SHA'lari emas — bu faylning o'z mazmuni uchun ID. Ular qanday hisoblanishini Git ichkaridan darsida ko'rasiz. 100644 — "oddiy fayl" (Birinchi repo darsidagi create mode 100644).

2.3 Bo'lak: @@ -1,4 +1,4 @@

Bo'lak (hunk) — Yaxshi commit darsida git add -p bilan ko'rgan o'sha narsa: o'zgargan qatorlar va ularning atrofi. Bo'lak boshidagi @@ qatori — uning manzili:

  • -1,4 — eski versiyada: 1-qatordan boshlab 4 qator.
  • +1,4 — yangi versiyada: 1-qatordan boshlab 4 qator.

Bron bo'limida @@ -1,2 +1,3 @@ edi: eski versiyada 2 qator, yangisida 3 — bitta qator qo'shilgan. Qatorlar soni farqi darhol ko'rinadi.

Bo'lak ichida uch xil qator bor:

  • (bo'sh joy) bilan — kontekst: o'zgarmagan qator. U "o'zgarish qayerda" ekanini ko'rsatish uchun. Git standart holatda o'zgarishning tepasi va pastidan 3 tagacha kontekst qatori qo'shadi.
  • - bilan — eski versiyada bor, yangisida yo'q.
  • + bilan — yangisida bor, eskisida yo'q.

Osh narxidagi o'zgarish - va + juftligi bo'lib ko'rinadi. Git qator ichidagi bitta raqamni emas, butun qatorni almashtirilgan deb ko'radi. Terminalingizda - qatorlar odatda qizil, + qatorlar yashil — rang o'qishni ancha osonlashtiradi.

flowchart TB
  H["diff --git a/... b/...<br/>qaysi fayl"] --> I["--- a/ va +++ b/<br/>eski va yangi"]
  I --> B["@@ -1,4 +1,4 @@<br/>bo'lak manzili"]
  B --> L["' ' kontekst<br/>'-' eski · '+' yangi"]

Nimaga qarang: tepadan pastga — umumiydan xususiyga. Avval fayl, keyin versiyalar, keyin bo'lak manzili, eng pastda qatorlarning o'zi. Diff'ni o'qishni aynan shu tartibda o'rganing.

Tekshirib ko'ring: Bo'lak boshi @@ -10,3 +10,5 @@. Nechta qator qo'shilgan bo'lishi mumkin va nega "mumkin" deymiz?

Javob

Qatorlar soni 3 dan 5 ga oshgan — farq 2. Eng oddiy holat: 2 qator qo'shilgan. Lekin, masalan, 1 qator o'chirilib, 3 qator qo'shilgan bo'lishi ham mumkin — farq baribir 2. Aniq bilish uchun bo'lak ichidagi - va + qatorlarni sanash kerak.

3. Uch hudud — uch xil diff

3.1 Qutiga solgandan keyin git diff bo'shaydi

Menyuni qutiga solamiz va yana git diff yozamiz. --name-only — faqat fayl nomlari:

bash
git add menyu/index.html
git diff --name-only
text
bron/index.html

Menyu yo'qoldi! Boshlovchilar shu yerda qo'rqib ketadi: "o'zgarishim o'chib ketdimi?" Yo'q. Oddiy git diff — ishchi papka va staging orasidagi farq. Menyuni qutiga solgach, stoldagi va qutidagi versiya bir xil bo'ldi — farq yo'q.

Qutidagi o'zgarishni ko'rish uchun --staged kerak:

bash
git diff --staged
text
diff --git a/menyu/index.html b/menyu/index.html
index a874f85..866271a 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -1,4 +1,4 @@
 <h1>Bahor menyusi</h1>
-<p>Osh — 35 000 so'm</p>
+<p>Osh — 38 000 so'm</p>
 <p>Lag'mon — 30 000 so'm</p>
 <p>Manti — 30 000 so'm</p>

git diff --staged — staging va oxirgi commit orasidagi farq, ya'ni git commit yozsangiz aynan nima ketishi. --cached — uning eski nomi, ikkalasi bir xil ishlaydi. Eski qo'llanmalarda --cached ni ko'p uchratasiz.

3.2 Uch versiya, uch javob

Endi qiziq holat. Menyu qutida (38 000). Shu payt Jasur aka yana qo'ng'iroq qildi: "38 emas, 37 000 bo'lsin". Aziz faylni VS Code'da yana o'zgartirdi — qutiga solmasdan:

bash
git status -s
text
 M bron/index.html
MM menyu/index.html

MM — bitta fayl ikki holatda. Endi menyuning uchta versiyasi bor: commitda 35 000, qutida 38 000, stolda 37 000. Har diff o'z juftligini solishtiradi. Farqni aniq ko'rish uchun --word-diff ishlatamiz (u haqida pastroqda):

bash
git diff --word-diff -- menyu/index.html
text
...
<p>Osh — [-38-]{+37+} 000 so'm</p>
...
bash
git diff --staged --word-diff -- menyu/index.html
text
...
<p>Osh — [-35-]{+38+} 000 so'm</p>
...
bash
git diff HEAD --word-diff -- menyu/index.html
text
...
<p>Osh — [-35-]{+37+} 000 so'm</p>
...

Sarlavha va kontekst qatorlarini ... bilan qisqartirdik. -- menyu/index.html — git log dagi kabi: faqat shu fayl.

Buyruq Nimani solishtiradi Natija
git diff staging → ishchi papka 38 → 37
git diff --staged oxirgi commit → staging 35 → 38
git diff HEAD oxirgi commit → ishchi papka 35 → 37
flowchart LR
  R["Repository<br/>(HEAD): 35"] -- "git diff --staged" --> S["Staging:<br/>38"]
  S -- "git diff" --> W["Ishchi papka:<br/>37"]
  R -. "git diff HEAD" .-> W

Nimaga qarang: har strelka — bitta diff buyrug'i, u strelka boshidagi versiyani oxiridagisi bilan solishtiradi. Punktir strelka staging'dan "sakrab o'tadi": git diff HEAD qutiga qaramaydi, commit va stolni to'g'ridan-to'g'ri solishtiradi.

Endi 37 000 ni qutiga solib, commit qilamiz. Keyin bron — alohida commit (atomar commit):

bash
git add menyu/index.html
git commit -m "Menyu: osh narxini 37 000 so'mga ko'tar"
git add bron/index.html
git commit -m "Bron: 2 soat oldin qilish qoidasini yoz"
text
[main e3e247b] Menyu: osh narxini 37 000 so'mga ko'tar
 1 file changed, 1 insertion(+), 1 deletion(-)
[main 74b46a2] Bron: 2 soat oldin qilish qoidasini yoz
 1 file changed, 1 insertion(+)

Commitdan keyin git diff ham, git diff --staged ham bo'sh — uchala hudud bir xil.

Tekshirib ko'ring: git add . qildingiz va darhol git diff yozdingiz — hech narsa chiqmadi. Commitga nima ketishini qaysi buyruq ko'rsatadi?

Javob

git diff --staged. Oddiy git diff stol va qutini solishtiradi — git add . dan keyin ular bir xil, shuning uchun bo'sh. Commit esa qutidan oxirgi commitga nisbatan yaratiladi, buni --staged ko'rsatadi.

4. Qisqa va aniq ko'rinishlar

4.1 --stat, --name-only, --name-status

Katta o'zgarishda to'liq farq yuzlab qator bo'ladi. Avval umumiy manzara kerak. Ikkala o'zgarish hali stolda bo'lgan paytga qaytsak:

bash
git diff --stat
text
 bron/index.html  | 1 +
 menyu/index.html | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

git log --stat dagi ko'rinishning o'zi. Yana ikki qisqa shakl:

bash
git diff --name-status
text
M	bron/index.html
M	menyu/index.html

--name-only faqat nomlarni, --name-status esa nom oldida harf bilan chiqaradi: M — o'zgargan, A — qo'shilgan, D — o'chirilgan, R — nomi o'zgargan. git status -s harflariga o'xshaydi, lekin bitta ustunli.

4.2 --word-diff — so'z darajasida

Narx o'zgarishida butun qator - va + bo'lib ko'rinadi — qaysi raqam o'zgarganini ko'z bilan qidirish kerak. Uzun qatorda (masalan, matn paragrafida) bu juda noqulay. --word-diff faqat o'zgargan so'zlarni belgilaydi:

bash
git diff --word-diff -- menyu/index.html
text
diff --git a/menyu/index.html b/menyu/index.html
index a874f85..866271a 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -1,4 +1,4 @@
<h1>Bahor menyusi</h1>
<p>Osh — [-35-]{+38+} 000 so'm</p>
<p>Lag'mon — 30 000 so'm</p>
<p>Manti — 30 000 so'm</p>

[-35-] — olib tashlangan so'z, {+38+} — qo'shilgan so'z. Qatorlar oldida endi +/- belgisi yo'q.

"So'z" deganda Git bo'sh joy bilan ajratilgan bo'lakni tushunadi. Shuning uchun 35 000 da faqat 35 o'zgardi. HTML'da esa teg ham so'zga yopishib qoladi. Sarlavhani o'zgartirsak, natija bunday:

text
[-<h1>Stol-]{+<h1>Stolni oldindan+} band [-qilish</h1>-]{+qiling</h1>+}

Baribir oddiy diff'dan tushunarliroq. Terminalda rang bilan ko'rish uchun --color-words ham bor — u qavslar o'rniga faqat rang ishlatadi.

Maslahat: --word-diff matnli fayllar uchun ayniqsa foydali: README, maqola, tarjima. Bitta vergul o'zgargan paragrafda oddiy diff butun paragrafni ikki marta ko'rsatadi, --word-diff esa faqat vergulni.

4.3 Ko'rinmas xatolar: --check va kontekst: -U

Qator oxirida qolib ketgan bo'sh joylar ko'zga ko'rinmaydi, lekin diff'ni "iflos" qiladi. Sinov nusxasida somsa qatorini oxirida uchta bo'sh joy bilan qo'shdik va tekshirdik:

bash
git diff --check
text
menyu/index.html:5: trailing whitespace.
+<p>Somsa — 8 000 so'm</p>   

Tarjimasi: "menyu/index.html, 5-qator: qator oxirida bo'sh joy". --check farqni ko'rsatmaydi — faqat shunday nuqsonlarni qidiradi. Topsa, exit code 0 emas (bizda 2) bo'ladi. Shuning uchun uni avtomatik tekshiruvlarda ham ishlatish mumkin.

Kontekst qatorlari sonini -U (--unified) o'zgartiradi. -U1 — faqat bitta qator:

bash
git diff -U1
text
diff --git a/menyu/index.html b/menyu/index.html
index 1058085..821c9dd 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -4 +4,2 @@
 <p>Manti — 30 000 so'm</p>
+<p>Somsa — 8 000 so'm</p>   

@@ -4 +4,2 @@ — yangi shakl: son bitta qator bo'lsa, Git ,1 ni yozmaydi. -4 — "eski versiyaning 4-qatori" (bitta qator). Ko'proq kontekst kerak bo'lsa, masalan -U10: o'zgarish atrofidagi kodni tushunish osonlashadi.

Tekshirib ko'ring: Yuz fayl o'zgargan katta commitni ko'rib chiqishingiz kerak. Qaysi tartibda qaraysiz: --stat, --name-only yoki to'liq diff?

Javob

Avval --stat yoki --name-only — umumiy manzara: qaysi fayllar va qanchalik ko'p o'zgargan. Keyin faqat kerakli fayllarning to'liq farqi: git diff ... -- <fayl>. Yuz faylning to'liq diff'ini boshidan o'qish — vaqtni behuda sarflash. Ro'yxatda kutilmagan fayl (masalan .DS_Store) ham shu bosqichda ko'zga tashlanadi.

5. Commitlar orasidagi farq

5.1 git diff A B

git diff ga ikki commit bersangiz, ularni solishtiradi. Chapdagisi — "eski", o'ngdagisi — "yangi":

bash
git diff e979a8e HEAD -- menyu/index.html
text
diff --git a/menyu/index.html b/menyu/index.html
index e4f0bdb..1058085 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -1,4 +1,4 @@
 <h1>Bahor menyusi</h1>
-<p>Osh — 35 000 so'm</p>
-<p>Lag'mon — 28 000 so'm</p>
+<p>Osh — 37 000 so'm</p>
+<p>Lag'mon — 30 000 so'm</p>
 <p>Manti — 30 000 so'm</p>

e979a8e — sarlavha o'zgargan commit (3-oktabr). Shundan beri menyuda ikki narx o'zgargan. Ular ikki alohida commitda qilingan, lekin diff umumiy natijani ko'rsatadi: "o'shanda qanday edi — hozir qanday". Oradagi har bir commitni alohida ko'rish kerak bo'lsa — git log -p.

git log dagi nisbiy nomlar bu yerda ham ishlaydi:

bash
git diff HEAD~2 HEAD --stat
text
 bron/index.html  | 1 +
 menyu/index.html | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

Oxirgi ikki commit birgalikda. Bitta commit bersangiz (git diff dab5bff), u shu commitni ishchi papka bilan solishtiradi.

5.2 Tartib muhim

Commitlarni almashtirib yozsak:

bash
git diff HEAD HEAD~2 --stat
text
 bron/index.html  | 1 -
 menyu/index.html | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)

Endi bron qatori "o'chirilgan" (-) bo'lib chiqdi. Git xato qilmadi: biz "HEAD dan HEAD~2 ga borsak nima o'zgaradi?" deb so'radik. Qoida: avval eski, keyin yangi.

5.3 Ikki nuqta .. va uch nuqta ...

Git'da commitlar orasiga nuqta qo'yib yozish mumkin. Bu yozuvni tez-tez uchratasiz, shuning uchun ma'nosini bilib qo'ying:

  • git diff A..B — git diff A B bilan aynan bir xil. Nuqtalar shunchaki "dan-gacha" degan belgi.
  • git diff A...B — "A va B ning umumiy ajdodidan B gacha". Tarix bitta chiziq bo'lsa, umumiy ajdod — eskirog'ining o'zi, ya'ni natija A..B bilan bir xil.

Uch nuqtaning haqiqiy ma'nosi tarix ikkiga ajralganda ochiladi: "bu branch umumiy nuqtadan beri nima qo'shdi?" Buni Branch nima va Merge darslarida ko'rasiz.

Ehtiyot bo'ling: git log da .. boshqacha ishlaydi. git log A..B — "B da bor, A da yo'q commitlar ro'yxati":

bash
git log --oneline HEAD~2..HEAD
text
74b46a2 (HEAD -> main) Bron: 2 soat oldin qilish qoidasini yoz
e3e247b Menyu: osh narxini 37 000 so'mga ko'tar

diff — ikki holat orasidagi farq, log — ular orasidagi commitlar. git log darsidagi v1.0..HEAD misoli aynan shu.

Tekshirib ko'ring: git diff HEAD~1 (bitta commit bilan) nima bilan nimani solishtiradi?

Javob

HEAD~1 commitini ishchi papka bilan. Ya'ni oxirgi commitdagi o'zgarish va hali commit qilinmagan o'zgarishlar birgalikda ko'rinadi. Faqat ikki commitni solishtirish kerak bo'lsa, ikkalasini ham yozing: git diff HEAD~1 HEAD.

6. VS Code'da farqni ko'rish

6.1 Source Control paneli

Terminaldagi diff — universal, lekin VS Code'da farqni yonma-yon ko'rish qulayroq. Source Control panelida (Uch hudud darsidagi bo'lim) o'zgargan fayl ustiga bosing: chapda eski versiya, o'ngda yangisi ochiladi. O'chirilgan qatorlar qizil, qo'shilganlari yashil fonda. Qator ichida aynan qaysi belgilar o'zgargani ham alohida belgilanadi — --word-diff ga o'xshab.

6.2 git difftool

git difftool — git diff ning o'zi, faqat natijani tashqi dasturda ochadi. Uni VS Code bilan ishlatish uchun bitta sozlama kifoya — Git 2.54 vscode ni tanigan vositalar ro'yxatida biladi:

bash
git config --global diff.tool vscode
git difftool
text

Viewing (1/1): 'menyu/index.html'
Launch 'vscode' [Y/n]?

Tarjimasi: "Ko'rilmoqda (1 dan 1-si): menyu/index.html. vscode ishga tushirilsinmi? [Ha/yo'q]". Enter yoki y bosing — fayl VS Code'da yonma-yon ochiladi. Oynani yopsangiz, Git keyingi faylga o'tadi. Har safar so'ramasligi uchun: git difftool -y yoki git config --global difftool.prompt false.

Git tanigan hamma vositalar ro'yxati: git difftool --tool-help. git difftool ham git diff flaglarini tushunadi: git difftool --staged, git difftool HEAD~1 HEAD.

7. Ko'p uchraydigan xatolar

7.1 "git diff hech narsa ko'rsatmayapti"

Uchta sabab bo'lishi mumkin:

  1. O'zgarish qutida. «Uch hudud — uch xil diff» bo'limini eslang: git diff --staged ishlating.
  2. Hamma narsa commit qilingan. git status working tree clean desa — farq yo'q.
  3. Fayl yangi (untracked). Buni alohida ko'raylik.

7.2 Yangi fayl diff'da ko'rinmaydi

bash
echo '<h1>Tadbirlar</h1>' > tadbirlar.html
git status -s
git diff --stat
text
?? tadbirlar.html

git status faylni ko'radi, git diff esa jim. Sababi: git diff faqat Git taniydigan fayllarni solishtiradi. Yangi faylning "eski versiyasi" yo'q — solishtiradigan narsa yo'q. Ikki yo'l bor:

  • Faylni git add qiling va git diff --staged bilan ko'ring.
  • Yoki git add -N tadbirlar.html (--intent-to-add, "qo'shish niyati"): Git faylni taniydi, lekin mazmunini hali qutiga solmaydi. Shundan keyin git diff uni ko'rsatadi:
text
 tadbirlar.html | 1 +
 1 file changed, 1 insertion(+)

7.3 \ No newline at end of file

text
@@ -2,3 +2,4 @@
 <p>Osh — 37 000 so'm</p>
 <p>Lag'mon — 30 000 so'm</p>
 <p>Manti — 30 000 so'm</p>
+<p>Somsa — 8 000 so'm</p>
\ No newline at end of file

Tarjimasi: "Fayl oxirida yangi qator belgisi yo'q". Bu qatorni sinov nusxasida echo o'rniga printf bilan (oxiriga \n qo'ymasdan) yozib hosil qildik. Xato emas, lekin kichik nuqson: POSIX qoidasiga ko'ra matnli faylning har qatori, oxirgisi ham, qator oxiri belgisi bilan tugashi kerak (Qator oxiri). Keyingi odam faylga qator qo'shsa, diff'da sizning oxirgi qatoringiz ham "o'zgargan" bo'lib chiqadi.

Tuzatish: fayl oxirida bo'sh qator qoldiring. VS Code'da buni files.insertFinalNewline sozlamasi avtomatik qiladi. Prettier ham har faylni yangi qator bilan tugatadi.

7.4 Tartib almashgan

git diff HEAD HEAD~2 — qo'shilgan qatorlar "o'chirilgan" bo'lib ko'rinadi. «Tartib muhim» bo'limidagi qoida: avval eski, keyin yangi.

7.5 Sahifalagich

Uzun farq ham git log kabi sahifalagichda ochiladi — q bilan chiqasiz.

8. Mashqlar

1-mashq (oson): Diff'ni o'qing

text
@@ -1,3 +1,3 @@
 <h1>Stol band qilish</h1>
-<p>Telefon: +998 90 000 00 00</p>
+<p>Telefon: +998 90 000 00 01</p>
 <p>Bron kamida 2 soat oldin qilinadi.</p>
  1. Nechta qator o'zgargan?
  2. Qaysi qatorlar kontekst?
  3. git diff --stat bu fayl uchun qanday belgi ko'rsatadi?

Ishora: «Bo'lak» bo'limidagi uch xil qator va «Qisqa va aniq ko'rinishlar» dagi --stat.

Yechim
  1. Bitta qator — telefon raqami almashtirilgan: bitta -, bitta +.
  2. <h1> va "2 soat" qatorlari — bo'sh joy bilan boshlangan.
  3. | 2 +- — ikki qator o'zgargan: bittasi qo'shilgan, bittasi o'chirilgan. Git uchun "almashtirish" — shu juftlik.

2-mashq (o'rta): To'g'ri buyruqni tanlang

«Bahor» sinov nusxasida siz menyuga somsa qo'shdingiz va qutiga soldingiz, bron sarlavhasini esa o'zgartirdingiz, lekin qutiga solmadingiz. Bo'sh joylarni to'ldiring:

  • Faqat bron o'zgarishini ko'rsatish: git
  • Faqat somsani ko'rsatish: git diff
  • Ikkalasini birga, oxirgi commitga nisbatan: git diff

Ishora: «Uch versiya, uch javob» jadvali.

Yechim

git diff — stol va quti: faqat bron. git diff --staged — quti va commit: faqat somsa. git diff HEAD — stol va commit: ikkalasi. Biz sinov nusxasida --name-only bilan tekshirdik:

bash
git diff --name-only
text
bron/index.html
bash
git diff --staged --name-only
text
menyu/index.html

3-mashq (qiyin): Aloqa sahifasidan beri

«Bahor»da aloqa sahifasi qo'shilgan commit — b09fa2a. Shundan beri:

  1. Qaysi fayllar o'zgargan? Bitta buyruq bilan faqat nomlarini chiqaring.
  2. Ro'yxatda sizni ajablantiradigan fayl bormi?
  3. Shu davrdagi commitlar ro'yxatini chiqaring. Nega bu buyruq diff emas, log?

Ishora: git diff A B --name-only; git log A..B.

Yechim
  1. git diff b09fa2a HEAD --name-only:
text
assets/css/.DS_Store
assets/css/asosiy.css
assets/images/logo.svg
bron/index.html
bron/rahmat.html
index.html
menyu/index.html
  1. assets/css/.DS_Store — Malika tasodifan qo'shgan macOS fayli (git log darsida --stat orqali topgan edik). Uni keyingi darsda tozalaymiz.
  2. git log --oneline b09fa2a..HEAD — b09fa2a dan keyingi commitlar. diff bitta umumiy farq beradi va qaysi commitda nima qilinganini aytmaydi. "Nima qilindi, ketma-ket" degan savolga log javob beradi.

4-mashq: Portfolio qadami — rangni o'zgartirib, farqni ko'ring

  1. kurs/portfolio/sayt/assets/css/asosiy.css da bitta rangni o'zgartiring (masalan, asosiy brend rangini biroz to'qroq qiling). Faylni saqlang.
  2. git status -s, keyin git diff va git diff --word-diff ni solishtiring. Qaysi biri o'zgarishni aniqroq ko'rsatadi?
  3. Faylni qutiga soling. git diff endi nima ko'rsatadi? Commitga nima ketishini ko'rsating.
  4. Commit qiling (xabar — Yaxshi commit qoidasi bo'yicha). git diff HEAD~1 HEAD --stat bilan tekshiring.
  5. Ixtiyoriy: diff.tool ni sozlab, git difftool HEAD~1 HEAD bilan farqni VS Code'da oching.
  6. Mashq javoblarini mashqlar/07/07-git-diff/javoblar.md ga yozing. Commitdan oldin git diff --staged bilan tekshiring va commit qiling: 07/07: git diff mashqlari javoblarini qo'sh.
Yechim
bash
cd ~/kurs/portfolio
git status -s
git diff
git diff --word-diff
git add sayt/assets/css/asosiy.css
git diff
git diff --staged --word-diff
git commit -m "CSS: asosiy rangni to'qroq qil"
git diff HEAD~1 HEAD --stat

Biz qisqa portfolio nusxasida sinadik. Unda asosiy.css bitta qatorli edi, shuning uchun avval :root ga --rang-asosiy tokenini qo'shib, commit qildik. Sizning faylingizda tokenlar 05–06-qismlardan beri bor. Keyin qiymatni #1f6f4a dan #1a5c3e ga o'zgartirdik. git diff:

text
@@ -1,3 +1,3 @@
 :root {
-  --rang-asosiy: #1f6f4a;
+  --rang-asosiy: #1a5c3e;
 }

git diff --word-diff:

text
@@ -1,3 +1,3 @@
:root {
  --rang-asosiy: [-#1f6f4a;-]{+#1a5c3e;+}
}

Hex kod va nuqtali vergul bitta "so'z" — orasida bo'sh joy yo'q. git add dan keyin git diff bo'sh chiqadi, git diff --staged --word-diff esa xuddi shu farqni ko'rsatadi. Commit va tekshiruv:

text
[main 7f9eb8a] CSS: asosiy rangni to'qroq qil
 1 file changed, 1 insertion(+), 1 deletion(-)
 sayt/assets/css/asosiy.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Sizda fayl nomi, qatorlar va SHA boshqacha bo'ladi. Muhimi: commitdan oldin --staged ga qarash odati.

9. Real ishda

  • Commitdan oldin — git diff --staged. Ko'p dasturchi commitdan oldin shu buyruqni yozadi yoki commit --verbose ishlatadi (Yaxshi commit). Tasodifan qolgan sinov matni, parol yoki keraksiz fayl shu bosqichda ushlanadi.
  • Code review. GitHub'da Pull Request'ning "Files changed" sahifasi — aynan diff: qizil va yashil qatorlar, bo'laklar, fayllar ro'yxati. Diff'ni terminalda o'qiy olgan odam uni ham darhol tushunadi (Pull Request).
  • Patch. Diff natijasini faylga yozib, boshqa odamga yuborish mumkin. Git'ning o'zi va Linux yadrosi hozir ham o'zgarishlarni shunday "yamoq" ko'rinishida email orqali qabul qiladi.
  • Vositalar. Terminal diff'ini chiroyliroq ko'rsatadigan qo'shimcha dasturlar bor (masalan delta). Lekin asos — shu darsdagi format.
  • Intervyuda: "git diff va git diff --staged farqi nima?" — ko'p beriladigan savol.

Xulosa

  • Diff: diff --git sarlavhasi, ---/+++ versiyalar, @@ -eski +yangi @@ bo'lak, kontekst, - eski, + yangi.
  • git diff — stol va quti; git diff --staged (--cached) — quti va commit; git diff HEAD — stol va commit.
  • git diff A B — ikki commit, avval eski; A..B bilan bir xil; A...B — umumiy ajdoddan (branch'larda).
  • --stat, --name-only, --name-status — qisqa; --word-diff — so'z darajasida.
  • Yangi (untracked) fayl diff'da ko'rinmaydi; git difftool farqni VS Code'da ochadi.

Keyingi dars: .gitignore: to'liq qo'llanma — keraksiz va xavfli fayllarni repoga umuman kiritmaslikni va .DS_Store ni tarixdan to'g'ri chiqarishni o'rganamiz.

Manbalar

  • Git hujjati: "git-diff" (--staged, --word-diff, .. va ...), "git-difftool", "diff-format" — git-scm.com/docs
  • Pro Git kitobi: "Recording Changes to the Repository" — Viewing Your Staged and Unstaged Changes — git-scm.com/book
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Git diff: o'zgarishlarni ko'rish, --staged va commitlar orasidagi farq — IlmHamroh