git commit --amend — oxirgi commitni o'zgartirish
Muammodan boshlaylik
Commit qildingiz va darhol tushundingiz:
- Xabarda imlo xatosi: "Login sahifas qo'shildi"
- Bitta faylni
addqilishni unutdingiz — commit yarim console.logqolib ketgan
Yangi "fix typo" yoki "unutilgan fayl" commit i — tarixni ifloslaydi (8-dars). Oxirgi commit ni tuzatish kerak — go'yo xato bo'lmagandek.
Xabarni o'zgartirish
git commit --amend -m "Login sahifasi qo'shildi"
Yoki muharrirda (eski xabar tayyor turadi):
git commit --amend
Unutilgan faylni qo'shish
git add src/login.css # unutilgan fayl
git commit --amend --no-edit # xabarni o'zgartirmasdan
--no-edit — eski xabar saqlanadi. Staging dagi hamma narsa oxirgi commit ga qo'shiladi.
Xuddi shunday — qolib ketgan console.log ni o'chirish:
# faylni tahrirlash...
git add src/login.js
git commit --amend --no-edit
Muallifni tuzatish
Yangi kompyuterda user.email noto'g'ri sozlangan edi:
git config user.email "otabek@example.com"
git commit --amend --reset-author --no-edit
Amend aslida nima qiladi
--amend commit ni o'zgartirmaydi — u yangi commit yaratib, eskisini almashtiradi:
Oldin: Keyin:
●────●────A main ●────●────A' main
\
A (yetim — hech kim ishora qilmaydi)
A' — yangi hash bilan. A — git reflog da (31-dars) bir muddat qoladi, keyin tozalanadi.
[!WARNING] Push qilingan commitni amend qilmang (agar boshqalar u ustida ishlayotgan bo'lsa). Sizda — A', GitHub va hamkasblarda — A. Tarixlar ajraladi: oddiy
git pushrad etiladi (21-dars),--forceesa hamkasblaringizning ishini buzadi. Bu — 17-darsdagi oltin qoidaning xuddi o'zi.
Agar baribir push qilingan bo'lsa
- O'z shaxsiy feature branch ingiz (hech kim undan foydalanmaydi) — mumkin:
git commit --amend
git push --force-with-lease
mainyoki umumiy branch — amend qilmang. Yangi tuzatuvchi commit qiling yokigit revert(28-dars).
Eski commit ni tuzatish
--amend faqat oxirgi commit uchun. 3 commit oldingisida xato bo'lsa — interaktiv rebase (17-dars):
git add src/narx.js
git commit --fixup a1b2c3d # "fixup! ..." commit
git rebase -i --autosquash a1b2c3d~1 # avtomatik joyiga qo'yiladi va birlashtiriladi
Faqat xabar uchun: git rebase -i HEAD~3 va kerakli qatorda pick → reword.
WIP commit ni tugatish
18-darsda ko'rgan "WIP commit" usuli --amend bilan juda qulay:
git add -A
git commit -m "WIP" # vaqtinchalik saqlash, boshqa branch ga o'tish...
# ... qaytib, ishni davom ettirish ...
git add -A
git commit --amend -m "Mahsulot qidiruvi: filtrlar qo'shildi"
WIP commit tarixda qolmaydi — u yakuniy commit ga "aylanadi".
Nima uchun shunday?
Nima uchun Git commitni joyida tahrirlay olmaydi — doim yangisini yaratadi?
Chunki commit hash i — uning butun mazmunidan hisoblanadi: fayllar, xabar, muallif, sana va ota commit hash i (1, 5-darslar). Bitta harfni o'zgartirsangiz — hash o'zgaradi; demak, bu boshqa commit. Bu "o'zgarmaslik" Git ishonchliligining asosi: commit hash ini bilsangiz, uning mazmuni hech qachon jimgina o'zgarmaganiga kafolat bor. Shu tufayli "tarixni o'zgartirish" doim "yangi tarix yaratish" demakdir — va shuning uchun boshqalar bilan bo'lishilgan tarixni o'zgartirish muammolar keltiradi: ularda eski hash lar qoladi.
Xulosa
Eslab qoling:
git commit --amend -m "yangi xabar"— oxirgi commit xabarini tuzatishgit add fayl && git commit --amend --no-edit— unutilgan faylni qo'shish--reset-author— muallifni yangilash- Amend — yangi commit yaratadi (yangi hash)
- Push qilingan umumiy commitni amend qilmang; shaxsiy branch da —
--force-with-lease - Eski commitlar uchun —
commit --fixup+rebase -i --autosquash - WIP commit →
--amendbilan yakuniy commit
Keyingi dars
27-dars: git reset — soft, mixed, hard — farqlari va qachon ishlatiladi