đ¯ git rebase āĻā§? â
git rebase Git-āĻāϰ āĻāĻāĻāĻŋ āĻāĻŽāĻžāύā§āĻĄ, āϝāĻž āĻāĻ āĻŦā§āϰāĻžāĻā§āĻā§āϰ āĻāϤāĻŋāĻšāĻžāϏāĻā§ āĻ
āύā§āϝ āĻŦā§āϰāĻžāĻā§āĻā§āϰ āĻļā§āώ āĻāĻŽāĻŋāĻā§āϰ āĻĒāϰ āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰ āĻāϰā§āĨ¤
āϏāĻšāĻāĻāĻžāĻŦā§ āĻŦāϞāϞā§:
"āĻāĻŽāĻžāϰ āĻāĻžāĻāĻāĻž āϝā§āύ āĻļā§āώ āĻšā§
maināĻŦā§āϰāĻžāĻā§āĻā§āϰ āϏāϰā§āĻŦāĻļā§āώ āĻāĻĒāĻĄā§āĻā§āϰ āĻĒāϰ⧠â āĻāĻŽāύāĻāĻžāĻŦā§ āĻāϤāĻŋāĻšāĻžāϏ āϏāĻžāĻāĻžāĻāĨ¤"
đ git rebase āĻā§āύ āĻĻāϰāĻāĻžāϰ? â
- āĻāϤāĻŋāĻšāĻžāϏ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āϰāĻžāĻāϤā§
mergeāĻāϰ āĻŽāϤ⧠āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āĻāĻŽāĻŋāĻ āύāĻž āĻāϰ⧠āϏāϰāϞ āĻāϤāĻŋāĻšāĻžāϏ āϤā§āϰāĻŋ āĻāϰāϤā§- Pull request-āĻāϰ āĻāĻā§ āĻāĻŽāĻŋāĻāĻā§āϞ⧠āϏā§āύā§āĻĻāϰāĻāĻžāĻŦā§ āϏāĻžāĻāĻžāϤā§
đ merge vs rebase â
| āĻŦāĻŋāώ⧠| merge | rebase |
|---|---|---|
| āύāϤā§āύ commit āϤā§āϰāĻŋ āĻšā§ | â (āĻāĻāĻāĻž merge commit) | â (āĻĒā§āϰāύ⧠commit-āĻā§āϞā§āĻā§ āĻāĻŦāĻžāϰ āϤā§āϰāĻŋ āĻāϰā§) |
| āĻāϤāĻŋāĻšāĻžāϏ āĻā§āĻŽāύ āĻšā§ | āĻļāĻžāĻāĻžāĻŦāĻŋāĻāĻā§āϤ (branching history) | āϏāϰāϞ (linear history) |
| āϏāĻšāĻ | āĻšā§āϝāĻžāĻ | āĻāĻāĻā§ āĻāĻāĻŋāϞ |
| Pull Request āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ | āĻŽāĻžāĻā§āĻŽāϧā§āϝ⧠| āĻŦā§āĻļāĻŋ āĻāύāĻĒā§āϰāĻŋā§ |
đ Basic Rebase Example â
āϧāϰāĻŋ āĻāĻĒāύāĻžāϰ main āĻ āĻāĻā§ āĻāĻ commit:
A---B---C (main)A---B---C (main)āĻāĻŦāĻ feature āĻŦā§āϰāĻžāĻā§āĻā§ āĻāĻā§:
A---B---C (main)
\
D---E (feature)A---B---C (main)
\
D---E (feature)āĻāĻāύ āĻāĻĒāύāĻŋ feature āĻŦā§āϰāĻžāĻā§āĻā§ āĻāĻŋā§ā§ āĻāĻžāϞāĻžāύ:
git rebase maingit rebase mainGit āĻāϰāĻŦā§:
A---B---C---D'---E' (feature)A---B---C---D'---E' (feature)āĻŽāĻžāύā§, D āĻāĻŦāĻ E āĻā§ C āĻāϰ āĻĒāϰ āύāϤā§āύ āĻāϰ⧠āĻŦāϏāĻžāĻŦā§āĨ¤
đ§ Rebase āĻāϰāĻžāϰ āϧāĻžāĻĒ â
git checkout feature
git rebase maingit checkout feature
git rebase mainđ āĻāĻĒāύāĻžāϰ āĻāĻŽāĻŋāĻāĻā§āϞ⧠main-āĻāϰ āĻĒāϰ⧠āύāĻŋā§ā§ āϝāĻžāĻŦā§āĨ¤
âī¸ Conflict āĻšāϞ⧠āĻā§ āĻāϰāĻŦā§āύ? â
# āĻĢāĻžāĻāϞ āĻāĻĄāĻŋāĻ āĻāϰ⧠āĻ āĻŋāĻ āĻāϰā§āύ
git add .
# āϤāĻžāϰāĻĒāϰ
git rebase --continue# āĻĢāĻžāĻāϞ āĻāĻĄāĻŋāĻ āĻāϰ⧠āĻ āĻŋāĻ āĻāϰā§āύ
git add .
# āϤāĻžāϰāĻĒāϰ
git rebase --continueāĻŦāύā§āϧ āĻāϰāϤ⧠āĻāĻžāĻāϞā§:
git rebase --abortgit rebase --abortđ§Ē āĻāĻĻāĻžāĻšāϰāĻŖ ā§§: āϞā§āĻāĻžāϞ āĻŦā§āϰāĻžāĻā§āĻ main-āĻāϰ āϏāĻžāĻĨā§ āĻāĻĒāĻĄā§āĻ āϰāĻžāĻāĻž â
git checkout feature
git fetch origin
git rebase origin/maingit checkout feature
git fetch origin
git rebase origin/mainâĄī¸ main āĻāϰ āϏāϰā§āĻŦāĻļā§āώ āĻāĻĒāĻĄā§āĻā§āϰ āĻĒāϰ⧠āĻāĻĒāύāĻžāϰ āĻāĻžāĻ āĻŦāϏāĻžāύ⧠āĻšāĻŦā§āĨ¤
đ§Ē āĻāĻĻāĻžāĻšāϰāĻŖ ⧍: rebase āĻāϰ⧠Push â
git rebase main
git push --force-with-leasegit rebase main
git push --force-with-leaseâĄī¸ āĻāϤāĻŋāĻšāĻžāϏ āĻĒāĻžāϞā§āĻā§āĻā§ āĻŦāϞā§, āĻāĻĒāύāĻžāĻā§ force push āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
đ§Ē āĻāĻĻāĻžāĻšāϰāĻŖ ā§Š: āĻāύā§āĻāĻžāϰâā§āϝāĻžāĻā§āĻāĻŋāĻ Rebase āĻĻāĻŋā§ā§ āĻāĻŽāĻŋāĻ āĻĒāϰāĻŋāώā§āĻāĻžāϰ â
git rebase -i HEAD~3git rebase -i HEAD~3âĄī¸ āĻļā§āώ ā§ŠāĻāĻŋ āĻāĻŽāĻŋāĻāĻā§ āĻāĻĒāύāĻŋ āĻāĻāϏāĻžāĻĨā§ squash, edit, drop āĻāϤā§āϝāĻžāĻĻāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ:
pick 123abc Add login form
pick 456def Fix typo
pick 789ghi Add validation
# āĻāĻĒāύāĻŋ āĻāĻžāĻāϞ⧠āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
squash 456def
squash 789ghipick 123abc Add login form
pick 456def Fix typo
pick 789ghi Add validation
# āĻāĻĒāύāĻŋ āĻāĻžāĻāϞ⧠āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
squash 456def
squash 789ghiâĄī¸ āϏāĻŦ āĻāĻ āĻāϰ⧠āĻāĻāĻāĻž āϏā§āύā§āĻĻāϰ āĻāĻŽāĻŋāĻ āĻŦāĻžāύāĻŋā§ā§ āĻĢā§āϞā§āύāĨ¤
đ§Ē āĻāĻĻāĻžāĻšāϰāĻŖ ā§Ē: rebase --onto āĻĻāĻŋā§ā§ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻžā§āĻāĻžā§ āĻŦāϏāĻžāύ⧠â
āϧāϰāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻ āĻāϤāĻŋāĻšāĻžāϏ:
A---B---C (main)
\
D---E (feature)A---B---C (main)
\
D---E (feature)āĻāĻāύ āĻāĻĒāύāĻŋ feature āĻāϰ D āĻŦāĻžāĻĻ āĻĻāĻŋā§ā§ āĻļā§āϧ⧠E āĻā§ C āĻāϰ āĻĒāϰ⧠āĻŦāϏāĻžāϤ⧠āĻāĻžāύ:
git checkout feature
git rebase --onto main Dgit checkout feature
git rebase --onto main DāĻĢāϞāĻžāĻĢāϞ:
A---B---C---E' (feature)A---B---C---E' (feature)đ§Ē āĻāĻĻāĻžāĻšāϰāĻŖ ā§Ģ: āĻ āύā§āϝāĻĻā§āϰ PR review āĻāϰāĻžāϰ āĻĒāϰ rebase â
git checkout feature
git fetch origin
git rebase origin/main
git push --force-with-leasegit checkout feature
git fetch origin
git rebase origin/main
git push --force-with-leaseâĄī¸ āĻāĻāĻž āĻāϰāĻžāϰ āĻĢāϞ⧠āĻāĻĒāύāĻžāϰ Pull Request āĻ āύā§āĻ āĻĒāϰāĻŋāĻā§āĻāύā§āύ āĻĻā§āĻāĻžāĻŦā§āĨ¤
đ§¯ āĻā§āϞ āĻāϰāϞ⧠āĻā§ āĻāϰāĻŦā§āύ? â
git rebase --abortgit rebase --abortâĄī¸ rebase āĻāϞāĻžāĻāĻžāϞā§āύ āĻā§āϞ āĻšāϞ⧠āĻāĻāĻžāĻŦā§ āĻĢāĻŋāϰāĻŋā§ā§ āύāĻŋāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻ āĻĨāĻŦāĻž
git reflog
git reset --hard <old-commit-id>git reflog
git reset --hard <old-commit-id>âĄī¸ āĻāĻā§āϰ āĻ āĻŦāϏā§āĻĨāĻž āĻĢāĻŋāϰāĻŋā§ā§ āĻāύā§āύāĨ¤
â
āĻāĻāύ rebase āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ? â
| āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋ | rebase āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ? |
|---|---|
| āĻāĻĒāύāĻŋ āĻāĻāĻž āĻāĻžāĻ āĻāϰāĻā§āύ | âī¸ āĻšā§āϝāĻžāĻ |
| āĻāĻŋāĻŽā§ āĻāĻžāĻ āĻāϰāĻā§āύ āĻāĻŦāĻ force push āĻāϰāĻž āϝāĻžāĻŦā§ | â ī¸ āĻšā§āϝāĻžāĻ, āϏāϤāϰā§āĻ āĻĨāĻžāĻā§āύ |
| āĻ āύā§āĻ āĻ āĻā§āĻāĻžāϞ⧠commit | âī¸ āĻšā§āϝāĻžāĻ, āĻāύā§āĻāĻžāϰâā§āϝāĻžāĻā§āĻāĻŋāĻ rebase |
| production/history āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻž āĻāϰā§āϰāĻŋ | â āύāĻž |
â Rebase āĻāϰāĻžāϰ āύāĻŋā§āĻŽ āĻāĻŋāĻŽā§ (Best Practice) â
- āϏāϰā§āĻŦāĻĻāĻž
--force-with-leaseāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ - āĻ
āύā§āϝāĻĻā§āϰ āĻāĻžāĻā§āϰ āĻāĻĒāϰ
rebaseāĻāϰāĻŦā§āύ āύāĻž āϝāĻĻāĻŋ āύāĻž āĻāĻĒāύāĻŋ āĻāĻāĻž āĻāĻžāĻ āĻāϰā§āύāĨ¤ maināĻŦāĻžmasterāĻŦā§āϰāĻžāĻā§āĻā§ āĻāĻāύāĻrebaseāĻāϰāĻŦā§āύ āύāĻžāĨ¤
đ§ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻŖ rebase workflow āĻāĻĻāĻžāĻšāϰāĻŖ â
git checkout feature/cart-update
git fetch origin
git rebase origin/main
# conflict āĻšāϞ⧠āĻĢāĻŋāĻā§āϏ āĻāϰā§:
git add .
git rebase --continue
# āĻļā§āώā§
git push --force-with-leasegit checkout feature/cart-update
git fetch origin
git rebase origin/main
# conflict āĻšāϞ⧠āĻĢāĻŋāĻā§āϏ āĻāϰā§:
git add .
git rebase --continue
# āĻļā§āώā§
git push --force-with-leaseđ āĻāĻĒāϏāĻāĻšāĻžāϰ â
- â
git rebaseāĻāϤāĻŋāĻšāĻžāϏ āĻĒāϰāĻŋāĻā§āĻāύā§āύ āĻ āϞāĻŋāύāĻŋā§āĻžāϰ āϰāĻžāĻāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤ - â āϏāϤāϰā§āĻāĻāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ â āĻāϤāĻŋāĻšāĻžāϏ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻšā§āĨ¤
- đĄ
mergeāĻrebaseāĻĻā§āĻā§āĻ āĻĻāϰāĻāĻžāϰāĻŋ, āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋ āĻ āύā§āϝāĻžā§ā§ āĻŦā§āĻā§ āύāĻŋāύāĨ¤