Thuta Learning
Git & GitHub: Collaboration and Professional Workflows
AdvancedDevOps & Toolsintermediate

Interactive Rebase နှင့် Commit များ Squash လုပ်ခြင်း

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Interactive Rebase နှင့် Commit များ Squash လုပ်ခြင်း concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • Diagram ကို ဖတ်ပြီး Git/GitHub workflow ထဲမှာ state (သို့) data ဘယ်လိုစီးဆင်းသလဲ ခြေရာခံနိုင်ရန်
  • ကိုယ့် project/team အတွက် ဘယ်လို အသုံးချသင့်သလဲ ဆုံးဖြတ်နိုင်ရန်

နားလည်ထားရမယ့် အချက်

git rebase -i နဲ့ စတင်တဲ့ interactive rebase က မကြာသေးခင်က commit range တစ်ခုကို တခြားသူတွေ မမြင်ခင် ပြန်ရေးနိုင်ပါတယ်။ range ထဲက commit တစ်ခုချင်းစီကို script တစ်ခုမှာ line တစ်ကြောင်းစီ ဖော်ပြပြီး ဘာလုပ်မလဲ ရွေးနိုင်ပါတယ် — pick က မပြောင်းဘဲထားမယ်၊ reword က message ပြင်မယ်၊ squash က အပေါ်က commit ထဲ ပေါင်းစည်းပြီး message အသစ်ရေးမယ်၊ fixup ကလည်းအလားတူပေမယ့် message ကို ပယ်ချမယ်၊ line အစီအစဉ်ပြောင်းရင် replay order ပြောင်းသွားမယ်။

အသုံးအများဆုံး real-world use case ကတော့ pull request မဖွင့်ခင် work-in-progress commit တွေကို သန့်ရှင်းရေးလုပ်တာပါ။ fix၊ fix again၊ typo ဆိုပြီး line သုံးကြောင်းသီးသန့် PR ထဲမှာ ဘယ်သူမှ မလိုချင်ပါဘူး — reviewer တွေက Add checkout validation လို message ရှင်းရှင်းလင်းလင်းရှိတဲ့ commit တစ်ခုတည်းကို လိုချင်ကြပါတယ်။ Squash လုပ်ခြင်းက debug လုပ်ခဲ့ရပုံရိုးရိုးသားသားကို review လုပ်ရလွယ်၊ တစ်ခုလုံး revert ပြန်လုပ်ရလွယ်ပြီး နောက်ပိုင်း git log ဒါမှမဟုတ် git blame နဲ့ နားလည်ရလွယ်တဲ့ တင်ပြနိုင်တဲ့ unit တစ်ခုအဖြစ် ပြောင်းပေးပါတယ်။

Shared history သတိပေးချက်ဟာ ဒီမှာလည်း သက်ဆိုင်ပါတယ်

Interactive rebase ဟာ ပုံမှန် rebase အတိုင်းပဲ commit တွေကို ပြန်ရေးပြီး ထိသမျှ commit အတွက် hash အသစ်ဖန်တီးပါတယ်။ local ဒါမှမဟုတ် မ push ရသေးတဲ့ branch ပေါ်က commit တွေကိုသာ squash/reword လုပ်ပါ — commit တစ်ခု push ဖြစ်သွားပြီး တခြားသူက အပေါ်မှာ အလုပ်လုပ်ပြီးသားဖြစ်နိုင်တာနဲ့ ပြန်ရေးတာက coordination ပြဿနာ ဖြစ်လာပါတယ်။

text
INTERACTIVE REBASE: SQUASHING MESSY COMMITS
-------------------------------------------
BEFORE (3 messy commits on top of the initial commit)

init---fix---fix again---typo

AFTER (git rebase -i HEAD~3, squash all three)

init---Add checkout validation

Three separate hashes become one new hash; the messy
intermediate commits no longer exist in history.

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

ဒီ ဥပမာမှာ initial commit အပေါ်မှာ fix၊ fix again၊ typo ဆိုပြီး ရည်ရွယ်ချက်ရှိရှိ ရှုပ်ထွေးတဲ့ commit သုံးခု ဖန်တီးထားပါတယ်၊ တစ်ခုချင်းစီက checkout.js file တစ်ခုတည်းကို ခြေလှမ်းလိုက်ပြောင်းလဲသွားပါတယ်။ clean မလုပ်ခင် git log --oneline က commit လေးခုလုံးကို ပြပါတယ် — အလုပ်ဖြစ်ခဲ့ပုံ ရိုးရိုးသားသားမှတ်တမ်းပါ။

Script နဲ့ squash လုပ်ခြင်း

git reset --soft HEAD~3 ပြီးရင် git commit -m တစ်ကြိမ်ပဲ run တာက interactive squash ရဲ့ script ဖြင့် reproduce လုပ်နိုင်တဲ့ တန်းတူနည်းလမ်းပါ။

နေ့စဉ်သုံးနည်းလမ်း

ပုံမှန်အားဖြင့်တော့ git rebase -i HEAD~3 run ပြီး ပထမ commit ကို pick၊ ကျန်နှစ်ခုကို squash လို့ editor ထဲမှာ မှတ်သားပြီး message ပေါင်းစည်းရေးရပါတယ် — ရလဒ်တူပေမယ့် interface ကွာသွားပါတယ်။

ရလဒ်

ပြီးရင် git log --oneline က commit နှစ်ခုပဲ ပြပါတယ် — မူလ initial commit နဲ့ commit အသစ်တစ်ခု Add checkout validation ပါ။

အတူတူ စမ်းရေးကြည့်မယ်

bash
export GIT_AUTHOR_NAME="Thuta Learner"
export GIT_AUTHOR_EMAIL="learner@example.com"
export GIT_COMMITTER_NAME="Thuta Learner"
export GIT_COMMITTER_EMAIL="learner@example.com"

git init
export GIT_AUTHOR_DATE="2026-01-01T09:00:00"
export GIT_COMMITTER_DATE="2026-01-01T09:00:00"
echo "function checkout() {}" > checkout.js
git add checkout.js
git commit -m "Initial commit"

export GIT_AUTHOR_DATE="2026-01-01T10:00:00"
export GIT_COMMITTER_DATE="2026-01-01T10:00:00"
echo "function checkout(cart) { return cart; }" > checkout.js
git add checkout.js
git commit -m "fix"

export GIT_AUTHOR_DATE="2026-01-01T10:05:00"
export GIT_COMMITTER_DATE="2026-01-01T10:05:00"
echo "function checkout(cart) { if (!cart) return null; return cart; }" > checkout.js
git add checkout.js
git commit -m "fix again"

export GIT_AUTHOR_DATE="2026-01-01T10:10:00"
export GIT_COMMITTER_DATE="2026-01-01T10:10:00"
echo "function checkout(cart) { if (!cart) return null; return cart.total; }" > checkout.js
git add checkout.js
git commit -m "typo"

git log --oneline

# Scriptable equivalent of: git rebase -i HEAD~3 (pick, squash, squash)
export GIT_AUTHOR_DATE="2026-01-01T10:15:00"
export GIT_COMMITTER_DATE="2026-01-01T10:15:00"
git reset --soft HEAD~3
git commit -m "Add checkout validation"

git log --oneline
You should see
squash မလုပ်ခင် git log --oneline က:

e2042af typo
7fe5cc1 fix again
1cc7705 fix
53f2738 Initial commit

git reset --soft HEAD~3 လုပ်ပြီး git commit -m "Add checkout validation" တစ်ကြိမ် run ပြီးနောက်မှာတော့:

dd1d8cc Add checkout validation
53f2738 Initial commit

ရှုပ်ထွေးတဲ့ commit သုံးခုလုံး လုံးဝပျောက်သွားပြီး hash အသစ်ရှိတဲ့ commit တစ်ခုတည်းအဖြစ် အစားထိုးသွားပါတယ်။

၅ မိနစ် စမ်းကြည့်

test repo တစ်ခုမှာ ရည်ရွယ်ချက်ရှိရှိ message ရှုပ်ထွေးတဲ့ commit လေးငါးခု လုပ်ပါ၊ ပြီးရင် နောက်ဆုံးသုံးခုကို git reset --soft HEAD~3 နဲ့ commit တစ်ကြိမ်ပေါင်း squash လုပ်ပါ။ ပြီးရင် အစစ်အမှန် interactive version ကိုလည်း စမ်းကြည့်ပါ — git rebase -i HEAD~3 run ပြီး editor ထဲမှာ commit တွေကို squash လို့ မှတ်ပြီး ရလဒ်ကို နှိုင်းယှဉ်ကြည့်ပါ။

သတိလေးတစ်ချက်

team ဝင်တွေ ဆွဲထားပြီးသား push ပြီးသား commit တွေကို squash လုပ်ရင် shared history ကို ပြန်ရေးပစ်လိုက်ပြီး တခြားသူတွေ branch ကွဲနေတာကို ပြန်ညှိရမယ့် ပြဿနာဖြစ်စေပါတယ်။

git reset --soft HEAD~N ကို ရေတွက်မှားရင် သွားချင်တာထက် ပိုပြီး commit ပါသွားနိုင်ပါတယ် — squash လုပ်တော့မယ့် commit ဘယ်နှစ်ခုအတိအကျဆိုတာ git log နဲ့ အရင်စစ်ပါ။

Git - git-rebase Documentation (interactive mode)Git & GitHub

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • team ဝင်တွေ ဆွဲထားပြီးသား push ပြီးသား commit တွေကို squash လုပ်ရင် shared history ကို ပြန်ရေးပစ်လိုက်ပြီး တခြားသူတွေ branch ကွဲနေတာကို ပြန်ညှိရမယ့် ပြဿနာဖြစ်စေပါတယ်။
  • git reset --soft HEAD~N ကို ရေတွက်မှားရင် သွားချင်တာထက် ပိုပြီး commit ပါသွားနိုင်ပါတယ် — squash လုပ်တော့မယ့် commit ဘယ်နှစ်ခုအတိအကျဆိုတာ git log နဲ့ အရင်စစ်ပါ။
  • Destructive (သို့) history ပြောင်းလဲနိုင်တဲ့ command တိုင်းကို run မခင် git status နဲ့ လက်ရှိအခြေအနေကို အမြဲစစ်ပါ။

လေ့ကျင့်ခန်း

test repo တစ်ခုမှာ ရည်ရွယ်ချက်ရှိရှိ message ရှုပ်ထွေးတဲ့ commit လေးငါးခု လုပ်ပါ၊ ပြီးရင် နောက်ဆုံးသုံးခုကို git reset --soft HEAD~3 နဲ့ commit တစ်ကြိမ်ပေါင်း squash လုပ်ပါ။ ပြီးရင် အစစ်အမှန် interactive version ကိုလည်း စမ်းကြည့်ပါ — git rebase -i HEAD~3 run ပြီး editor ထဲမှာ commit တွေကို squash လို့ မှတ်ပြီး ရလဒ်ကို နှိုင်းယှဉ်ကြည့်ပါ။

You'll know it worked when: squash မလုပ်ခင် git log --oneline က: e2042af typo 7fe5cc1 fix again 1cc7705 fix 53f2738 Initial commit git reset --soft HEAD~3 လုပ်ပြီး git commit -m "Add checkout validation" တစ်ကြိမ် run ပြီးနောက်မှာတော့: dd1d8cc Add checkout validation 53f2738 Initial commit ရှုပ်ထွေးတဲ့ commit သုံးခုလုံး လုံးဝပျောက်သွားပြီး hash အသစ်ရှိတဲ့ commit တစ်ခုတည်းအဖြစ် အစားထိုးသွားပါတယ်။

Interactive Rebase နှင့် Commit များ Squash လုပ်ခြင်း | Thuta Learning