[Github] - issue & PR(Pull Request) & Merge

CodeByHanยท2025๋…„ 4์›” 29์ผ
1

๊นƒํ—ˆ๋ธŒ

๋ชฉ๋ก ๋ณด๊ธฐ
6/6

๋ชจ๋ฅด๋Š” ๊ฑธ ์ฆ๊ธฐ์ž!
์ด๋ฒˆ์— ์ฒ˜์Œ์œผ๋กœ ์ œ๋Œ€๋กœ ๋œ ํ˜‘์—…์„ ๊ฒฝํ—˜ํ•˜๋ฉด์„œ ์ด์Šˆ, PR(Pull Request), Squash and Merge ๊ฐ™์€ ์šฉ์–ด๋“ค์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค. ๋‹จ์–ด๋“ค์€ ์ต์ˆ™ํ–ˆ์ง€๋งŒ, ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ณ  ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ํŒ€์› ๋•๋ถ„์— ๊ทธ ์˜๋ฏธ์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ํ˜‘์—…์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•๋„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๐Ÿค” ์ด์Šˆ(issue)?

๊นƒํ—ˆ๋ธŒ์— ๋ ˆํฌ์ง€ํ† ๋ฆฌ(Repository) ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด Issues ๋ผ๋Š” ๊ฒƒ์„ ๋งŽ์ด ๋ดค์„ ๊ฒƒ์ด๋‹ค. ์ด์Šˆ(Issue)? ๋ญ”๊ฐ€ ๋ฌด์–ธ๊ฐ€ ์•ˆ์ข‹์„์ผ์ด ์žˆ์„ ๋•Œ ์ปจ๋””์…˜ ์ด์Šˆ, ๋‚ ์”จ ์ด์Šˆ ๋ผ๋Š” ํ‘œํ˜„์„ ์ข…์ข… ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์•ˆ์ข‹์€ ํ‘œํ˜„๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

  • ์ด์Šˆ(issue)๋ž€ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•ด์•ผํ•  ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•ด์•ผํ•˜๋Š” ์ž‘์—…๋“ค(๊ฐœ๋ฐœํ•ด์•ผํ•˜๋Š” ๊ธฐ๋Šฅ, ๋ฒ„๊ทธ ๋ฐœ์ƒ, ๋ฆฌํŒฉํ„ฐ๋ง) ๋“ฑ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ˜‘์—…์„ ํ•  ๋•Œ, ๋ˆ„๊ฐ€ ์–ด๋–ค ์ž‘์—…์„ ํ•ด์•ผํ•˜๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ์ง„ํ–‰ํ–ˆ๋Š”์ง€๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜์žˆ์œผ๋ฉฐ, ๋‚˜์ค‘์— PR์„ ํ• ๋•Œ ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ์ ์–ด ์–ด๋–ค ์ž‘์—…์„ ํ–ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด์Šˆ(Issue)์˜ Flow

  1. A๋ผ๋Š” ์‚ฌ๋žŒ์ด ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ ๋ฐœ์ƒ

  2. ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ Issue ์ƒ์„ฑ(๊ธฐ๋Šฅ ์„ค๋ช… ์ž‘์„ฑ (๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€, ์™„๋ฃŒ ๊ธฐ์ค€ ๋“ฑ))

  3. develop ๋ธŒ๋žœ์น˜์—์„œ feature/ํšŒ์›๊ฐ€์ž…(feature/์ด์Šˆ๋ฒˆํ˜ธ)๊ฐ™์€ feature ๋ธŒ๋žœ์น˜๋กœ ๋ถ„๊ธฐ

  4. ์ƒ์„ฑํ•œ feature ๋ธŒ๋žœ์น˜์—์„œ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์ง„ํ–‰

  5. ๊ฐœ๋ฐœ ์™„๋ฃŒ ํ›„ PR(Pull Request) ์ƒ์„ฑ

  6. PR ์ œ๋ชฉ์ด๋‚˜ ๋ณธ๋ฌธ์— ์ด์Šˆ ๋ฒˆํ˜ธ ๋ช…์‹œ (ex: Closes #์ด์Šˆ๋ฒˆํ˜ธ)

๐Ÿค” ํ˜‘์—…์„ ํ•  ๋•Œ๋Š” ์ด์Šˆ(issue) ํ…œํ”Œ๋ฆฟ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“๊ณ  ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ ๋‚ด์šฉ์„ ์–ด๋–ป๊ฒŒ ์ ์„ ๊ฒƒ์ธ์ง€, ๋ธŒ๋žœ์น˜๋ฅผ ์ด์Šˆ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จ์‹œํ‚ฌ๊ฑด์ง€ ์ •ํ•ด ๋†“๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜์˜€๋‹ค.

PR(Pull Request)

์ž๊ธฐ๊ฐ€ ๋งก์€ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•œ ํ›„, ํŒ€์˜ dev ๋ธŒ๋žœ์น˜์— merge๋ฅผ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด PR(Pull Request)์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์œ„์— ์ด๋ฏธ์ง€๋Š” ๊ทธ๋ƒฅ "๋‚˜์˜ ๋กœ์ปฌ dev์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํŒ€์˜ dev ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ(merge)ํ• ๊ฑฐ๋‹ค." ๋ผ๋Š” ์˜๋ฏธ์ง€๋งŒ(๊ทธ๋ƒฅ ์ด๊ฑธ ์บก์ณํ•ด์˜ด) ์›๋ž˜๋ผ๋ฉด feat/8(์ด์Šˆ๋ฒˆํ˜ธ,๋˜๋Š” ์ž‘์—… ๋‚ด์šฉ) ๋ธŒ๋žœ์น˜๋ฅผ ํŒ€์˜ dev ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ(merge)ํ•˜๋Š” ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ‘ PR์˜ ์ œ๋ชฉ, ๋ณธ๋ฌธ ๋‚ด์šฉ๋„ ํŒ€๊ณผ ํ•จ๊ป˜ ์„œ๋กœ ๋งž์ถ”๊ฑฐ๋‚˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์ผ์‹œ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๐Ÿค” PR(Pull Request)์„ ์™œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ?

  1. ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์„œ
    โ†’ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๊ณ , ๋ฌธ์ œ๋‚˜ ๊ฐœ์„ ์ ์„ ์ฐพ์•„์ค€๋‹ค.
    โ†’ ์‹ค์ˆ˜๋ฅผ ์ค„์ด๊ณ , ๋” ์ข‹์€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  2. ํ˜‘์—… ํ๋ฆ„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์„œ
    โ†’ ๋ฐ”๋กœ ๋ฉ”์ธ(main/master) ๋ธŒ๋žœ์น˜์— ๋ฐ˜์˜ํ•˜์ง€ ์•Š๊ณ , ๊ฒ€ํ†  ํ›„ ๋ณ‘ํ•ฉํ•˜๋ฏ€๋กœ
    ์ฝ”๋“œ๊ฐ€ ๋ง๊ฐ€์ง€๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๊น”๋”ํ•˜๊ฒŒ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด
    โ†’ ์–ด๋–ค ๊ธฐ๋Šฅ/๋ฒ„๊ทธ ์ˆ˜์ •์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ๋ฌธ์„œ์ฒ˜๋Ÿผ ๊ธฐ๋ก๋œ๋‹ค.

  4. CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์—ฐ๊ณ„๋˜๊ธฐ ๋•Œ๋ฌธ์—
    โ†’ PR์ด ์˜ฌ๋ผ์˜ค๋ฉด ์ž๋™ ํ…Œ์ŠคํŠธ, ๋นŒ๋“œ ๋“ฑ์„ ๋Œ๋ ค์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ž๋™ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  5. ํŒ€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ˆ˜๋‹จ์œผ๋กœ์„œ๋„ ์œ ์šฉ
    โ†’ โ€œ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ๋” ์ข‹์€ ๋ฐฉ๋ฒ• ์—†์„๊นŒ์š”?โ€ ์‹์œผ๋กœ
    ํ”ผ๋“œ๋ฐฑ ์ฃผ๊ณ ๋ฐ›๋Š” ์žฅ์ด ๋œ๋‹ค.

Merge

๋ณ‘ํ•ฉ ๋ฐฉ์‹์ด ๋งŽ์€๊ฑธ ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ Squash and Merge๋Š” ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ณ‘ํ•ฉ ๋ฐฉ์‹๋„ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ์ •๋ฆฌํ• ๋ ค๊ณ  ํ•œ๋‹ค.

1) Merge

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ณ‘ํ•ฉ์ด๊ณ , ์ปค๋ฐ‹(Commit) ์ด๋ ฅ์„ ๋ชจ๋‘ ๋‚จ๊ธธ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
git merge my-branch
  • ์ด ๋ฐฉ์‹์€ ๋‹ค์‹œ Fast-Forward ๋ฐฉ์‹๊ณผ Recursive ๋ฐฉ์‹์œผ๋กœ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

1-1) Fast-Forward

์ƒํ™ฉ ์ •๋ฆฌ

  1. main ๋ธŒ๋žœ์น˜์—์„œ feature ๋ธŒ๋žœ์น˜๋ฅผ ๋ถ„๊ธฐํ•จ
  2. feature ๋ธŒ๋žœ์น˜์—์„œ ์•„๋ฌด ์ปค๋ฐ‹๋„ ํ•˜์ง€ ์•Š์Œ
  3. ๋‹ค์‹œ feature ๋ธŒ๋žœ์น˜๋ฅผ main์— ๋จธ์ง€ํ•จ

๐Ÿ”„ ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ๋ณ‘ํ•ฉ๋ ๊นŒ?
์ด ๊ฒฝ์šฐ feature ๋ธŒ๋žœ์น˜๋Š” ์‚ฌ์‹ค์ƒ main๊ณผ ๋™์ผํ•œ ์ƒํƒœ์ด๋ฏ€๋กœ
Git์€ ๊ทธ๋ƒฅ ๋ธŒ๋žœ์น˜ ํฌ์ธํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๊ธฐ๋งŒ ํ•œ๋‹ค.

์ฆ‰, feature ๋ธŒ๋žœ์น˜๊ฐ€ main์—์„œ ํ•œ ๋ฐœ์ง๋„ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€์ง€ ์•Š์•˜๋‹ค๋ฉด,
main ๋ธŒ๋žœ์น˜๋Š” ๊ทธ๋ƒฅ feature ๋ธŒ๋žœ์น˜ ์ปค๋ฐ‹๋“ค์„ ๋”ฐ๋ผ์žก๋Š” ์‹์œผ๋กœ merge

1-2) Recursive

  • feature๊ฐ€ main ๋ธŒ๋žœ์น˜์—์„œ ๋ถ„๊ธฐ๋˜๊ณ , main ๋ธŒ๋žœ์น˜์— ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ์ƒ๊ฒผ์„ ๊ฒฝ์šฐ,
    feature์™€ main์„ ๊ณตํ†ต ๋ถ€๋ชจ๋กœ ํ•œ ์ƒˆ๋กœ์šด Merge ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹

2) Squash Merge

  • feature ๋ธŒ๋žœ์น˜์˜ ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์ด ๋ชจ๋‘ ํ•ฉ์ณ์ ธ ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ๋งŒ๋“ค๊ณ  ๋‚œ ๋‹ค์Œ ์ด์ „ ์ปค๋ฐ‹ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ง€์šฐ๋Š” ๋ณ‘ํ•ฉ ๋ฐฉ์‹
  • ๊ธฐ์กด ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ–ˆ๋Š”๊ฐ€ ๋ณด๋‹ค merge๊ฐ€ ๋˜์—ˆ๋‹ค์— ์ข€ ๋” ์ง‘์ค‘ํ•œ ์ „๋žต
  • ์ผ๋ฐ˜์ ์ธ merge๋ณด๋‹ค ๋‚จ์•„์žˆ๋Š” ์ •๋ณด๋Ÿ‰์ด ๋น„๊ต์  ์ ๊ธฐ ๋•Œ๋ฌธ์— merge log๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์ง€๋งŒ ์–ธ์ œ ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟจ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์žƒ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ 

3) Rebase Merge

  • feature ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ๋‚ด์šฉ์„ main ๋ธŒ๋žœ์น˜์— ์žฌ๋ฐฐ์น˜ํ•˜๊ณ  ์ถ”๊ฐ€ ์ปค๋ฐ‹ ์—†์ด ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹
  • merge๋ฅผ ํ•˜๋ฉด base๊ฐ€ ๋ฐ”๋€Œ์ง€๋Š” ์•Š์ง€๋งŒ, rebase๋Š” ๋‹จ์–ด ๊ทธ๋Œ€๋กœ base๋ฅผ ๋ฐ”๊ฟ”์„œ ๋ณ‘ํ•ฉ
git checkout feature
git rebase main
git checkout main
git merge feature
  • rebase?
  • ๋ง ๊ทธ๋Œ€๋กœ base๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•œ๋‹ค๋Š” ์˜๋ฏธ
  • feature๊ฐ€ ๋ถ„๊ธฐ๋œ main ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹
  • rebase๋ฅผ ํ•˜๋ฉด ๊ธฐ์กด ๋ถ„๊ธฐ์ ์ด์—ˆ๋˜ A ์ปค๋ฐ‹์—์„œ ๊ฐ€์žฅ ์ตœ์‹  ์ปค๋ฐ‹์ธ C๋กœ base๊ฐ€ ์„ค์ •

๐Ÿค” base๋ž€ โ€œ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐˆ๋ผ์ ธ ๋‚˜์˜จ ์ง€์ โ€ ์ฆ‰ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋ธŒ๋žœ์น˜์˜ ๊ณตํ†ต ์กฐ์ƒ(commit) ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ฐธ๊ณ 

profile
๋…ธ๋ ฅ์€ ๋ฐฐ์‹ ํ•˜์ง€ ์•Š์•„ ๐Ÿ”ฅ

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