๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐ŸŒˆ Chapter 3: Git ๋ธŒ๋žœ์น˜

๐Ÿฆ„ ๋ธŒ๋žœ์น˜๋ž€ ๋ฌด์—‡์ธ๊ฐ€โ€‹

๐Ÿฃ ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑํ•˜๊ธฐโ€‹

git branch ๋ช…๋ น์œผ๋กœ testing ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ

> git branch testing

์ƒˆ๋กœ ๋งŒ๋“  ๋ธŒ๋žœ์น˜๋„ ์ง€๊ธˆ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ง€๊ธˆ ์ž‘์—… ์ค‘์ด ๋ธŒ๋žœ์น˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ Git์€ ์–ด๋–ป๊ฒŒ ํŒŒ์•…ํ• ๊นŒ. ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ๋Š” ๋‹ฌ๋ฆฌ Git์€ HEAD๋ผ๋Š” ํŠน๋ณ„ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋‹ค. ์ด ํฌ์ธํ„ฐ๋Š” ์ง€๊ธˆ ์ž‘์—…ํ•˜๋Š” ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋ธŒ๋žœ์น˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ์ง€๋งŒ, Git์€ ์•„์ง master ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. git branch ๋ช…๋ น์€ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ธฐ๋งŒ ํ•˜๊ณ  ๋ธŒ๋žœ์น˜๋ฅผ ์˜ฎ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

๐Ÿฃ ๋ธŒ๋žœ์น˜ ์ด๋™ํ•˜๊ธฐโ€‹

git checkout ๋ช…๋ น์œผ๋กœ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋ฒˆ testing ๋ธŒ๋žœ์น˜๋กœ ๋ฐ”๊ฟ”๋ณด์ž.

> git checkout testing

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด HEAD๋Š” testing ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์•ž์œผ๋กœ ์ปค๋ฐ‹์„ ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ์ž‘์—…๋“ค๊ณผ ๋ณ„๊ฐœ๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— testing ๋ธŒ๋žœ์น˜์—์„œ ์ž„์‹œ๋กœ ์ž‘์—…ํ•˜๊ณ  ์›๋ž˜ master ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„์™€์„œ ํ•˜๋˜ ์ผ์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ธŒ๋žœ์น˜๋ฅผ ์ด๋™ํ•˜๋ฉด ์›Œํ‚น ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค. ์ด์ „์— ์ž‘์—…ํ–ˆ๋˜ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•˜๋ฉด ์›Œํ‚น ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํŒŒ์ผ์€ ๊ทธ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ–ˆ๋˜ ์ž‘์—… ๋‚ด์šฉ์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค. ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ๋ธŒ๋žœ์น˜๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ Git์€ ๋ธŒ๋žœ์น˜ ์ด๋™ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

์‹ค์ œ๋กœ Git์˜ ๋ธŒ๋žœ์น˜๋Š” ์–ด๋–ค ํ•œ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” 40๊ธ€์ž์˜ SHA-1 ์ฒดํฌ์„ฌ ํŒŒ์ผ์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ๋“ค๊ธฐ๋„ ์‰ฝ๊ณ  ์ง€์šฐ๊ธฐ๋„ ์‰ฝ๋‹ค. ์ƒˆ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ 41๋ฐ”์ดํŠธ ํฌ๊ธฐ์˜ ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋ถˆ๊ณผํ•˜๋‹ค.
์ปค๋ฐ‹์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ด์ „ ์ปค๋ฐ‹์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Mergeํ•  ๋–„ ์–ด๋””์„œ๋ถ€ํ„ฐ ํ•ฉ์ณ์•ผ ํ•˜๋Š”์ง€ ์•ˆ๋‹ค.

๐Ÿฆ„ ๋ธŒ๋žœ์น˜์™€ Merge์˜ ๊ธฐ์ดˆโ€‹

  1. ์ž‘์—… ์ค‘์ธ ์›น์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค.
  2. ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ƒˆ Branch๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค.
  3. ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” Branch์—์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.

์ด๋•Œ ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” Hotfix๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ด์ „์˜ ์šด์˜ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•œ๋‹ค.
  2. Hotfix ๋ธŒ๋žœ์น˜๋ฅผ ์ƒˆ๋กœ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค.
  3. ์ˆ˜์ •ํ•œ Hotfix ํ…Œ์ŠคํŠธ๋ฅผ ๋งˆ์น˜๊ณ  ์šด์˜ ๋ธŒ๋žœ์น˜๋กœ Mergeํ•œ๋‹ค.
  4. ๋‹ค์‹œ ์ž‘์—…ํ•˜๋˜ ๋ธŒ๋žœ์น˜๋กœ ์˜ฎ๊ฒจ๊ฐ€์„œ ํ•˜๋˜ ์ผ์„ ์ง„ํ–‰ํ•œ๋‹ค.

๐Ÿฃ ๋ธŒ๋žœ์น˜์˜ ๊ธฐ์ดˆโ€‹

๋ธŒ๋žœ์น˜๋ฅผ ์ด๋™ํ•˜๋ ค๋ฉด ํ•ด์•ผ ํ•  ์ผ์ด ์žˆ๋‹ค. ์•„์ง ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ํŒŒ์ผ์ด Checkoutํ•  ๋ธŒ๋žœ์น˜์™€ ์ถฉ๋Œ ๋‚˜๋ฉด ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ์—๋Š” ์›Œํ‚น ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ž‘์—…ํ•˜๋˜ ๊ฒƒ์„ ๋ชจ๋‘ ์ปค๋ฐ‹ํ•˜๊ณ  master ๋ธŒ๋žœ์น˜๋กœ ์˜ฎ๊ธด๋‹ค.

Mergeํ•  ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹์ด ํ˜„ ๋ธŒ๋žœ์น˜ ์ปค๋ฐ‹์˜ Upstream ๋ธŒ๋žœ์น˜์ด๊ธฐ ๋•Œ๋ฌธ์— master ๋ธŒ๋žœ์น˜ ํฌ์ธํ„ฐ๋Š” Merge ๊ณผ์ • ์—†์ด ๊ทธ์ € ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ์ด๋Ÿฐ Merge ๋ฐฉ์‹์„ Fast Forward๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋‹ค์‹œ ๋งํ•ด A ๋ธŒ๋žœ์น˜์—์„œ ๋‹ค๋ฅธ B ๋ธŒ๋žœ์น˜๋ฅผ Mergeํ•  ๋•Œ B ๋ธŒ๋žœ์น˜๊ฐ€ A ๋ธŒ๋žœ์น˜ ์ดํ›„ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์œผ๋ฉด ๊ทธ์ € A ๋ธŒ๋žœ์น˜๊ฐ€ B ๋ธŒ๋žœ์น˜์™€ ๋™์ผํ•œ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ด๋™์‹œํ‚ฌ ๋ฟ์ด๋‹ค.

๋” ์ด์ƒ ํ•„์š”์—†๋Š” hotfix ๋ธŒ๋žœ์น˜๋Š” ์‚ญ์ œํ•œ๋‹ค. git branch ๋ช…๋ น์–ด์— -d ์˜ต์…˜์„ ์ฃผ๊ณ  ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

> git branch -d hotfix

๐Ÿฃ Merge์˜ ๊ธฐ์ดˆโ€‹

hotfix๋ฅผ Mergeํ–ˆ์„ ๋•Œ์™€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ค๋ฅด๋‹ค. ํ˜„์žฌ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹์ด Mergeํ•  ๋ธŒ๋žœ์น˜์˜ ์กฐ์ƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ Git์€ Fast-forward๋กœ Mergeํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” Git์€ ๊ฐ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹ ๋‘ ๊ฐœ์™€ ๊ณตํ†ต ์กฐ์ƒ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 3-way Merge๋ฅผ ํ•œ๋‹ค.

๋‹จ์ˆœํžˆ ๋ธŒ๋žœ์น˜ ํฌ์ธํ„ฐ๋ฅผ ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ 3-way Merge์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณ„๋„์˜ ์ปค๋ฐ‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ํ•ด๋‹น ๋ธŒ๋žœ์น˜๊ฐ€ ๊ทธ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ด๋™์‹œํ‚จ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ปค๋ฐ‹์€ ๋ถ€๋ชจ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๊ณ  Merge ์ปค๋ฐ‹์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

Git์€ Mergeํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์ ์˜ ๊ณตํ†ต ์กฐ์ƒ์„ ์ž๋™์œผ๋กœ ์ฐพ๋Š”๋‹ค.

๐Ÿฃ ์ถฉ๋Œ์˜ ๊ธฐ์ดˆโ€‹

๊ฐ€๋” 3-way Merge๊ฐ€ ์‹คํŒจํ•  ๋•Œ๋„ ์žˆ๋‹ค. Mergeํ•˜๋Š” ๋‘ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐ™์€ ํŒŒ์ผ์˜ ํ•œ ๋ถ€๋ถ„์„ ๋™์‹œ์— ์ˆ˜์ •ํ•˜๊ณ  Mergeํ•˜๋ฉด Git์€ ํ•ด๋‹น ๋ถ€๋ถ„์„ Mergeํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ์ถฉ๋Œ(Conflict) ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

Git์ด ์ž๋™์œผ๋กœ Mergeํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ์— ์ƒˆ ์ปค๋ฐ‹์ด ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ์ถฉ๋Œ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๋Š” ํ•œ Merge ๊ณผ์ •์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. Merge ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ Git์ด ์–ด๋–ค ํŒŒ์ผ์„ Mergeํ•  ์ˆ˜ ์—†์—ˆ๋Š”์ง€ ์‚ดํŽด๋ณด๋ ค๋ฉด git status ๋ช…๋ น์„ ์ด์šฉํ•œ๋‹ค.

์ถฉ๋Œ์ด ์ผ์–ด๋‚œ ํŒŒ์ผ์€ unmerged ์ƒํƒœ๋กœ ํ‘œ์‹œ๋œ๋‹ค. Git์€ ์ถฉ๋Œ์ด ๋‚œ ๋ถ€๋ถ„์„ ํ‘œ์ค€ ํ˜•์‹์— ๋”ฐ๋ผ ํ‘œ์‹œํ•ด์ค€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ˆ˜๋™์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ถฉ๋Œํ•œ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ณ  git add ๋ช…๋ น์œผ๋กœ ๋‹ค์‹œ Git์— ์ €์žฅํ•œ๋‹ค.

๐Ÿฆ„ ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌโ€‹

git branch ๋ช…๋ น์€ ๋‹จ์ˆœํžˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์•„๋ฌด๋Ÿฐ ์˜ต์…˜ ์—†์ด ์‹คํ–‰ํ•˜๋ฉด ๋ธŒ๋žœ์น˜์˜ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค.

git branch -v ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋ธŒ๋žœ์น˜๋งˆ๋‹ค ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋„ ํ•จ๊ผ ๋ณด์—ฌ์ค€๋‹ค.

๊ฐ ๋ธŒ๋žœ์น˜๊ฐ€ ์ง€๊ธˆ ์–ด๋–ค ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ์— ์ข‹์€ ์˜ต์…˜๋„ ์žˆ๋‹ค. ํ˜„์žฌ Checkout ํ•œ ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ --merged์™€ --no--merged ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉฐ Merge๋œ ๋ธŒ๋žœ์น˜์ธ์ง€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ธŒ๋žœ์น˜์ธ์ง€ ํ•„ํ„ฐ๋งํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. git branch --merged ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ Mergeํ•œ ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก์„ ํ™•์ธํ•œ๋‹ค.

๐Ÿฆ„ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœโ€‹

๐Ÿฃ Long-Running ๋ธŒ๋žœ์น˜โ€‹

๋ฐฐํฌํ–ˆ๊ฑฐ๋‚˜ ๋ฐฐํฌํ•  ์ฝ”๋“œ๋งŒ master ๋ธŒ๋žœ์น˜์— Mergeํ•ด์„œ ์•ˆ์ • ๋ฒ„์ „์˜ ์ฝ”๋“œ๋งŒ master ๋ธŒ๋žœ์น˜์— ๋‘”๋‹ค. ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ณ  ์•ˆ์ •ํ™”ํ•˜๋Š” ๋ธŒ๋žœ์น˜๋Š” develop์ด๋‚˜ next๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ถ”๊ฐ€๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ธŒ๋žœ์น˜๋Š” ์–ธ์  ๊ฐ€ ์•ˆ์ • ์ƒํƒœ๊ฐ€ ๋˜๊ฒ ์ง€๋งŒ, ํ•ญ์ƒ ์•ˆ์ • ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณ์„œ ์•ˆ์ •์ ์ด๋ผ๊ณ  ํŒ๋‹จ๋˜๋ฉด master ๋ธŒ๋žœ์น˜์— Mergeํ•œ๋‹ค. ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ•ด๋‹น ํ† ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด์„œ ๋ฒ„๊ทธ๋„ ์—†๊ณ  ์•ˆ์ •์ ์ด๋ฉด ๊ทธ๋•Œ Mergeํ•œ๋‹ค.

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

์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์•ˆ์ •์„ฑ์„ ๋†’์—ฌ๊ฐ€๋ฉฐ ์šด์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ํฌ๋ฉด proposed ํ˜น์€ pu(proposed updates)๋ผ๋Š” ์ด๋ฆ„์˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  next๋‚˜ mater ๋ธŒ๋žœ์น˜์—์„œ ์•„์ง Mergeํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ผ๋‹จ Merge์‹œํ‚จ๋‹ค. ์ค‘์š”ํ•œ ๊ฐœ๋…์€ ๋ธŒ๋žœ์น˜๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์— ๊ฑธ์ณ์„œ ์•ˆ์ •ํ™”ํ•ด ๋‚˜์•„๊ฐ€๋ฉด์„œ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •ํ™”๊ฐ€ ๋์„ ๋•Œ ์•ˆ์ • ๋ธŒ๋žœ์น˜๋กœ Mergeํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ Long-Running์˜ ๋ธŒ๋žœ์น˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ํ•„์š”์€ ์—†์ง€๋งŒ ์ •๋ง ์œ ์šฉํ•˜ ํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿฃ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜โ€‹

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

๐Ÿฆ„ ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜โ€‹

๋ฆฌ๋ชจํŠธ Refs๋Š” ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ์— ์žˆ๋Š” ํฌ์ธํ„ฐ์ธ ๋ ˆํผ๋Ÿฐ์Šค๋‹ค. ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ์— ์žˆ๋Š” ๋ธŒ๋žœ์น˜, ํƒœ๊ทธ ๋“ฑ๋“ฑ์„ ์˜๋ฏธํ•œ๋‹ค. git ls-remote (remote) ๋ช…๋ น์œผ๋กœ ๋ชจ๋“  ๋ฆฌ๋ชจํŠธ Refs๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. git remote show (remote) ๋ช…๋ น์€ ๋ชจ๋“  ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜์™€ ๊ทธ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ๋ฆฌ๋ชจํŠธ Refs๊ฐ€ ์žˆ์ง€๋งŒ ๋ณดํ†ต ๋ฆฌ๋ชจํŠธ ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฆฌ๋ชจํŠธ ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋Š” ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ธŒ๋žœ์น˜๋‹ค. ์ด ๋ธŒ๋žœ์น˜๋Š” ๋กœ์ปฌ์— ์žˆ์ง€๋งŒ ์›€์ง์ผ ์ˆ˜ ์—†๋‹ค. ๋ฆฌ๋ชจํŠธ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ๋•Œ๋งˆ๋‹ค ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜์— ๋”ฐ๋ผ์„œ ์ž๋™์œผ๋กœ ์›€์ง์ผ ๋ฟ์ด๋‹ค.

๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜์˜ ์ด๋ฆ„์€ (remote)/(branch) ํ˜•์‹์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค. (ex. origin/master) origin์œผ๋กœ๋ถ€ํ„ฐ ์ €์žฅ์†Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋‚ด๋ ค๋ฐ›๊ณ  master ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด ํฌ์ธํ„ฐ๋Š” origin/mater๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ๋ฉ‹๋Œ€๋กœ ์กฐ์ข…ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  Git์€ ๋กœ์ปฌ์˜ master ๋ธŒ๋žœ์น˜๊ฐ€ origin/mater๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค. ์ด์ œ master ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋ชจํŠธ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ €์žฅ์†Œ ์ •๋ณด๋ฅผ ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด git fetch origin ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์šฐ์„  origin ์„œ๋ฒ„์˜ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์ฐพ์•„์„œ, ํ˜„์žฌ ๋กœ์ปฌ์˜ ์ €์žฅ์†Œ๊ฐ€ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋‘ ๋‚ด๋ ค๋ฐ›๊ณ , ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋‚˜์„œ, origin/master ํฌ์ธํ„ฐ์˜ ์œ„์น˜๋ฅผ ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

๐Ÿฃ Pushํ•˜๊ธฐโ€‹

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

> git push (remote) (branch) 

Fetch ๋ช…๋ น์œผ๋กœ ๋ฆฌ๋ชจํŠธ ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋ฅผ ๋‚ด๋ ค ๋ฐ›๋Š”๋‹ค๊ณ  ํ•ด์„œ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ์ € ์ˆ˜์ • ๋ชปํ•˜๋Š” origin ๋ธŒ๋žœ์น˜ ํฌ์ธํ„ฐ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿฃ ๋ธŒ๋žœ์น˜ ์ถ”์ โ€‹

๋ฆฌ๋ชจํŠธ ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋ฅผ ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋กœ Checkoutํ•˜๋ฉด ์ž๋™์œผ๋กœ ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋Š” ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜์™€ ์ง์ ‘์ ์ธ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์ด๋‹ค. ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜์—์„œ git pull ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋ฉด ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์—ฐ๊ฒฐ๋œ ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜์™€ ์ž๋™์œผ๋กœ Mergeํ•œ๋‹ค.

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ €์žฅ์†Œ๋ฅผ Clone์„ ํ•˜๋ฉด Git์€ ์ž๋™์œผ๋กœ master ๋ธŒ๋žœ์น˜๋ฅผ origin/master ๋ธŒ๋žœ์น˜์˜ ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋กœ ๋งŒ๋“ ๋‹ค. ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฆฌ๋ชจํŠธ๋ฅผ origin์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฆฌ๋ชจํŠธ๋กœ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋ธŒ๋žœ์น˜๋„ master๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜์™€ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์˜ ์ด๋ฆ„์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•œ๋‹ค.

> git checkout -b sf origin/serverfix

์ด์ œ sf ๋ธŒ๋žœ์น˜์—์„œ Push๋‚˜ Pullํ•˜๋ฉด ์ž๋™์œผ๋กœ origin/serverfix๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜จ๋‹ค.

์ถ”์  ๋ธŒ๋žœ์น˜๊ฐ€ ํ˜„์žฌ ์–ด๋–ป๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด git branch ๋ช…๋ น์— -vv ์˜ต์…˜์„ ๋”ํ•œ๋‹ค. ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋กœ์ปฌ ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก๊ณผ ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๊ฐ€ ์ถ”์ ํ•˜๊ณ  ์žˆ๋Š” ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋„ ํ•จ๊ป˜ ๋ณด์—ฌ์ค€๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๊ฐ€ ์•ž์„œ๊ฐ€๋Š”์ง€ ๋’ค์ฒ˜์ง€๋Š”์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ๋„ ๋ณด์—ฌ์ค€๋‹ค.

> git branch -vv

๐Ÿฃ Pullํ•˜๊ธฐโ€‹

git fetch ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์„œ๋ฒ„์—๋Š” ์กด์žฌํ•˜์ง€๋งŒ, ๋กœ์ปฌ์—๋Š” ์•„์ง ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ์ €์žฅํ•œ๋‹ค. ์ด๋•Œ ์›Œํ‚น ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํŒŒ์ผ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‚จ๋Š”๋‹ค. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ €์žฅํ•ด๋‘๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ Mergeํ•˜๋„๋ก ์ค€๋น„๋งŒ ํ•ด๋‘”๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด git pull ๋ช…๋ น์€ ๋Œ€๋ถ€๋ถ„ git fetch๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์„œ ์ž๋™์œผ๋กœ git merge ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ fetch์™€ merge ๋ช…๋ น์„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด pull ๋ช…๋ น์œผ๋กœ ํ•œ ๋ฒˆ์— ๋‘ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค.

๐Ÿฃ ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜ ์‚ญ์ œโ€‹

git push ๋ช…๋ น์— --delete ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. serverfix๋ผ๋Š” ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

> git push origin --delete serverfix

์œ„ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ๋ธŒ๋žœ์น˜ ํ•˜๋‚˜๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. ์„œ๋ฒ„์—์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ข…์ข… ์˜๋„์น˜ ์•Š๊ฒŒ ์‚ญ์ œํ•œ ๊ฒฝ์šฐ์—๋„ ์ปค๋ฐ‹ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฆ„ Rebaseํ•˜๊ธฐโ€‹

Git์—์„œ ํ•œ ๋ธŒ๋žœ์น˜์—์„œ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ํ•ฉ์น˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๋‹ค. ํ•˜๋‚˜๋Š” Merge์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Rebase๋‹ค.

๐Ÿฃ Rebase์˜ ๊ธฐ์ดˆโ€‹

rebase ๋ช…๋ น์œผ๋กœ ํ•œ ๋ธŒ๋žœ์น˜์—์„œ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๋Š” ์ผ์„ ์„ค๋ช…ํ•˜์ž๋ฉด ์ผ๋‹จ ๋‘ ๋ธŒ๋žœ์น˜๊ฐ€ ๋‚˜๋‰˜๊ธฐ ์ „์ธ ๊ณตํ†ต ์ปค๋ฐ‹์œผ๋กœ ์ด๋™ํ•˜๊ณ  ๋‚˜์„œ ๊ทธ ์ปค๋ฐ‹๋ถ€ํ„ฐ ์ง€๊ธˆ Checkoutํ•œ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹๊นŒ์ง€ diff๋ฅผ ์ฐจ๋ก€๋กœ ๋งŒ๋“ค์–ด ์–ด๋”˜๊ฐ€์— ์ž„์‹œ๋กœ ์ €์žฅํ•ด ๋†“๋Š”๋‹ค. Rebaseํ•  ๋ธŒ๋žœ์น˜๊ฐ€ ํ•ฉ์น  ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๊ณ  ์•„๊นŒ ์ €์žฅํ•ด ๋†“์•˜๋˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ฐจ๋ก€๋Œ€๋กœ ์ ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ master ๋ธŒ๋žœ์น˜๋ฅผ Fast-forwardํ•œ๋‹ค.

Merge๋“  Rebase๋“  ๋‘˜ ๋‹ค ํ•ฉ์น˜๋Š” ๊ด€์ ์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅผ ๊ฒŒ ์—†๋‹ค. ํ•˜์ง€๋งŒ, Rebase๊ฐ€ ์ข€ ๋” ๊นจ๋—ํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค. Rebaseํ•œ ๋ธŒ๋žœ์น˜์˜ Log๋ฅผ ์‚ดํŽด๋ณด๋ฉด ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์„ ํ˜•์ด๋‹ค. ์ผ์„ ๋ณ‘๋ ฌ๋กœ ๋™์‹œ์— ์ง„ํ–‰ํ•ด๋„ Rebaseํ•˜๊ณ  ๋‚˜๋ฉด ๋ชจ๋“  ์ž‘์—…์ด ์ฐจ๋ก€๋Œ€๋กœ ์ˆ˜ํ–‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

Rebase๋Š” ๋ณดํ†ต ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹์„ ๊น”๋”ํ•˜๊ฒŒ ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์•„๋งˆ ์ด๋ ‡๊ฒŒ Rebaseํ•˜๋Š” ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋Š” ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ์ฐธ์—ฌํ•˜๋Š” ๋ธŒ๋žœ์น˜์ผ ๊ฒƒ์ด๋‹ค. ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ์— Patch๋ฅผ ๋ณด๋‚ผ ์ค€๋น„๊ฐ€ ๋˜๋ฉด ํ•˜๋Š” ๊ฒƒ์ด Rebase๋‹ˆ๊นŒ ๋ธŒ๋žœ์น˜์—์„œ ํ•˜๋˜ ์ผ์„ ์™„์ „ํžˆ ๋งˆ์น˜๊ณ  origin/master๋กœ Rebaseํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ Rebaseํ•˜๊ณ  ๋‚˜๋ฉด ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๋Š” ์–ด๋– ํ•œ ํ†ตํ•ฉ์ž‘์—…๋„ ํ•„์š” ์—†๋‹ค. ๊ทธ๋ƒฅ mater ๋ธŒ๋žœ์น˜๋ฅผ Fast-forwardํ•˜๋ฉด ๋œ๋‹ค.

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

๐Ÿฃ Rebase์˜ ์œ„ํ—˜์„ฑโ€‹

Rebase๊ฐ€ ์žฅ์ ์ด ๋งŽ์€ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ๋‹จ์ ์ด ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ˆ ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฏธ ๊ณต๊ฐœ ์ €์žฅ์†Œ์— Pushํ•œ ์ปค๋ฐ‹์„ Rebaseํ•˜์ง€ ๋ง๋ผ

์ด ์ง€์นจ๋งŒ ์ง€ํ‚ค๋ฉด Rebase๋ฅผ ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ ๋  ๊ฒŒ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ฃผ์˜์‚ฌํ•ญ์„ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์š•์„ ๋จน์„ ๊ฒƒ์ด๋‹ค.
Rebase๋Š” ๊ธฐ์กด์˜ ์ปค๋ฐ‹์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‚ด์šฉ์€ ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ์ปค๋ฐ‹์„ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค. ์ƒˆ ์ปค๋ฐ‹์„ ์„œ๋ฒ„์— Pushํ•˜๊ณ  ๋™๋ฃŒ ์ค‘ ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ ์ปค๋ฐ‹์„ Pullํ•ด์„œ ์ž‘์—…์„ ํ•œ๋‹ค๊ณ ํ•˜์ž. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ ์ปค๋ฐ‹์„ git rebase๋กœ ๋ฐ”๊ฟ”์„œ Pushํ•ด๋ฒ„๋ฆฌ๋ฉด ๋™๋ฃŒ๊ฐ€ ๋‹ค์‹œ Pushํ–ˆ์„ ๋•Œ ๋™๋ฃŒ๋Š” ๋‹ค์‹œ Mergeํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋™๋ฃŒ๊ฐ€ ๋‹ค์‹œ Mergeํ•œ ๋‚ด์šฉ์„ Pullํ•˜๋ฉด ๋‚ด ์ฝ”๋“œ๋Š” ์ •๋ง ์—‰๋ง์ด ๋œ๋‹ค.

๐Ÿฃ Rebaseํ•œ ๊ฒƒ์„ ๋‹ค์‹œ Rebaseํ•˜๊ธฐโ€‹

์–ด๋–ค ํŒ€์›์ด ๊ฐ•์ œ๋กœ ๋‚ด๊ฐ€ ํ•œ ์ผ์„ ๋ฎ์–ด์ผ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ๋‚ด๊ฐ€ ํ–ˆ๋˜ ์ผ์ด ๋ฌด์—‡์ด๊ณ  ๋ฎ์–ด์“ด ๋‚ด์šฉ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋‚ด์•ผ ํ•œ๋‹ค.

์ปค๋ฐ‹ SHA ์ฒดํฌ์„ฌ ์™ธ์—๋„ Git์€ ์ปค๋ฐ‹์— Patchํ•  ๋‚ด์šฉ์œผ๋กœ SHA ์ฒดํฌ์„ฌ์„ ํ•œ ๋ฒˆ ๋” ๊ตฌํ•œ๋‹ค. ์ด ๊ฐ’์€ patch-id๋ผ๊ณ  ํ•œ๋‹ค.
๋ฎ์–ด์“ด ์ปค๋ฐ‹์„ ๋ฐ›์•„์„œ ๊ทธ ์ปค๋ฐ‹์„ ๊ธฐ์ค€์œผ๋กœ Rebaseํ•  ๋•Œ Git์€ ์›๋ž˜ ๋ˆ„๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ธ์ง€ ์ž˜ ์ฐพ์•„๋‚ธ๋‹ค. ๊ทธ๋ž˜์„œ Patch๊ฐ€ ์›๋ž˜๋Œ€๋กœ ์ž˜ ์ ์šฉ๋œ๋‹ค.

git pull ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ์˜ต์…˜์„ ๋ถ™์—ฌ์„œ git pull --rebase๋กœ Rebaseํ•  ์ˆ˜๋„ ์žˆ๋‹ค. git pull ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ --rebase ์˜ต์…˜์ด ์ ์šฉ๋˜๋„๋ก pull.rebase ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. git config --global pull.rebase true ๋ช…๋ น์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

Pushํ•˜๊ธฐ ์ „์— ์ •๋ฆฌํ•˜๋ ค๊ณ  Rebaseํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ๋‹ค. ๋˜ ์ ˆ๋Œ€ ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ณ  ํ˜ผ์ž Rebaseํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ดœ์ฐฎ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฏธ ๊ณต๊ฐœํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ปค๋ฐ‹์„ Rebaseํ•˜๋ฉด ํ‹€๋ฆผ์—†์ด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๋‚˜์ค‘์— ํ›„ํšŒํ•˜์ง€ ๋ง๊ณ  git pull --rebase๋กœ ๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋”ฐ๋Š” ๊ฒƒ์„ ๊ฐ™์ด ์ž‘ใ…‡์—…ํ•˜๋Š” ๋™๋ฃŒ์™€ ๋ชจ๋‘ ํ•จ๊ป˜ ๊ณต์œ ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

๐Ÿฃ Rebase vs. Mergeโ€‹

Merge์™€ Rebase ๋‘˜ ์ค‘ ๋ฌด์—‡์„ ์“ฐ๋Š” ๊ฒŒ ์ข‹์ง€? ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ์ฐพ๊ธฐ ์ „์— ํžˆ์Šคํ† ๋ฆฌ์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ ์ž ๊น ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด์ž.

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

ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜์—ˆ๋‚˜์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋กœ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ํŽธ์ง‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋ฉ”๋‰ด์–ผ์ด๋‚˜ ์„ธ์„ธํ•œ ์ž‘์—… ๋‚ด์šฉ์„ ์ดˆ๋ฒŒ๋ถ€ํ„ฐ ๊ณต๊ฐœํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋“ค๋ ค์ฃผ๊ธฐ ์ข‹๋„๋ก Rebase๋‚˜ filter-branch ๊ฐ™์€ ๋„๊ตฌ๋กœ ํ”„๋กœ์ ํŠธ์˜ ์ง„ํ–‰ ์ด์•ผ๊ธฐ๋ฅผ ๋‹ค๋“ฌ์œผ๋ฉด ์ข‹๋‹ค.

Merge๋‚˜ Rebase ์ค‘ ๋ฌด์—‡์ด ๋‚˜์œผ๋ƒ๋Š” ์งˆ๋ฌธ์€ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ด๋„ ๋‹ต์ด ๊ทธ๋ฆฌ ๊ฐ„๋‹จ์น˜ ์•Š๋‹ค. Git์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ณ  ๊ธฐ๋Šฅ์ด ๋งŽ์•„์„œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ž˜ ์Œ“์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ชจ๋“  ํŒ€๊ณผ ๋ชจ๋“  ์ด๊ฐ€ ์ฒ˜ํ•œ ์ƒํ™ฉ์€ ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค. ์ด ๋‘˜์„ ์–ด๋–ป๊ฒŒ ์“ธ์ง€๋Š” ๊ฐ์ž์˜ ์ƒํ™ฉ๊ณผ ๊ฐ์ž์˜ ํŒ๋‹จ์— ๋‹ฌ๋ ธ๋‹ค.

์ผ๋ฐ˜์ ์ธ ํ•ด๋‹ต์„ ๊ตณ์ด ๋“œ๋ฆฌ์ž๋ฉด ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•  ๋•Œ๋Š” ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ Rebaseํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ฆฌ๋ชจํŠธ ๋“ฑ ์–ด๋”˜๊ฐ€ ๋ฐ–์œผ๋กœ Push๋กœ ๋‚ด๋ณด๋‚ธ ์ปค๋ฐ‹์— ๋Œ€ํ•ด์„œ๋Š” ์ ˆ๋Œ€ Rebaseํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.