Post

[Git] 6. rebase & cherry-pick

๐Ÿš€ rebase


  • git rebase๋Š” ํ•œ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹๋“ค์„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹ ์œ„์— โ€œ์žฌ๋ฐฐ์น˜โ€ํ•˜์—ฌ ์„ ํ˜•์ ์ธ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ช…๋ น
  • ์ฆ‰, ์–ด๋–ค ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ ๋’ค์— ๋ถ™์ด๋Š” ๊ฒƒ

๐Ÿš€ rebase ์ฃผ์š” ๋ชฉ์ 


  • ํžˆ์Šคํ† ๋ฆฌ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€
    ๋ณต์žกํ•œ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ์—†์ด ์„ ํ˜•์ ์ธ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ, ํ”„๋กœ์ ํŠธ์˜ ์ด๋ ฅ์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ์ž‘์—… ๋ธŒ๋žœ์น˜ ์ตœ์‹ ํ™”
    ๊ฐœ๋ฐœ ์ค‘์ธ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ main ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋‚ด์šฉ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ถฉ๋Œ์„ ๋ฏธ๋ฆฌ ํ•ด๊ฒฐํ•˜๊ณ  ๊น”๋”ํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•œ๋‹ค.

๐Ÿš€ rebase ์ž‘๋™ ๋ฐฉ์‹


git rebase <๋Œ€์ƒ ๋ธŒ๋žœ์น˜> ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ํ˜„์žฌ ๋ธŒ๋žœ์น˜์—์„œ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์™€์˜ ๊ณตํ†ต ์กฐ์ƒ ์ปค๋ฐ‹ ์ดํ›„์˜ ๋ชจ๋“  ์ปค๋ฐ‹๋“ค์„ ์ž„์‹œ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๋ธŒ๋žœ์น˜์˜ ์‹œ์ž‘์ ์„ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์ด๋™์‹œํ‚จ ํ›„, ๋ถ„๋ฆฌํ–ˆ๋˜ ์ปค๋ฐ‹๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ๋‹ค์‹œ ์ ์šฉํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๊ฐ ์ปค๋ฐ‹์˜ ํ•ด์‹œ(SHA-1)๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.

์˜ˆ์‹œ

1
2
3
--- A --- B --- C (main)
           \
            D --- E (feature)

feature ๋ธŒ๋žœ์น˜์—์„œ main ๋ธŒ๋žœ์น˜๋กœ rebase๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด (git switch feature ํ›„ git rebase main)

  1. D, E ์ปค๋ฐ‹์„ ์ž„์‹œ๋กœ ๋ถ„๋ฆฌ
  2. feature ๋ธŒ๋žœ์น˜์˜ ์‹œ์ž‘์ ์„ C ์ปค๋ฐ‹์œผ๋กœ ์ด๋™
  3. D์™€ E ์ปค๋ฐ‹์„ C ์ปค๋ฐ‹ ์œ„์— ๋‹ค์‹œ ์ ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹ D+, E+๋ฅผ ์ƒ์„ฑ

๊ฒฐ๊ณผ

1
--- A --- B --- C --- D+ --- E+ (main, feature)

์žฅ์ 

  • ์„ ํ˜•์ ์ธ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ
  • ํžˆ์Šคํ† ๋ฆฌ ์ •๋ฆฌ
    interactive rebase (git rebase -i)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ฑฐ๋‚˜, ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ์ปค๋ฐ‹ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค

๋‹จ์ 

  • ๊ธฐ์กด ์ปค๋ฐ‹์˜ ํ•ด์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๊ณต์œ ๋œ(push๋œ) ๋ธŒ๋žœ์น˜์—์„œ๋Š” ์ ˆ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ž‘์—…๊ณผ ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๊ฑฐ๋‚˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณต์žก์„ฑ
    ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ merge ๋ณด๋‹ค ํ•ด๊ฒฐ ๊ณผ์ •์ด ์กฐ๊ธˆ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿš€ cherry-pick


  • git cherry-pick <์ปค๋ฐ‹ ํ•ด์‹œ> ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์ง€์ •๋œ ์ปค๋ฐ‹์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์ ์šฉํ•œ๋‹ค.
  • ์›๋ณธ ์ปค๋ฐ‹์˜ ํ•ด์‹œ๋Š” ์œ ์ง€๋˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ์ƒ์„ฑ๋œ๋‹ค.

์˜ˆ์‹œ

1
2
3
--- A --- B --- C (main)
           \
            D --- E --- F (feature)

main ๋ธŒ๋žœ์น˜์—์„œ feature ๋ธŒ๋žœ์น˜์˜ E ์ปค๋ฐ‹๋งŒ cherry-pick ํ•˜๋ ค๋ฉด (git switch main ํ›„ git cherry-pick E_COMMIT_HASH)

๊ฒฐ๊ณผ

1
2
3
--- A --- B --- C --- E+ (main)
           \
            D --- E --- F (feature)
  • ์—ฌ๊ธฐ์„œ E_COMMIT_HASH๋Š” E ์ปค๋ฐ‹์˜ ์‹ค์ œ ํ•ด์‹œ ๊ฐ’์ด๋‹ค.
  • E+ ๋Š” E ์ปค๋ฐ‹์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‹ด๊ณ  ์žˆ๋Š” main ๋ธŒ๋žœ์น˜์— ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์ปค๋ฐ‹

์žฅ์ 

  • ์„ ํƒ์  ์ ์šฉ
    ํ•„์š”ํ•œ ์ปค๋ฐ‹๋งŒ ์ •ํ™•ํžˆ ์„ ํƒํ•˜์—ฌ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์•ˆ์ •์„ฑ
    ๊ธฐ์กด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜์—ฌ ์ ์šฉํ•˜๋ฏ€๋กœ ์ด๋ฏธ ๊ณต์œ ๋œ ๋ธŒ๋žœ์น˜์—์„œ๋„ ์ƒ๋Œ€์ ์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ํžˆ์Šคํ† ๋ฆฌ ์ค‘๋ณต
    ๊ฐ™์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜์— ์„œ๋กœ ๋‹ค๋ฅธ ์ปค๋ฐ‹์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์–ด ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋‹ค์†Œ ์ง€์ €๋ถ„ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ค์šฉ ์‹œ ๋ณต์žก์„ฑ
    ๋„ˆ๋ฌด ์ž์ฃผ ์‚ฌ์šฉํ•˜๋ฉด ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ๋‚˜์ค‘์— ๋ณ‘ํ•ฉ ์‹œ ์ถฉ๋Œ ํ•ด๊ฒฐ์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

ยฉ Hoon. Some rights reserved.