Mundarija (34)
- Bu darsda
- 1. Nega bu kerak?
- 2. Birinchi git diff
- 2.1 Natija
- 2.2 Sarlavha qatorlari
- 2.3 Bo'lak: @@ -1,4 +1,4 @@
- 3. Uch hudud — uch xil diff
- 3.1 Qutiga solgandan keyin git diff bo'shaydi
- 3.2 Uch versiya, uch javob
- 4. Qisqa va aniq ko'rinishlar
- 4.1 --stat, --name-only, --name-status
- 4.2 --word-diff — so'z darajasida
- 4.3 Ko'rinmas xatolar: --check va kontekst: -U
- 5. Commitlar orasidagi farq
- 5.1 git diff A B
- 5.2 Tartib muhim
- 5.3 Ikki nuqta .. va uch nuqta ...
- 6. VS Code'da farqni ko'rish
- 6.1 Source Control paneli
- 6.2 git difftool
- 7. Ko'p uchraydigan xatolar
- 7.1 "git diff hech narsa ko'rsatmayapti"
- 7.2 Yangi fayl diff'da ko'rinmaydi
- 7.3 \ No newline at end of file
- 7.4 Tartib almashgan
- 7.5 Sahifalagich
- 8. Mashqlar
- 1-mashq (oson): Diff'ni o'qing
- 2-mashq (o'rta): To'g'ri buyruqni tanlang
- 3-mashq (qiyin): Aloqa sahifasidan beri
- 4-mashq: Portfolio qadami — rangni o'zgartirib, farqni ko'ring
- 9. Real ishda
- Xulosa
- Manbalar
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. Oddiygit diff— ishchi papka va staging orasidagi farq,git diff --staged— staging va oxirgi commit orasidagi, ya'ni commitga aynan nima ketishi.git diff A Bikki commitni solishtiradi.--word-diffso'z darajasida,--statva--name-onlyesa qisqa ro'yxat ko'rsatadi.
Bu darsda
- Diff natijasining har qatorini — sarlavha,
@@bo'lak boshi,+va-— o'qiysiz. git diff,git diff --stagedvagit diff HEADqaysi hududlarni solishtirishini ajratasiz.- Ikki commit orasidagi farqni ko'rasiz va
..hamda...yozuvlari nimani bildirishini bilasiz. --word-diff,--stat,--name-onlybilan 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:
git status -s M bron/index.html
M menyu/index.htmlIkkala fayl stolda, qutida hech narsa yo'q. Farqni ko'ramiz:
git diffwarning: 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:
git add menyu/index.html
git diff --name-onlybron/index.htmlMenyu 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:
git diff --stageddiff --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:
git status -s M bron/index.html
MM menyu/index.htmlMM — 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):
git diff --word-diff -- menyu/index.html...
<p>Osh — [-38-]{+37+} 000 so'm</p>
...git diff --staged --word-diff -- menyu/index.html...
<p>Osh — [-35-]{+38+} 000 so'm</p>
...git diff HEAD --word-diff -- menyu/index.html...
<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" .-> WNimaga 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):
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"[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 darholgit diffyozdingiz — 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:
git diff --stat 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:
git diff --name-statusM 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:
git diff --word-diff -- menyu/index.htmldiff --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:
[-<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-diffmatnli fayllar uchun ayniqsa foydali: README, maqola, tarjima. Bitta vergul o'zgargan paragrafda oddiy diff butun paragrafni ikki marta ko'rsatadi,--word-diffesa 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:
git diff --checkmenyu/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:
git diff -U1diff --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-onlyyoki 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":
git diff e979a8e HEAD -- menyu/index.htmldiff --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:
git diff HEAD~2 HEAD --stat 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:
git diff HEAD HEAD~2 --stat 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 Bbilan 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 natijaA..Bbilan 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":
git log --oneline HEAD~2..HEAD74b46a2 (HEAD -> main) Bron: 2 soat oldin qilish qoidasini yoz
e3e247b Menyu: osh narxini 37 000 so'mga ko'tardiff — 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:
git config --global diff.tool vscode
git difftool
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:
- O'zgarish qutida. «Uch hudud — uch xil diff» bo'limini eslang:
git diff --stagedishlating. - Hamma narsa commit qilingan.
git statusworking tree cleandesa — farq yo'q. - Fayl yangi (untracked). Buni alohida ko'raylik.
7.2 Yangi fayl diff'da ko'rinmaydi
echo '<h1>Tadbirlar</h1>' > tadbirlar.html
git status -s
git diff --stat?? tadbirlar.htmlgit 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 addqiling vagit diff --stagedbilan ko'ring. - Yoki
git add -N tadbirlar.html(--intent-to-add, "qo'shish niyati"): Git faylni taniydi, lekin mazmunini hali qutiga solmaydi. Shundan keyingit diffuni ko'rsatadi:
tadbirlar.html | 1 +
1 file changed, 1 insertion(+)7.3 \ No newline at end of file
@@ -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 fileTarjimasi: "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
@@ -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>- Nechta qator o'zgargan?
- Qaysi qatorlar kontekst?
git diff --statbu fayl uchun qanday belgi ko'rsatadi?
Ishora: «Bo'lak» bo'limidagi uch xil qator va «Qisqa va aniq ko'rinishlar» dagi --stat.
Yechim
- Bitta qator — telefon raqami almashtirilgan: bitta
-, bitta+. <h1>va "2 soat" qatorlari — bo'sh joy bilan boshlangan.| 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:
git diff --name-onlybron/index.htmlgit diff --staged --name-onlymenyu/index.html3-mashq (qiyin): Aloqa sahifasidan beri
«Bahor»da aloqa sahifasi qo'shilgan commit — b09fa2a. Shundan beri:
- Qaysi fayllar o'zgargan? Bitta buyruq bilan faqat nomlarini chiqaring.
- Ro'yxatda sizni ajablantiradigan fayl bormi?
- Shu davrdagi commitlar ro'yxatini chiqaring. Nega bu buyruq
diffemas,log?
Ishora: git diff A B --name-only; git log A..B.
Yechim
git diff b09fa2a HEAD --name-only:
assets/css/.DS_Store
assets/css/asosiy.css
assets/images/logo.svg
bron/index.html
bron/rahmat.html
index.html
menyu/index.htmlassets/css/.DS_Store— Malika tasodifan qo'shgan macOS fayli (git log darsida--statorqali topgan edik). Uni keyingi darsda tozalaymiz.git log --oneline b09fa2a..HEAD—b09fa2adan keyingi commitlar.diffbitta umumiy farq beradi va qaysi commitda nima qilinganini aytmaydi. "Nima qilindi, ketma-ket" degan savolgalogjavob beradi.
4-mashq: Portfolio qadami — rangni o'zgartirib, farqni ko'ring
kurs/portfolio/sayt/assets/css/asosiy.cssda bitta rangni o'zgartiring (masalan, asosiy brend rangini biroz to'qroq qiling). Faylni saqlang.git status -s, keyingit diffvagit diff --word-diffni solishtiring. Qaysi biri o'zgarishni aniqroq ko'rsatadi?- Faylni qutiga soling.
git diffendi nima ko'rsatadi? Commitga nima ketishini ko'rsating. - Commit qiling (xabar — Yaxshi commit qoidasi bo'yicha).
git diff HEAD~1 HEAD --statbilan tekshiring. - Ixtiyoriy:
diff.toolni sozlab,git difftool HEAD~1 HEADbilan farqni VS Code'da oching. - Mashq javoblarini
mashqlar/07/07-git-diff/javoblar.mdga yozing. Commitdan oldingit diff --stagedbilan tekshiring va commit qiling:07/07: git diff mashqlari javoblarini qo'sh.
Yechim
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 --statBiz 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:
@@ -1,3 +1,3 @@
:root {
- --rang-asosiy: #1f6f4a;
+ --rang-asosiy: #1a5c3e;
}git diff --word-diff:
@@ -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:
[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 yokicommit --verboseishlatadi (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 diffvagit diff --stagedfarqi nima?" — ko'p beriladigan savol.
Xulosa
- Diff:
diff --gitsarlavhasi,---/+++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..Bbilan 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 difftoolfarqni 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
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!