git commit --amend — oxirgi commitni o'zgartirish

~10 daq · Git · Git Tarixini Boshqarish

Muammodan boshlaylik

Commit qildingiz va darhol tushundingiz:

  • Xabarda imlo xatosi: "Login sahifas qo'shildi"
  • Bitta faylni add qilishni unutdingiz — commit yarim
  • console.log qolib 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 push rad etiladi (21-dars), --force esa 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
  • main yoki umumiy branch — amend qilmang. Yangi tuzatuvchi commit qiling yoki git 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 tuzatish
  • git 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 → --amend bilan yakuniy commit

Keyingi dars

27-dars: git reset — soft, mixed, hard — farqlari va qachon ishlatiladi