đ¯ 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 main
git rebase main
Git āĻāϰāĻŦā§:
A---B---C---D'---E' (feature)
A---B---C---D'---E' (feature)
āĻŽāĻžāύā§, D
āĻāĻŦāĻ E
āĻā§ C
āĻāϰ āĻĒāϰ āύāϤā§āύ āĻāϰ⧠āĻŦāϏāĻžāĻŦā§āĨ¤
đ§ Rebase āĻāϰāĻžāϰ āϧāĻžāĻĒ â
git checkout feature
git rebase main
git checkout feature
git rebase main
đ āĻāĻĒāύāĻžāϰ āĻāĻŽāĻŋāĻāĻā§āϞ⧠main-āĻāϰ āĻĒāϰ⧠āύāĻŋā§ā§ āϝāĻžāĻŦā§āĨ¤
âī¸ Conflict āĻšāϞ⧠āĻā§ āĻāϰāĻŦā§āύ? â
# āĻĢāĻžāĻāϞ āĻāĻĄāĻŋāĻ āĻāϰ⧠āĻ āĻŋāĻ āĻāϰā§āύ
git add .
# āϤāĻžāϰāĻĒāϰ
git rebase --continue
# āĻĢāĻžāĻāϞ āĻāĻĄāĻŋāĻ āĻāϰ⧠āĻ āĻŋāĻ āĻāϰā§āύ
git add .
# āϤāĻžāϰāĻĒāϰ
git rebase --continue
āĻŦāύā§āϧ āĻāϰāϤ⧠āĻāĻžāĻāϞā§:
git rebase --abort
git rebase --abort
đ§Ē āĻāĻĻāĻžāĻšāϰāĻŖ ā§§: āϞā§āĻāĻžāϞ āĻŦā§āϰāĻžāĻā§āĻ main-āĻāϰ āϏāĻžāĻĨā§ āĻāĻĒāĻĄā§āĻ āϰāĻžāĻāĻž â
git checkout feature
git fetch origin
git rebase origin/main
git checkout feature
git fetch origin
git rebase origin/main
âĄī¸ main āĻāϰ āϏāϰā§āĻŦāĻļā§āώ āĻāĻĒāĻĄā§āĻā§āϰ āĻĒāϰ⧠āĻāĻĒāύāĻžāϰ āĻāĻžāĻ āĻŦāϏāĻžāύ⧠āĻšāĻŦā§āĨ¤
đ§Ē āĻāĻĻāĻžāĻšāϰāĻŖ ⧍: rebase āĻāϰ⧠Push â
git rebase main
git push --force-with-lease
git rebase main
git push --force-with-lease
âĄī¸ āĻāϤāĻŋāĻšāĻžāϏ āĻĒāĻžāϞā§āĻā§āĻā§ āĻŦāϞā§, āĻāĻĒāύāĻžāĻā§ force push āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
đ§Ē āĻāĻĻāĻžāĻšāϰāĻŖ ā§Š: āĻāύā§āĻāĻžāϰâā§āϝāĻžāĻā§āĻāĻŋāĻ Rebase āĻĻāĻŋā§ā§ āĻāĻŽāĻŋāĻ āĻĒāϰāĻŋāώā§āĻāĻžāϰ â
git rebase -i HEAD~3
git rebase -i HEAD~3
âĄī¸ āĻļā§āώ ā§ŠāĻāĻŋ āĻāĻŽāĻŋāĻāĻā§ āĻāĻĒāύāĻŋ āĻāĻāϏāĻžāĻĨā§ squash, edit, drop āĻāϤā§āϝāĻžāĻĻāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ:
pick 123abc Add login form
pick 456def Fix typo
pick 789ghi Add validation
# āĻāĻĒāύāĻŋ āĻāĻžāĻāϞ⧠āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
squash 456def
squash 789ghi
pick 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 D
git 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-lease
git checkout feature
git fetch origin
git rebase origin/main
git push --force-with-lease
âĄī¸ āĻāĻāĻž āĻāϰāĻžāϰ āĻĢāϞ⧠āĻāĻĒāύāĻžāϰ Pull Request āĻ āύā§āĻ āĻĒāϰāĻŋāĻā§āĻāύā§āύ āĻĻā§āĻāĻžāĻŦā§āĨ¤
đ§¯ āĻā§āϞ āĻāϰāϞ⧠āĻā§ āĻāϰāĻŦā§āύ? â
git rebase --abort
git 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-lease
git 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
āĻĻā§āĻā§āĻ āĻĻāϰāĻāĻžāϰāĻŋ, āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋ āĻ āύā§āϝāĻžā§ā§ āĻŦā§āĻā§ āύāĻŋāύāĨ¤