[์†๋‹ฅ์†๋‹ฅ] ๐Ÿ˜‚ ์šฐ๋‹นํƒ•ํƒ• Squash Merge ํ›„ Rebase ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…๊ธฐ

betterfuture4ยท2022๋…„ 8์›” 22์ผ
2

์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค

๋ชฉ๋ก ๋ณด๊ธฐ
23/30
post-thumbnail

0. intro

์ด๋ฒˆ์— ์†๋‹ฅ์†๋‹ฅ์€ feature-dev ๊ฐ„ pr ๋ณ‘ํ•ฉ ์‹œ squash merge ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด dev ์ปค๋ฐ‹๊ธฐ๋ก์„ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!๐Ÿ‘


1. ๋ฌธ์ œ์ƒํ™ฉ

1) main์— squash merge

๋‹ค์Œ์€ ์ €ํฌ๊ฐ€ main์— squash merge๋ฅผ ํ–ˆ๋˜ ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด main ์ปค๋ฐ‹๋“ค์ด ๋‚ ์•„๊ฐ„ ๊ด€๊ณ„๋กœ ๊ฐ„๋‹จํžˆ ๋„์‹ํ™”ํ•ด ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. main์— hotfix ์ปค๋ฐ‹์„ ์ถ”๊ฐ€ dev์—์„œ ๊ธฐ๋Šฅ(d1, d2) ๊ตฌํ˜„
  2. dev ์ปค๋ฐ‹๋“ค(d1, d2)์„ main์œผ๋กœ squash merge
  3. dev์—์„œ ์ดํ›„ ๊ธฐ๋Šฅ๋“ค(d3, d4) ๊ตฌํ˜„
  4. dev ์ปค๋ฐ‹๋“ค(d3, d4)์„ main์œผ๋กœ squash merge ๋ถˆ๊ฐ€!

๋ฌธ์ œ๋Š” 4๋ฒˆ, main-dev ๊ฐ„ ๋ณ‘ํ•ฉ ์‹œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. (2๋ฒˆ) ๊ธฐ์กด์˜ dev ๋ณ€๊ฒฝ์‚ฌํ•ญ(1-2)์„ main์œผ๋กœ squash merge ํ•œ ์ƒํ™ฉ์—์„œ
  2. (4๋ฒˆ) ์ดํ›„ ๋ณ€๊ฒฝ์‚ฌํ•ญ(3-4)์„ main์— ์ถ”๊ฐ€ merge ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.(์ •ํ™•ํžˆ๋Š”, dev๋ฅผ main์œผ๋กœ rebase ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.)

์ž๋™์œผ๋กœ main์˜ squash merge๋œ ์ปค๋ฐ‹(1-2) ์ดํ›„์— d3, d4 ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ƒˆ ์ปค๋ฐ‹์œผ๋กœ ๋ถ™์—ฌ์ฃผ๋ฆฌ๋ผ ์˜ˆ์ƒํ–ˆ๋Š”๋ฐ ๊ทธ๋Ÿฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊นƒ์€ โ€œ3-4 ๋ณ€๊ฒฝ์‚ฌํ•ญโ€์ด โ€œ1-2 squash ์ปค๋ฐ‹โ€ ์ดํ›„ ๋ฐœ์ƒํ–ˆ์Œ์„ ์ธ์ง€ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ์ด์ฃ .

๊ด€๋ จ ์„ค๋ช… : https://stackoverflow.com/questions/9920182/rebasing-after-squash-merge

์†Œ์ŠคํŠธ๋ฆฌ๋กœ ๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค.
๋ณด์‹œ๋‹ค์‹œํ”ผ, Dev(#3)์€ dev pr1(d1), dev pr2(d2)๊ฐ€ squash๋œ ์ƒํƒœ์ด์ง€๋งŒ ๊นƒ์—์„œ๋Š” ๋ถ„๊ธฐ๊ฐ€ ๋‚˜๋ˆ ์ ธ ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ๐Ÿ‘€

2) dev์— hotfix ๋ฏธ๋ฐ˜์˜

๋ญ”๊ฐ€ ์ด์ƒํ•œ ์ ์ด ํ•˜๋‚˜ ๋” ์žˆ์ง€ ์•Š๋‚˜์š”? ์œ„ ์ถฉ๋Œ์—๋Š” hotfix ์ปค๋ฐ‹์ด ๋” ์–ฝํ˜€์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, dev์— main์˜ hotfix๊ฐ€ ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜๋˜ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค.๐Ÿ™€

๊นƒ์—์„œ dev์™€ main์˜ ๊ณตํ†ต์กฐ์ƒ์ด d2๊ฐ€ ์•„๋‹Œ Initial commit์ธ ์ด์œ ๋Š”

์ฒซ๋ฒˆ์งธ๋กœ ์ดˆ๋ฐ˜ hotfix ๋ณ‘ํ•ฉ ๋•Œ๋ฌธ์ด๊ณ  (๋‹น์—ฐํžˆ hotfix ๋ณ‘ํ•ฉ์œผ๋กœ ์ค‘๊ฐ„์— ์ƒˆ ์ปค๋ฐ‹์ด ์ƒ๊ฒผ๋‹ค๋ฉด, ๊ณตํ†ต์กฐ์ƒ์ด dev pr2๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

๋‘๋ฒˆ์งธ๋กœ squash merge ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (squash merge๋œ ์ปค๋ฐ‹์€ ์ตœ์ข…์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ž…๋‹ˆ๋‹ค. ๊ณตํ†ต์กฐ์ƒ์ด main์— ์—†๋Š” dev pr2๊ฐ€ ๋  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.)

๋‘ ๋ฌธ์ œ๋กœ ์ธํ•ด main ๋ธŒ๋žœ์น˜์™€ dev ๋ธŒ๋žœ์น˜๋Š” ๋งŒ๋‚˜์ง€ ๋ชปํ•  ๊ฐ•์„ ๊ฑด๋„œ์Šต๋‹ˆ๋‹คโ€ฆ

2. ์ถฉ๋Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์ €ํฌ๋Š” ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ์—ฐ๊ตฌํ–ˆ๊ณ , ๋‹ค์Œ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 1 : ์—ฐ์‡„ revert

๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•(์ถฉ๋Œ์ด ๊ฐ€์žฅ ์ ์Œ)

revert๋Š” ์ปค๋ฐ‹์˜ ๋‚ด์šฉ์„ ๋˜๋Œ๋ฆฌ๋Š” ์ปค๋ฐ‹์„ ์ƒˆ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  1. ๊ธฐ์กด main์˜ hotfix/squash merged ์ปค๋ฐ‹๋“ค์„ ์—ญ์ˆœ์œผ๋กœ revert
  2. ์ตœ์ข…์ ์œผ๋กœ dev ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ๋˜๋„๋ก ์„ธํŒ…
  3. main ๋ธŒ๋žœ์น˜์— dev ์ปค๋ฐ‹๋“ค์„ ๊ฐ€์ ธ์˜จ๋‹ค.
    1. ์ฒซ ์ปค๋ฐ‹์— ๋Œ€ํ•ด ๊ฐœํ–‰ ๊ด€๋ จ conflict๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
      1. ๋‹นํ™ฉํ•˜์ง€๋ง๊ณ  ๋“ค์–ด์˜ค๋Š”(dev) ์ปค๋ฐ‹ ์ƒํƒœ๋กœ ํ†ต์ผํ•ด ์„ธํŒ…ํ•œ๋‹ค.
    2. rebase๋ฅผ ํ†ตํ•ด dev ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ์ปค๋ฐ‹๋“ค์„ ๊ฐ€์ ธ์˜ค๊ธฐ
  4. ๋งˆ์ง€๋ง‰์œผ๋กœ hotfix ์ˆ˜์ •์‚ฌํ•ญ์„ main์— ๋‹ค์‹œ rebase/cherry pick์œผ๋กœ ๋ฐ˜์˜ํ•œ๋‹ค

์žฅ์ 

  • main ๋ธŒ๋žœ์น˜์—์„œ ์ผ์–ด๋‚œ ์ผ๋“ค์„ ์ปค๋ฐ‹ ๊ธฐ๋ก์„ ํ†ตํ•ด ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • hotfix ์ปค๋ฐ‹์„ ์ œ์™ธํ•˜๋ฉด, ๊ฐ€์žฅ ์ ์€ conflict๋ฅผ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋œ๋‹ค.
    • ๊ฐœํ–‰ ๊ด€๋ จ conflict ์ด์Šˆ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด conflict ์—†์ด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • force push ์—†์ด ๋ฌธ์ œ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.(๊ธฐ์กด ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.)

๋‹จ์ 

  • main์— revert ๊ธฐ๋ก์ด ๋‚จ๋Š”๋‹ค.
  • main์— ๋ฐ˜์˜ํ–ˆ๋˜ hotfix ์ปค๋ฐ‹๋“ค์„ ๋‹ค์‹œ ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋ฐฉ๋ฒ• 2 : cherry pick

main ๋ธŒ๋žœ์น˜๋ฅผ ๋น„๊ต์  ์•ˆ์ „ํ•˜๊ณ  ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. ๊ธฐ์กด main์—์„œ squash merge ์ปค๋ฐ‹์˜ ๋งˆ์ง€๋ง‰ ๋ฐ˜์˜์‚ฌํ•ญ์„ ํ™•์ธํ•œ๋‹ค.
  2. ํ•ด๋‹น ๋ฐ˜์˜์‚ฌํ•ญ ํ›„ dev ์ฒซ ์ปค๋ฐ‹ ์ดํ›„ ๋ชจ๋‘ cherry pick/rebase -i ์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค
    1. ์—ฐ์‡„ conflict๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    2. ์ปค๋ฐ‹ ๋ณ„ conflict๋ฅผ ๋ชจ๋‘ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค!

์žฅ์ 

  • main ๋ธŒ๋žœ์น˜์— revert ์ปค๋ฐ‹์ด ์•ˆ ๋‚จ๋Š”๋‹ค.
  • conflict๋งŒ ํ•ด๊ฒฐํ•˜๋ฉด main ๋ธŒ๋žœ์น˜๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์›ํ–ˆ๋˜ ํ˜•ํƒœ(hotfix-release1-release2)๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • force push ์—†์ด ๋ฌธ์ œ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.(๊ธฐ์กด ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.)

๋‹จ์ 

  • ์—ฐ์‡„ conflict๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋ฉฐ ์ค‘๊ฐ„์— ์‹ค์ˆ˜๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • dev์˜ ์ˆ˜์ •๋œ ์ปค๋ฐ‹ ์–‘์ด ๋งŽ์„ ์‹œ, cherry pick์„ ์“ธ ๋•Œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.
  • ์ค‘๊ฐ„์— dev ๋ธŒ๋žœ์น˜๊ฐ€ rebase๊ฐ€ ์•„๋‹Œ merge๋กœ ๊ด€๋ฆฌ๋˜์—ˆ์„ ์‹œ ๊ด€๋ฆฌ๊ฐ€ ๋” ๊นŒ๋‹ค๋กœ์›Œ์ง„๋‹ค.

๋ฐฉ๋ฒ• 3 : force-push

main ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€์žฅ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์†Œ ์œ„ํ—˜ํ•œ ๋ฐฉ๋ฒ•

  1. dev์— ๊ธฐ์กด main์˜ hotfix ๊ด€๋ จ commit์„ cherry pick์œผ๋กœ ๋ฐ˜์˜ํ•œ๋‹ค
    1. ๊ด€๋ จ conflict๋ฅผ ๋ชจ๋‘ ํ•ด๊ฒฐํ•œ๋‹ค.
  2. ํ•ด๋‹น dev๋ฅผ main์— force push ํ•œ๋‹ค.

์žฅ์ 

  • ๊ฐ€์žฅ ๊ฐ„ํŽธํ•˜๋‹ค. main ์ปค๋ฐ‹ ๊ธฐ๋ก๋„ ๊ฐ€์žฅ ๊น”๋”ํ•ด์ง„๋‹ค

๋‹จ์ 

  • force push๋ฅผ ํ•ด์•ผํ•œ๋‹คโ€ฆ ์œ„ํ—˜ํ•˜๋‹ค.
  • ๊ธฐ์กด main ์ปค๋ฐ‹ ๊ธฐ๋ก๋“ค์ด ๋‚ ์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

3. ๊ฒฐ๋ก 

1) force push๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ–ˆ๋‹ค

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

1๋ฒˆ ๋ฐฉ๋ฒ•์€ ์ตœ์ข…์ ์œผ๋กœ ์ƒ๊ฐํ•ด๋‚ด๋Š” ๋ฐ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ณ , ๊ฐœํ–‰ ๊ด€๋ จ conflict ์ฒ˜๋ฆฌ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

2๋ฒˆ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ main์˜ 1.1 release ์ดํ›„ dev์— ์ปค๋ฐ‹๋œ ์ผ๋ถ€ feature์˜ ๊ฒฝ์šฐ squash merge๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ merge๋กœ ํ†ตํ•ฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•œ ์ฒด๋ฆฌํ”ฝ์ด ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.(์ฒด๋ฆฌํ”ฝ ํ•  ์ปค๋ฐ‹ ์ˆ˜๊ฐ€ 70์—ฌ๊ฐœ์— ๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.)

๋”ฐ๋ผ์„œ ๋ฐฐํฌ๋ฅผ ์•ž๋‘” ์ƒํ™ฉ์—์„œ force push๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ์ถฉ๋Œ ์ƒํ™ฉ์—์„  force push๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” 1, 2๋ฒˆ ๋ฐฉ๋ฒ•๋“ค์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

2) ์•ž์œผ๋กœ ์ง€์ผœ์•ผ ํ•  ํŒ€ ์ปจ๋ฒค์…˜

devโ†’main pr ์‹œ squash merge๋ฅผ ํ•˜์ง€ ๋ง์ž!
(์ด๋ฏธ featureโ†’dev์—์„œ squash merge๋กœ ์ปค๋ฐ‹๋“ค์ด ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค.)

main์— hotfix๋ฅผ ๋ฐ˜์˜ํ–ˆ๋‹ค๋ฉด, ๊ธฐ์กด dev์—๋„ hotfix๋ฅผ ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค.
(์ฆ‰, main๊ณผ dev์˜ ๊ณตํ†ต์กฐ์ƒ์ด hotfix๊ฐ€ ๋˜๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.)
์•„๋‹ˆ๋ฉด main์„ dev๋กœ force-push ํ•˜๊ฑฐ๋‚˜ dev๋ฅผ ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
(์ด๋•Œ ๊ธฐ์กด pr๋“ค์˜ merge ํƒ€๊ฒŸ์„ dev๋กœ ์žฌ์กฐ์ • ํ•ด์•ผ ํ•œ๋‹ค.)

๋˜๋„๋ก main์— force push๋ฅผ ํ•˜์ง€ ๋ง์ž!

4. ์ฐธ๊ณ ์ž๋ฃŒ

squash merge ๊ด€๋ จ

Rebasing after squash merge?
[Git] Squash and Merge ํ›„ Rebase๋ฅผ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

force push ๊ด€๋ จ

Why is it dangerous to do a force-push against a remote repository?

revert ๊ด€๋ จ

git revert ์‚ฌ์šฉ๋ฒ•: ์ด๋ฏธ ์ปค๋ฐ‹ํ•œ ๋‚ด์šฉ์„ ๋˜๋Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•
Learn Git Branching

์†๋‹ฅ์†๋‹ฅ ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ

Squash Merge ํ›„ Rebase์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •๐Ÿ˜‚

profile
๐ŸŒฑ ํ•จ๊ป˜ ์ž๋ผ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค ๐Ÿš€ rerub0831@gmail.com

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