GIT flow & GIT rebase ๐ŸŽƒ

On a regular basisยท2021๋…„ 7์›” 18์ผ
4
post-thumbnail

๐Ÿ‘ป GIT flow & GIT rebase ๐Ÿ‘ป
(๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ์ •๋ฆฌํ•˜๋Š” git flow & GIT rebase)

๐Ÿจ git flow๋ž€? ๐Ÿจ

* ํฌ๊ฒŒ main branch / feature branch๋กœ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌ

  • ์—ฌ๊ธฐ ์ค‘๊ฐ„์— develop branch๊ฐ€ ๋“ค์–ด์˜ด! (main branch๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„๋จ..!)
    โš’ develop branch ์ฐ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์˜ ๋ธŒ๋žœ์น˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ! โš’

  • ์‹ค์ œ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๋ฅผ main branch

  • ๊ทธ ๋ฐฐํฌ ๋ฐ”๋กœ ์ง์ „ ๋‹จ๊ณ„์—์„œ ์“ฐ๋Š” develop branch

  • ์—ฌ๊ธฐ์„œ ๋ฒ„๊ทธ ๊ณ ์น˜๋ฉด์„œ ์ˆ˜์ •ํ•ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” release branch

  • ๊ณ„์† ๊ณ ์ณ๋‚˜๊ฐ€๋ฉด์„œ ์“ฐ๋Š” feature branch
    (๐Ÿซ ๊ธฐ๋ณธ์ ์œผ๋กœ feature์—์„œ ์ˆ˜์ •ํ• ๊ฑฐ ๋‹ค ํ•˜๊ณ  develop์œผ๋กœ ๊ฐ€๋Š”๋ฐ, ๊ทธ ์™€์ค‘์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด release๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฒ„๊ทธ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  main์œผ๋กœ ๊ฐ.)
    (๐Ÿซ develop์—์„œ ๋จธ์ง€๋ฅผ ํ•˜๊ณ  main์œผ๋กœ ์˜ฌ๋ฆผ)

  • ๋งˆ์ง€๋ง‰์œผ๋กœ Htfix branch๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ตœ์ข… ์ˆ˜์ •ํ•ด์„œ Main์œผ๋กœ ๋จธ์ง€.

๐Ÿจ git rebase์ด๋ž€? ๐Ÿจ

  • git merge vs git rebase?
    ๋‘˜๋‹ค ์ฝ”๋“œ๋ฅผ ํ•ฉ์น˜๋Š” ๋ช…๋ น์–ด

  • merge ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?
    a branch์™€ b branch๋ฅผ ํ•ฉ์น˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ. ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ main์— ํ•ฉ์น˜๋ ค๊ณ .

  • git merge์˜ ๋‹จ์ 

  1. ๋ถˆํ•„์š”ํ•œ merge commit๋“ค์ด ์ƒ์„ฑ
    (๋ชจ๋“  feature branch๋งˆ๋‹ค merge commit์ด ๋‚จ์•„.. ํ”„์  ๊ทœ๋ชจ๊ฐ€ ํฌ๋ฉด ์ง„์งœ ์ •์‹ ์—†๊ฒ ์ฐŒ.)
  2. ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ history
    (์ •์‹ ์—†๋Š” merge commit๋•Œ๋ฌธ์— ๋ฒ„์ „๊ด€๋ฆฌ๋‘ ํž˜๋“ค์–ด์ง)
  • git rebase์˜ ์žฅ์ 
    Rebase๋Š” ๋‚ด commit์˜ base๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ commit history๋ฅผ ์ผ๋ ฌ๋กœ ์ •๋ฆฌํ•ด์ค€๋‹ค.
    (<-> ๋ฐ˜๋ฉด merge๋Š” ๊ทธ๋Œ€๋กœ ํฌ๊ฐœ๋“ฏ ๊ฒน์ณ์ ธ์„œ ๋ชจ๋“  commit์„ ๋‹ค ํก์ˆ˜ํ•˜๋Š” ๋Šฌ๋ฐ)

๐Ÿจ git squash๋ž€? ๐Ÿจ

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ฃผ๋Š” ๊ฒƒ

๐Ÿจ Rebase replaces Merge ๐Ÿจ

๐Ÿซ ์ƒˆ๋กœ์šด ์ž‘์—…์„ ๋ชจ๋‘ ๋งˆ์น˜๊ณ  pushํ•˜๊ธฐ ์ „์—๋Š”!

1. Main branch๋กœ ์ด๋™ํ•ด remote main์„ pull ๋ฐ›๊ธฐ
2. ๋‚ด๊ฐ€ push ํ•  feature branch๋กœ ์ด๋™
3. git rebase -i main ์„ ์ง„ํ–‰
4. ๊ทธ๋‹ค์Œ ๐ŸŒนpush๐ŸŒน

๐Ÿซ rebase ํ•˜๋Š” ๋™์•ˆ squash ์ง„ํ–‰ํ•  ๋•Œ์—๋Š”!

1. ๊ฐ€์žฅ ์˜ค๋ž˜๋œ commit์„ ์„ ํƒํ•œ๋‹ค (์š”๊ฑธ pick)
2. ๋‹ค๋ฅธ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ commit์„ ๊ธฐ์ค€์œผ๋กœ squashํ•œ๋‹ค!
(์š”๊ฑธ S๋ผ๊ณ ํ•ด) -> ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ์„ธ๊ฐœ์˜ ์ปค๋ฐ‹์ด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง€๋Š” ๊ฒƒ! ๐Ÿ˜Ž๋ฆฌ๋ฒ ์ด์Šค!๐Ÿ˜Ž
3. ๋‹ค๋ฅธ ์ปค๋ฐ‹์˜ ์ž‘์—… ๋‚ด์—ญ์ด ์—†์–ด์ง€๋Š” ๊ฒƒ์ด ์•„๋‹˜
4. ESC -> :wq๋กœ ๋น ์ ธ๋‚˜์˜ค๊ธฐ

๐Ÿจ Example! ๐Ÿจ

  1. ๋‚ด๊ฐ€ feature์—์„œ ์ž‘์—…์ค‘!
  2. ๋‚ด ์˜† ํŒ€์›A๊ฐ€ merge๊ฐ€ ๋์Œ.(์ฝ”๋“œ๊ฐ€ ์—…๋ฐํˆฌ ๋˜์—ˆ์–ด.)
  3. git checkout main / git pull origin main ํ•ด์„œ ๋ฐ›์•„์˜ค๊ธฐ
  4. ๊ทธ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋‚ด feature branch๋กœ ์˜ด
  5. ๊ทธ๋Ÿผ ์ด์ œ ๋‚ด๊บผ A๊บผ ๊ฐ™์ด ํ•ฉ์ณ์ค˜์•ผ ๋‚ด ์ฝ”๋“œ๊ฐ€ ์—…๋ฐํˆฌ ๋˜๊ฒ ์ง€?
  6. git rebase -i main ์ด๋ผ๊ณ  ์น˜๋ฉด -> ์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ pick, pick, pick์ฒ˜๋Ÿผ ๋œจ๊ฒ ์ง€?
  7. ๊ฐ€์žฅ ์œ„์—๊บผ๋งŒ pick์œผ๋กœ ๋‚จ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋Š” s๋กœ ๋‚จ๊ธฐ๊ณ (squash) :wq!ํ•ด์„œ ์ €์žฅ!
  8. ๊ทธ๋Ÿฌ๋ฉด, ์•„๊นŒ commit3๊ฐœ๋ฅผ ํ•ฉ์ณค์œผ๋‹ˆ๊นŒ ๊ฐ๊ฐ์˜ ๋‚ด์šฉ์ด ์žˆ์„๊ฑฐ์•„๋ƒ?
  9. ๊ทธ๋Ÿผ ๊ทธ๊ฑฐ์— ๋Œ€ํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ตœ์ข… commit message๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผํ•ด.
  10. ์ด๋ ‡๊ฒŒ commit message ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์ค˜์•ผํ•จ! :wqํ•˜๊ณ  ๋น ์ ธ๋‚˜์˜ค๊ธฐ.
  11. "Successfully rebased!"๋ผ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋ฉด ๊ตฌ์›ƒ~
  12. git log ๋กœ ์ซ˜์•… ํ™•์ธํ•ด์ฃผ๊ณ !
  13. ๋‹ค์Œ ์ž‘์—… ์ด์–ด๋‚˜๊ฐ€์ฃผ๊ธฐ.

๐Ÿจ rebase ํ›„ push! ๐Ÿจ

  • ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋งํ•˜์ง€๋งŒ rebase๋Š” commit history๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์—ญํ• .
    commit message๋ฅผ ์ •๋ฆฌํ•ด์ฃผ๋‹ˆ๊นŒ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์œผ๋กœ ์ƒ๊ฐํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ !

  • ๊ทธ๋Ÿด ๋•Œ๋Š” <git push origin feature/login -f> ๋ช…๋ น์–ด!

  • ์ผ๋‹จ ๋จผ์ € push ํ•ด๋ณด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ๊ฒฝ์šฐ, push -f ํ•ด์ฃผ๊ธฐ!

๐Ÿจ ์ถฉ๋Œ์ด ๋‚˜๋ฉด? ๐Ÿจ

  1. ์ถฉ๋Œ์ด ์ผ์–ด๋‚œ ๊ฒฝ์šฐ ๋‹นํ™ฉํ•˜์ง€๋ง๊ณ !

    ์ด๋Ÿฐ์‹์œผ๋กœ ์ถฉ๋Œ๋‚œ ์ปค๋ฐ‹์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๋ฉ”์‹œ์ง€๊ฐ€ ๋œฐ๊ฑฐ์•ผ.
    ๊ทธ๋Ÿผ ๊ทธ ์ถฉ๋Œ๋‚œ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•ด์ฃผ๋ฉด ๋จ.
  2. git add ํ•˜๊ธฐ. (git commit๊นŒ์ง€ ํ• ํ•„์š”๋Š” ์—†์–ด.)
  3. git rebase __continue ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ
  4. ๊ทผ๋ฐ ๋˜ ์ถฉ๋Œ๋‚˜๋ฉด? ๋˜ git add -> git rebase __continue.. ๋ฐ˜๋ณต!
  5. ๋งˆ์ง€๋ง‰ ์ถฉ๋Œ๊นŒ์ง€ ํ•ด๊ฒฐ๋˜๋ฉด successfully rebased! ํ•˜๊ณ  ๋๋‚จ!
  6. ๊ทผ๋ฐ ๊ณ„์† ํ•ด๊ฒฐ์ด ์•ˆ๋˜๋ฉด, git rebase __abort ๋กœ ์•„์˜ˆ rebase๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์ „ ์ƒํ™ฉ์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค!
  • ๋ฉ”์ธ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—… ๋…ธ!
    ๐Ÿ˜ญ ๊ฑฐ๊ธฐ์„œ ์ž‘์—…ํ•˜๋ฉด ์•ˆ๋ผ.. ์ •๋ง๋ฅ˜ ๐Ÿ˜ญ
  • ๋ฆฌ๋ฒ ์ด์Šค ์ƒํ™ฉ์•Œ๊ณ  ์‹ถ์œผ๋ฉด git status ์ณ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ์Œ.

๐Ÿจ git ๋ช…๋ น์–ด ๐Ÿจ

git reset soft vs hard
git log
git reflog
git checkout
git stash & git stash apply & git stash clear

๐Ÿจ git ์‹ค์Šต! ๐Ÿจ

  1. clone๋จผ์ € ๋ฐ›๊ณ !
  2. ํŒŒ์ผ๋“ค์–ด๊ฐ€์„œ, feature/rebase ๋งŒ๋“ค์–ด์„œ ๊ฑฐ๊ธฐ๋ฃจ ๋“ค์–ด๊ฐ€
  3. commit 5๊ฐœ ์ •๋„ ๋งŒ๋“ค๊ธฐ
  4. ๋ˆ„๊ตฐ๊ฐ€ ๋ฉ”์ธ์—์„œ ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋งŒ๋“ค์–ด์„œ ํ‘ธ์‹œํ•จ.
  5. ๊ทธ๊ฑธ ํ’€๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด git checkout main ํ•ด์„œ git pull origin main ๋ฐ›์•„์˜ค๊ธฐ(main์—์„œ ํ’€๋ฐ›๋Š”๊ฑฐ์•ผ..)
  6. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ๋‚ด feature/rebase๋กœ ๋Œ์•„์˜ค๊ธฐ
  7. ๋‚ด๊ฐ€ ํ•œ 5๊ฐœ ์ปค๋ฐ‹์ด๋ž‘ ํ’€๋ฐ›์•„์˜จ๊ฑฐ ๋‹ค ํ•ฉ์ณ์ค˜์•ผํ•˜๋‹ˆ๊นŒ git rebase -i mainํ•˜๋ฉด! ์Šค์ฟผ์‹œ s๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ~~
  8. :wqํ•˜๊ณ  ๋‚˜๊ฐ€๋ฉด ์•„๋ž˜ ํ™”๋ฉด์ฒ˜๋Ÿผ ๋œฌ๋‹ค.
  9. ์ด์ œ ์—ฌ๊ธฐ์— ์ตœ์ข… commit message๋ฅผ ์ ์–ด์ฃผ๋ฉด๋จ!

    tip) esc๋ˆ„๋ฅธ์ƒํƒœ์—์„œ dd ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ํ•œ๋ฒˆ์— ์ง€์›Œ์ง~!
  10. ์จ”๋ž€- ์„ฑ๊ณต์ ์ด๋ผ๊ณ  ๋œจ์ง€? ํ›Ÿใ…Žใ…Žใ…Ž....^^
  11. ์š”๊ธฐ์„œ git push origin feature/rebase ๋ฅผ ํ•˜๊ณ , pr์„ ์˜ฌ๋ฆฌ๋ฉด,

    ์š”๋ ‡๊ฒŒ ์ž˜ ๋œธ ^^
  • ์ด๋ฏธ ๋‹ค ๋๋‚œ ์ƒํƒœ์—์„œ, ํ•œ๋ฒˆ ๋” ์ปค๋ฐ‹ํ•  ์ผ์ด ์ƒ๊ฒผ๋‹ค?
  • ๋˜‘๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ๊ณ  add commit rebase ํ•ด์ฃผ๋ฉด ๋จ -> ์ด์ œ push! git push origin featrue/rebase :>
  • ์—๋Ÿฌ๊ฐ€ ๋œจ๋‹ˆ๊นŒ git push origin featrue/rebase -f ๋กœ ์ง„ํ–‰ํ•ด์ฃผ๋ฉด๋จ!
    ๐ŸŒ git rebase ์™„๋ฃŒ ์ถ”์นดํฌ์นด! ๐ŸŒ

๐Ÿ‘ฝ ๋ฉด์ ‘์งˆ๋ฌธ?

๐Ÿฅ ๊นƒ ๋ฆฌ๋ฒ ์ด์Šค / ๋จธ์ง€์˜ ์ฐจ์ด์ 

  • git rebase๋Š” git merge์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ํ•ฉ์น˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ git rebase๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด git merge๋กœ mergeํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•˜๊ฒŒ ๋‚จ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ž‘์—…์„ ๋ณด๊ธฐ๊ฐ€ ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.
    Merge๋Š” Merge commit ๊ธฐ๋ก์ด ์ถ”๊ฐ€๋กœ ๋‚จ๊ฒŒ ๋˜์ง€๋งŒ Rebase์˜ ๊ฒฝ์šฐ์—๋Š” branch ๋ณ‘ํ•ฉ ์‹œ Merge commit ๊ธฐ๋ก์ด ๋‚จ์ง€ ์•Š์•„ ๋งˆ์น˜ ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์ง„๋‹ค.

๐Ÿ™ rebase ๐Ÿ™

๐Ÿ™ merge ๐Ÿ™

๐Ÿฅ ๊นƒ ์Šค์ฟผ์‹œ๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ , ์™œ์“ฐ๋Š”๊ฐ€?

  • git squash๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ git rebase์˜ ๊ณผ์ • ์ค‘ ํ•˜๋‚˜๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊นƒ ์Šค์ฟผ์‹œ๋Š” ๊นƒ ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์—ฌ๋Ÿฌ ์ปค๋ฐ‹๋“ค์„ 's'๋กœ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ ์ €์žฅํ•˜๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

๐Ÿฃ ์ข€ ๋” ์ž์„ธํžˆ!
git rebase๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ปค๋ฐ‹์˜ base๋ฅผ ๋‹ค์‹œ(re) ์ •ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž…๋ ฅํ–ˆ๋˜ $ git rebase master dev๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด โ€œmaster์™€ dev ๋ธŒ๋žœ์น˜์˜ ๊ณตํ†ต ์กฐ์ƒ ์ปค๋ฐ‹๋ถ€ํ„ฐ dev ๋ธŒ๋žœ์น˜๊นŒ์ง€์˜ ๋ชจ๋“  ์ปค๋ฐ‹์˜ base๋ฅผ master ๋ธŒ๋žœ์น˜์˜ ์œ„์น˜๋กœ ๋ฐ”๊พธ์–ด๋ผโ€๋ผ๋Š” ์˜๋ฏธ์ธ ๊ฒƒ์ด์ฃ . ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— master์™€ dev์˜ ๊ณตํ†ต ์กฐ์ƒ ์ปค๋ฐ‹์ธ C1๋ถ€ํ„ฐ dev์—๋งŒ ์žˆ์—ˆ๋˜ C4, C5 ์ปค๋ฐ‹๋“ค์ด master ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋˜ C3์„ base๋กœ ํ•˜์—ฌ ๋‹ค์‹œ ์ ์šฉ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

profile
๊ฐœ๋ฐœ ๊ธฐ๋ก

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 7์›” 26์ผ

๋งŽ์€ ๋„์›€ ์–ป๊ณ ๊ฐ‘๋‹ˆ๋‹ค..์ด์ด.. ์ง„์งœ ์ •๋ฆฌ ๋„ˆ๋ฌด ์ž˜ํ•ด..

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ