Git Branch

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

๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์€ ๊ณ ์ƒ์Šค๋Ÿฝ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์†Œ์Šค์ฝ”๋“œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ  ์†Œ์Šค์ฝ”๋“œ์˜ ์–‘์ด ๋งŽ์œผ๋ฉด ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“œ๋Š” ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

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

๋ธŒ๋žœ์น˜๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Git์ด ๋ธŒ๋žœ์น˜ํ•˜๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  Git์ด ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. Git์€ ๋ฐ์ดํ„ฐ๋ฅผ Change Set์ด๋‚˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ(Diff)์œผ๋กœ ๊ธฐ๋กํ•˜์ง€ ์•Š๊ณ  ์ผ๋ จ์˜ ์Šค๋ƒ…์ƒท์œผ๋กœ ๊ธฐ๋กํ•œ๋‹ค๋Š” ๊ฒƒ์„ _1์žฅ_์—์„œ ๋ณด์—ฌ์คฌ๋‹ค.

์ปค๋ฐ‹ํ•˜๋ฉด Git์€ ํ˜„ Staging Area์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ, ์ €์ž๋‚˜ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์ด์ „ ์ปค๋ฐ‹์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ์ปค๋ฐ‹ ๊ฐœ์ฒด(์ปค๋ฐ‹ Object)๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ด์ „ ์ปค๋ฐ‹ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ์–ด์„œ ํ˜„์žฌ ์ปค๋ฐ‹์ด ๋ฌด์—‡์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ตœ์ดˆ ์ปค๋ฐ‹์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ปค๋ฐ‹์€ ์ด์ „ ์ปค๋ฐ‹ ํฌ์ธํ„ฐ๊ฐ€ ์ ์–ด๋„ ํ•˜๋‚˜์”ฉ ์žˆ๊ณ  ๋ธŒ๋žœ์น˜๋ฅผ ํ•ฉ์นœ Merge ์ปค๋ฐ‹ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ด์ „ ์ปค๋ฐ‹ ํฌ์ธํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ๋ณด์ž. ํŒŒ์ผ์ด 3๊ฐœ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ํ•˜๋‚˜ ์žˆ๊ณ  ์ด ํŒŒ์ผ์„ Staging Area์— ์ €์žฅํ•˜๊ณ  ์ปค๋ฐ‹ํ•ด ๋ณด์ž. ํŒŒ์ผ์„ Stageํ•˜๋ฉด Git ์ €์žฅ์†Œ์— ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ (Git์€ ์ด๊ฒƒ์„ Blob์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค) Staging Area์— ํ•ด๋‹น ํŒŒ์ผ์˜ ์ฒดํฌ์„ฌ์„ ์ €์žฅํ•œ๋‹ค(_1์žฅ_์—์„œ ์‚ดํŽด๋ณธ SHA-1์„ ์‚ฌ์šฉํ•œ๋‹ค).

$ git add README test.rb LICENSE
$ git commit -m 'initial commit of my project'

'git commit'์œผ๋กœ ์ปค๋ฐ‹ํ•˜๋ฉด ๋จผ์ € ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์™€ ๊ฐ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŠธ๋ฆฌ ๊ฐœ์ฒด๋ฅผ ์ฒดํฌ์„ฌ๊ณผ ํ•จ๊ป˜ ์ €์žฅ์†Œ์— ์ €์žฅํ•œ๋‹ค. ๊ทธ๋‹ค์Œ์— ์ปค๋ฐ‹ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ์ •๋ณด๋ฅผ ์ปค๋ฐ‹ ๊ฐœ์ฒด์— ๋„ฃ์–ด ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ•„์š”ํ•˜๋ฉด ์–ธ์ œ๋“ ์ง€ ์Šค๋ƒ…์ƒท์„ ๋‹ค์‹œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ด ์ž‘์—…์„ ๋งˆ์น˜๊ณ  ๋‚˜๋ฉด Git ์ €์žฅ์†Œ์—๋Š” ๋‹ค์„ฏ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๊ฐœ์ฒด๊ฐ€ ์ƒ๊ธด๋‹ค. ๊ฐ ํŒŒ์ผ์— ๋Œ€ํ•œ Blob ์„ธ ๊ฐœ, ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ํŠธ๋ฆฌ ๊ฐœ์ฒด ํ•˜๋‚˜, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฃจํŠธ ํŠธ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๋‹ด๊ธด ์ปค๋ฐ‹ ๊ฐœ์ฒด ํ•˜๋‚˜์ด๋‹ค. ์ด๊ฒƒ์„ ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ฆฌ๋ฉด ๊ทธ๋ฆผ 3-1๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ 3-1. ์ €์žฅ์†Œ์˜ ์ปค๋ฐ‹ ๋ฐ์ดํ„ฐ

๋‹ค์‹œ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜๋ฉด ์ด์ „ ์ปค๋ฐ‹์ด ๋ฌด์—‡์ธ์ง€๋„ ์ €์žฅํ•œ๋‹ค. ์ปค๋ฐ‹์„ ๋‘ ๋ฒˆ ๋” ํ•˜๋ฉด ๊ทธ๋ฆผ 3-2๊ณผ ๊ฐ™์ด ์ €์žฅ๋œ๋‹ค.

๊ทธ๋ฆผ 3-2. Git ์ปค๋ฐ‹์˜ ๊ฐœ์ฒด ๋ฐ์ดํ„ฐ

Git์˜ ๋ธŒ๋žœ์น˜๋Š” ์ปค๋ฐ‹ ์‚ฌ์ด๋ฅผ ๊ฐ€๋ณ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ํฌ์ธํ„ฐ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Git์€ master ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ ๋‹ค. ์ตœ์ดˆ๋กœ ์ปค๋ฐ‹ํ•˜๋ฉด Git์€ master๋ผ๋Š” ์ด๋ฆ„์˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž๋™์œผ๋กœ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค.

๊ทธ๋ฆผ 3-3. ๊ฐ€์žฅ ์ตœ๊ทผ ์ปค๋ฐ‹ ์ •๋ณด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ธŒ๋žœ์น˜

๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ์ƒˆ๋กœ ๋งŒ๋“ค๋ฉด ์–ด๋–จ๊นŒ? ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๋†€์ž. ๋‹ค์Œ๊ณผ ๊ฐ™์ด git branch ๋ช…๋ น์œผ๋กœ testing ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ ๋‹ค.

$ git branch testing

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

๊ทธ๋ฆผ 3-4. ์ปค๋ฐ‹ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‘ ๋ธŒ๋žœ์น˜

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

๊ทธ๋ฆผ 3-5. HEAD๋Š” ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ด

git checkout ๋ช…๋ น์œผ๋กœ ์ƒˆ๋กœ ๋งŒ๋“  ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. testing ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋‹ค:

$ git checkout testing

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

๊ทธ๋ฆผ 3-6. HEAD๋Š” ์˜ฎ๊ฒจ๊ฐ„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค

์ž, ์ด์ œ ํ•ต์‹ฌ์ด ๋ณด์ผ ๊ฑฐ๋‹ค! ์ปค๋ฐ‹์„ ์ƒˆ๋กœ ํ•œ ๋ฒˆ ํ•ด๋ณด๋ฉด:

$ vim test.rb
$ git commit -a -m 'made a change'

๊ฒฐ๊ณผ๋Š” ๊ทธ๋ฆผ 3-7๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ 3-7. HEAD๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” testing ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒˆ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค

์ด ๋ถ€๋ถ„์ด ํฅ๋ฏธ๋กญ๋‹ค. ์ƒˆ๋กœ ์ปค๋ฐ‹ํ•ด์„œ testing ๋ธŒ๋žœ์น˜๋Š” ์•ž์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, master ๋ธŒ๋žœ์น˜๋Š” ์—ฌ์ „ํžˆ ์ด์ „ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. master ๋ธŒ๋žœ์น˜๋กœ ๋˜๋Œ์•„๊ฐ€๋ฉด:

$ git checkout master

๊ฒฐ๊ณผ๋Š” ๊ทธ๋ฆผ 3-8๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ 3-8. HEAD๊ฐ€ Checkoutํ•œ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•จ

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

ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์‹œ ์ปค๋ฐ‹์„ ํ•ด๋ณด์ž:

$ vim test.rb
$ git commit -a -m 'made other changes'

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

๊ทธ๋ฆผ 3-9. ๋ธŒ๋žœ์น˜ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์„œ๋กœ ๋…๋ฆฝ์ ์ž„

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

๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ต์งธ๋กœ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ Git์˜ ์ฐจ์ด๋Š” ๊ทน๋ช…ํ•˜๋‹ค. ํ†ต์งธ๋กœ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์€ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ ์ˆ˜์‹ญ ์ดˆ์—์„œ ์ˆ˜์‹ญ ๋ถ„๊นŒ์ง€ ๊ฑธ๋ฆฐ๋‹ค. ๊ทธ์— ๋น„ํ•ด Git์€ ์ˆœ์‹๊ฐ„์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ปค๋ฐ‹์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ด์ „ ์ปค๋ฐ‹์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Mergeํ•  ๋•Œ ์–ด๋””์„œ๋ถ€ํ„ฐ(Merge Base) ํ•ฉ์ณ์•ผ ํ•˜๋Š”์ง€ ์•ˆ๋‹ค. ์ด๋Ÿฐ ํŠน์ง•์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ˆ˜์‹œ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ฒŒ ํ•œ๋‹ค.

์ด์ œ ์™œ ๊ทธ๋ ‡๊ฒŒ ๋ธŒ๋žœ์น˜๋ฅผ ์ˆ˜์‹œ๋กœ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

๋ธŒ๋žœ์น˜์™€ Merge์˜ ๊ธฐ์ดˆ

์‹ค์ œ ๊ฐœ๋ฐœ๊ณผ์ •์—์„œ ๊ฒช์„ ๋งŒํ•œ ์˜ˆ์ œ๋ฅผ ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž. ๋ธŒ๋žœ์น˜์™€ Merge๋Š” ๋ณดํ†ต ์ด๋Ÿฐ ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค:

  1. ์ž‘์—… ์ค‘์ธ ์›น์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค.

  2. ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ƒˆ Branch๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑ.

  3. ์ƒˆ๋กœ ๋งŒ๋“  Branch์—์„œ ์ž‘์—… ์ค‘.

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

  1. ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ด์ „์˜ ์šด์˜(Production) ๋ธŒ๋žœ์น˜๋กœ ์ด๋™.

  2. Hotfix ๋ธŒ๋žœ์น˜๋ฅผ ์ƒˆ๋กœ ํ•˜๋‚˜ ์ƒ์„ฑ.

  3. ์ˆ˜์ •ํ•œ Hotfix ํ…Œ์ŠคํŠธ๋ฅผ ๋งˆ์น˜๊ณ  ์šด์˜ ๋ธŒ๋žœ์น˜๋กœ Merge.

  4. ๋‹ค์‹œ ์ž‘์—…ํ•˜๋˜ ๋ธŒ๋žœ์น˜๋กœ ์˜ฎ๊ฒจ๊ฐ€์„œ ํ•˜๋˜ ์ผ ์ง„ํ–‰.

๋ธŒ๋žœ์น˜์˜ ๊ธฐ์ดˆ

๋จผ์ € ์ปค๋ฐ‹์„ ๋ช‡ ๋ฒˆ ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

๊ทธ๋ฆผ 3-10. ํ˜„์žฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ

์ด์Šˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ๋“ฑ๋ก๋œ 53๋ฒˆ ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์ด ์ด์Šˆ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ์ƒˆ๋กœ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค. Git์€ ์–ด๋–ค ์ด์Šˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—๋„ ์ข…์†๋ผ ์žˆ์ง€ ์•Š๋‹ค. ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๋ฉด์„œ Checkout๊นŒ์ง€ ํ•œ ๋ฒˆ์— ํ•˜๋ ค๋ฉด git checkout ๋ช…๋ น์— -b๋ผ๋Š” ์˜ต์…˜์„ ์ค€๋‹ค.

$ git checkout -b iss53
Switched to a new branch 'iss53'

์œ„ ๋ช…๋ น์€ ์•„๋ž˜ ๋ช…๋ น์„ ์ค„์—ฌ๋†“์€ ๊ฒƒ์ด๋‹ค:

$ git branch iss53
$ git checkout iss53

๊ทธ๋ฆผ 3-11์€ ์œ„ ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ทธ๋ฆผ 3-11. ๋ธŒ๋žœ์น˜ ํฌ์ธํ„ฐ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ฆ

iss53 ๋ธŒ๋žœ์น˜๋ฅผ Checkoutํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—(์ฆ‰, HEAD๋Š” iss53 ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค) ๋ญ”๊ฐ€ ์ผ์„ ํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜๋ฉด iss53 ๋ธŒ๋žœ์น˜๊ฐ€ ์•ž์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค:

$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'

๊ทธ๋ฆผ 3-12. ์ง„ํ–‰ ์ค‘์ธ iss53 ๋ธŒ๋žœ์น˜

๋‹ค๋ฅธ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž. ๋งŒ๋“œ๋Š” ์‚ฌ์ดํŠธ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ ์ฆ‰์‹œ ๊ณ ์ณ์•ผ ํ•œ๋‹ค. ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•œ Hotfix์— 'iss53'์ด ์„ž์ด๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด 'iss53'์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•ด๋‘๊ณ  ์›๋ž˜ ์šด์˜ ํ™˜๊ฒฝ์˜ ์†Œ์Šค๋กœ ๋ณต๊ตฌํ•ด์•ผ ํ•œ๋‹ค. Git์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๋…ธ๋ ฅ์„ ๋“ค์ผ ํ•„์š” ์—†์ด ๊ทธ๋ƒฅ master ๋ธŒ๋žœ์น˜๋กœ ์˜ฎ๊ธฐ๋ฉด ๋œ๋‹ค.

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

$ git checkout master
Switched to branch 'master'

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

hotfix๋ผ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ๊นŒ์ง€ ์‚ฌ์šฉํ•œ๋‹ค:

$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix 3a0874c] fixed the broken email address
 1 files changed, 1 deletion(-)

๊ทธ๋ฆผ 3-13. master ๋ธŒ๋žœ์น˜์—์„œ ๊ฐˆ๋ผ์ ธ ๋‚˜์˜จ hotfix ๋ธŒ๋žœ์น˜

์šด์˜ ํ™˜๊ฒฝ์— ์ ์šฉํ•˜๋ ค๋ฉด ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ๊ณ ์ณค๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ณ  master ๋ธŒ๋žœ์น˜์— ํ•ฉ์ณ์•ผ ํ•œ๋‹ค. git merge ๋ช…๋ น์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋‹ค:

$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
 README | 1 -
 1 file changed, 1 deletion(-)

Merge ๋ฉ”์‹œ์ง€์—์„œ 'Fast-forward'๊ฐ€ ๋ณด์ด๋Š”๊ฐ€? Mergeํ•  ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋˜ ์ปค๋ฐ‹์ด ํ˜„ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ๋ณด๋‹ค '์•ž์œผ๋กœ ์ง„ํ–‰ํ•œ' ์ปค๋ฐ‹์ด๊ธฐ ๋•Œ๋ฌธ์— master ๋ธŒ๋žœ์น˜ ํฌ์ธํ„ฐ๋Š” ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ์ด๋Ÿฐ Merge ๋ฐฉ์‹์„ 'Fast forward'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ A ๋ธŒ๋žœ์น˜์—์„œ ๋‹ค๋ฅธ B ๋ธŒ๋žœ์น˜๋ฅผ Mergeํ•  ๋•Œ B๊ฐ€ A ์ดํ›„์˜ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์œผ๋ฉด ๊ทธ์ € A๊ฐ€ B์˜ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•  ๋ฟ์ด๋‹ค.

์ด์ œ hotfix๋Š” master ๋ธŒ๋žœ์น˜์— ํฌํ•จ๋๊ณ  ์šด์˜ํ™˜๊ฒฝ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค(๊ทธ๋ฆผ 3-14).

๊ทธ๋ฆผ 3-14. Merge ํ›„ hotfix ๋ธŒ๋žœ์น˜์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” master ๋ธŒ๋žœ์น˜

๋ฌธ์ œ๋ฅผ ๊ธ‰ํžˆ ํ•ด๊ฒฐํ•˜๊ณ  master ๋ธŒ๋žœ์น˜์— ์ ์šฉํ•˜๊ณ  ๋‚˜๋ฉด ๋‹ค์‹œ ์ผํ•˜๋˜ ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ๊ทธ์ „์— ํ•„์š”์—†๋Š” hotfix ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•œ๋‹ค. git branch ๋ช…๋ น์— -d ์˜ต์…˜์„ ์ฃผ๊ณ  ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

$ git branch -d hotfix
Deleted branch hotfix (was 3a0874c).

์ž ์ด์ œ ์ด์Šˆ 53๋ฒˆ์„ ์ฒ˜๋ฆฌํ•˜๋˜ ํ™˜๊ฒฝ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€์„œ ํ•˜๋˜ ์ผ์„ ๊ณ„์† ํ•˜์ž(๊ทธ๋ฆผ 3-15):

$ git checkout iss53
Switched to branch 'iss53'
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
 1 file changed, 1 insertion(+)

๊ทธ๋ฆผ 3-15. master์™€ ๋ณ„๊ฐœ๋กœ ์ง„ํ–‰ํ•˜๋Š” iss53 ๋ธŒ๋žœ์น˜

์œ„์—์„œ ์ž‘์—…ํ•œ hotfix๊ฐ€ iss53 ๋ธŒ๋žœ์น˜์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. git merge master ๋ช…๋ น์œผ๋กœ master ๋ธŒ๋žœ์น˜๋ฅผ iss53 ๋ธŒ๋žœ์น˜์— Mergeํ•˜๋ฉด iss53 ๋ธŒ๋žœ์น˜์— hotfix๊ฐ€ ์ ์šฉ๋œ๋‹ค. ์•„๋‹ˆ๋ฉด iss53 ๋ธŒ๋žœ์น˜๊ฐ€ master์— Mergeํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ Mergeํ•˜๋ฉด hotfix์™€ iss53๊ฐ€ ํ•ฉ์ณ์ง„๋‹ค.

Merge์˜ ๊ธฐ์ดˆ

53๋ฒˆ ์ด์Šˆ๋ฅผ ๋‹ค ๊ตฌํ˜„ํ•˜๊ณ  master ๋ธŒ๋žœ์น˜์— Mergeํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž. master ๋ธŒ๋žœ์น˜์— Mergeํ•˜๋Š” ๊ฒƒ์€ ์•ž์„œ ์‚ดํŽด๋ณธ hotfix ๋ธŒ๋žœ์น˜๋ฅผ Mergeํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค. git merge ๋ช…๋ น์œผ๋กœ ํ•ฉ์น  ๋ธŒ๋žœ์น˜์—์„œ ํ•ฉ์ณ์งˆ ๋ธŒ๋žœ์น˜๋ฅผ Mergeํ•˜๋ฉด ๋œ๋‹ค:

$ git checkout master
$ git merge iss53
Auto-merging README
Merge made by the 'recursive' strategy.
 README | 1 +
 1 file changed, 1 insertion(+)

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

๊ทธ๋ฆผ 3-16. Git์€ Merge์— ํ•„์š”ํ•œ ๊ณตํ†ต ์ปค๋ฐ‹์„ ์ž๋™์œผ๋กœ ์ฐพ์Œ

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

Git์€ Mergeํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์ ์˜ ๊ณตํ†ต ์กฐ์ƒ์„ ์ž๋™์œผ๋กœ ์ฐพ๋Š”๋‹ค. ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋„ Git์ด ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๋ณด๋‹ค ๋‚˜์€ ์ ์ด๋‹ค. CVS๋‚˜ Subversion ๊ฐ™์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ณตํ†ต ์กฐ์ƒ์„ ์ฐพ์•„์„œ Mergeํ•ด์•ผ ํ•œ๋‹ค. Git์€ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๋ณด๋‹ค Merge๊ฐ€ ๋Œ€๋‹จํžˆ ์‰ฝ๋‹ค.

๊ทธ๋ฆผ 3-17. Git์€ Mergeํ•  ๋•Œ Merge์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ์ปค๋ฐ‹๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.

iss53 ๋ธŒ๋žœ์น˜๋ฅผ master์— Mergeํ•˜๊ณ  ๋‚˜๋ฉด ๋”๋Š” iss53 ๋ธŒ๋žœ์น˜๊ฐ€ ํ•„์š” ์—†๋‹ค. ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ด์Šˆ์˜ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌ ์™„๋ฃŒ๋กœ ํ‘œ์‹œํ•œ๋‹ค:

$ git branch -d iss53

์ถฉ๋Œ์˜ ๊ธฐ์ดˆ

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

$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

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

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

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

<<<<<<< HEAD
<div id='footer'>contact : email.support@github.com</div>
=======
<div id='footer'>
  please contact us at support@github.com
</div>
>>>>>>> iss53

======= ์œ„์ชฝ์˜ ๋‚ด์šฉ์€ HEAD ๋ฒ„์ „(merge ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ์ž‘์—…ํ•˜๋˜ master ๋ธŒ๋žœ์น˜)์˜ ๋‚ด์šฉ์ด๊ณ  ์•„๋ž˜์ชฝ์€ iss53 ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์ด๋‹ค. ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์œ„์ชฝ์ด๋‚˜ ์•„๋ž˜์ชฝ ๋‚ด์šฉ ์ค‘์—์„œ ๊ณ ๋ฅด๊ฑฐ๋‚˜ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜์—ฌ Mergeํ•œ๋‹ค. ๋‹ค์Œ์€ ์•„์˜ˆ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜์—ฌ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ์˜ˆ์ œ๋‹ค:

<div id='footer'>
please contact us at email.support@github.com
</div>

์ถฉ๋Œํ•œ ์–‘์ชฝ์—์„œ ์กฐ๊ธˆ์”ฉ ๊ฐ€์ ธ์™€์„œ ์ƒˆ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  <<<<<<<, =======, >>>>>>> ๊ฐ€ ํฌํ•จ๋œ ํ–‰์„ ์‚ญ์ œํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ์ถฉ๋Œํ•œ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ณ  git add ๋ช…๋ น์œผ๋กœ ๋‹ค์‹œ Git์— ์ €์žฅํ•œ๋‹ค. ์ถฉ๋Œ์„ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ Merge ๋„๊ตฌ๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. git mergetool ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

$ git mergetool

This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html

Normal merge conflict for 'index.html':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (opendiff):

Mac์—์„œ๋Š” opendiff๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๊ธฐ๋ณธ ๋„๊ตฌ ๋ง๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ Merge ๋„๊ตฌ๋„ ์žˆ๋Š”๋ฐ, "โ€ฆ one of the following tools:" ๋ถ€๋ถ„์— ๋ณด์—ฌ์ค€๋‹ค. ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋‹ค. Merge ๋„๊ตฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ _7์žฅ_์—์„œ ๋‹ค๋ฃฌ๋‹ค.

Merge ๋„๊ตฌ๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด Git์€ ์ž˜ Mergeํ–ˆ๋Š”์ง€ ๋ฌผ์–ด๋ณธ๋‹ค. ์ž˜ ๋งˆ์ณค๋‹ค๊ณ  ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ git add๊ฐ€ ์ˆ˜ํ–‰๋˜๊ณ  ํ•ด๋‹น ํŒŒ์ผ์ด Staging Area์— ์ €์žฅ๋œ๋‹ค.

git status ๋ช…๋ น์œผ๋กœ ์ถฉ๋Œ์ด ํ•ด๊ฒฐ๋œ ์ƒํƒœ์ธ์ง€ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

$ git status
On branch master
Changes to be committed:
  (use 'git reset HEAD <file>...' to unstage)

        modified:   index.html

์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜์„œ ํ•ด๋‹น ํŒŒ์ผ์ด Staging Area์— ์ €์žฅ๋๋Š”์ง€ ํ™•์ธํ–ˆ์œผ๋ฉด git commit ๋ช…๋ น์œผ๋กœ Merge ํ•œ ๊ฒƒ์„ ์ปค๋ฐ‹ํ•œ๋‹ค. ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ณ  Mergeํ•  ๋•Œ์—๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Merge branch 'iss53'

Conflicts:
  index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
#       .git/MERGE_HEAD
# and try again.
#

์–ด๋–ป๊ฒŒ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ–ˆ๊ณ  ์ข€ ๋” ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ ํ–ˆ๋Š”์ง€ ์ž์„ธํ•˜๊ฒŒ ๊ธฐ๋กํ•œ๋‹ค. ์ž์„ธํ•œ ๊ธฐ๋ก์€ ๋‚˜์ค‘์— ์ด Merge ์ปค๋ฐ‹์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋‹ค.

๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ

์ง€๊ธˆ๊นŒ์ง€ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ , Mergeํ•˜๊ณ , ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ดค๋‹ค. ๋ธŒ๋žœ์น˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๋ช…๋ น๋„ ์‚ดํŽด๋ณด์ž.

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

$ git branch
  iss53
* master
  testing

* ๊ธฐํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ๋Š” master๋ธŒ๋žœ์น˜๋Š” ํ˜„์žฌ Checkoutํ•ด์„œ ์ž‘์—…ํ•˜๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, ์ง€๊ธˆ ์ˆ˜์ •ํ•œ ๋‚ด์šฉ์„ ์ปค๋ฐ‹ํ•˜๋ฉด master ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹๋˜๊ณ  ํฌ์ธํ„ฐ๊ฐ€ ์•ž์œผ๋กœ ํ•œ ๋‹จ๊ณ„ ๋‚˜์•„๊ฐ„๋‹ค. git branch -v ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋ธŒ๋žœ์น˜๋งˆ๋‹ค ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋„ ํ•จ๊ป˜ ๋ณด์—ฌ์ค€๋‹ค:

$ git branch -v
  iss53   93b412c fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 add scott to the author list in the readmes

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

$ git branch --merged
  iss53
* master

iss53 ๋ธŒ๋žœ์น˜๋Š” ์•ž์—์„œ ์ด๋ฏธ Mergeํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชฉ๋ก์— ๋‚˜ํƒ€๋‚œ๋‹ค. * ๊ธฐํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ์ง€ ์•Š์€ ๋ธŒ๋žœ์น˜๋Š” git branch -d ๋ช…๋ น์œผ๋กœ ์‚ญ์ œํ•ด๋„ ๋˜๋Š” ๋ธŒ๋žœ์น˜๋‹ค. ์ด๋ฏธ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์™€ Merge ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œํ•ด๋„ ์ •๋ณด๋ฅผ ์žƒ์ง€ ์•Š๋Š”๋‹ค.

๋ฐ˜๋Œ€๋กœ ํ˜„์žฌ Checkoutํ•œ ๋ธŒ๋žœ์น˜์— Mergeํ•˜์ง€ ์•Š์€ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ดํŽด๋ณด๋ ค๋ฉด git branch --no-merged ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค:

$ git branch --no-merged
  testing

์œ„์—๋Š” ์—†์—ˆ๋˜ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณด์ธ๋‹ค. ์•„์ง Mergeํ•˜์ง€ ์•Š์€ ์ปค๋ฐ‹์„ ๋‹ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— git branch -d ๋ช…๋ น์œผ๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค:

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

Mergeํ•˜์ง€ ์•Š์€ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ•์ œ๋กœ ์‚ญ์ œํ•˜๋ ค๋ฉด -D ์˜ต์…˜์œผ๋กœ ์‚ญ์ œํ•œ๋‹ค.

๋ธŒ๋žœ์น˜ Workflow

๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  Mergeํ•˜๋Š” ๊ฒƒ์„ ์–ด๋””์— ์จ๋จน์–ด์•ผ ํ• ๊นŒ? ์ด ์ ˆ์—์„œ๋Š” Git์˜ ๋ธŒ๋žœ์น˜๊ฐ€ ์œ ์šฉํ•œ ๋ช‡ ๊ฐ€์ง€ Workflow๋ฅผ ์‚ดํŽด๋ณธ๋‹ค. ์—ฌ๊ธฐ์„œ ์„ค๋ช…ํ•˜๋Š” Workflow๋ฅผ ๊ฐœ๋ฐœ์— ์ ์šฉํ•˜๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

Long-Running ๋ธŒ๋žœ์น˜

Git์€ ๊ผผ๊ผผํ•˜๊ฒŒ 3-way Merge๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฅ๊ธฐ๊ฐ„์— ๊ฑธ์ณ์„œ ํ•œ ๋ธŒ๋žœ์น˜๋ฅผ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์™€ ์—ฌ๋Ÿฌ ๋ฒˆ Mergeํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ต์ง€ ์•Š๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ์šฉ๋„์— ๋”ฐ๋ผ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ๋‘๊ณ  ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ •๊ธฐ์ ์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ Mergeํ•œ๋‹ค:

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

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

๊ทธ๋ฆผ 3-18. ์•ˆ์ •์ ์ธ ๋ธŒ๋žœ์น˜์ผ์ˆ˜๋ก ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋’ค์ณ์ง„๋‹ค

์‹คํ—˜์‹ค์—์„œ ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ค์ „์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค(๊ทธ๋ฆผ 3-19).

๊ทธ๋ฆผ 3-19. ๊ฐ ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜์˜ ์‹คํ—˜์‹ค๋กœ ์ƒ๊ฐํ•˜๋ผ

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

์ค‘์š”ํ•œ ๊ฐœ๋…์€ ๋ธŒ๋žœ์น˜๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์— ๊ฑธ์ณ์„œ ์•ˆ์ •ํ™”ํ•ด ๋‚˜์•„๊ฐ€๋ฉด์„œ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •ํ™”๊ฐ€ ๋์„ ๋•Œ ์•ˆ์ • ๋ธŒ๋žœ์น˜๋กœ Mergeํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ ๋ฐ˜๋“œ์‹œ Long-Running์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ •๋ง ์œ ์šฉํ•˜๋‹ค. ํŠนํžˆ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ์ผ์ˆ˜๋ก ๊ทธ ์œ ์šฉ์„ฑ์ด ๋ฐ˜์ง๋ฐ˜์ง ๋น›๋‚œ๋‹ค.

ํ† ํ”ฝ ๋ธŒ๋žœ์น˜

ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๋Š” ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ์œ ์šฉํ•˜๋‹ค. ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๋Š” ์–ด๋–ค ํ•œ ๊ฐ€์ง€ ์ฃผ์ œ๋‚˜ ์ž‘์—…์„ ์œ„ํ•ด ๋งŒ๋“  ์งง์€ ํ˜ธํก์˜ ๋ธŒ๋žœ์น˜๋‹ค. ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ์ด๋Ÿฐ ๋ธŒ๋žœ์น˜๋ฅผ ๋ณธ ์ ์ด ์—†์„ ๊ฒƒ์ด๋‹ค. Git์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ์—์„œ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ๋ฐ ํฐ ๋น„์šฉ์ด ๋“ ๋‹ค. Git์—์„œ๋Š” ๋งค์šฐ ์ผ์ƒ์ ์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  Mergeํ•˜๊ณ  ์‚ญ์ œํ•œ๋‹ค.

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

master ๋ธŒ๋žœ์น˜๋ฅผ checkoutํ•œ ์ƒํƒœ์—์„œ ์–ด๋–ค ์ž‘์—…์„ ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ํ•œ ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ iss91๋ผ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ์ž‘์—…์„ ํ•œ๋‹ค. ๊ฐ™์€ ์ด์Šˆ๋ฅผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•ด๋ณด๊ณ  ์‹ถ์„ ๋•Œ๋„ ์žˆ๋‹ค. iss91v2๋ผ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด ๋ณธ๋‹ค. ํ™•์‹ ํ•  ์ˆ˜ ์—†๋Š” ์•„์ด๋””์–ด๋ฅผ ์ ์šฉํ•ด๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ master ๋ธŒ๋žœ์น˜๋กœ ๋˜๋Œ์•„๊ฐ€์„œ dumbidea ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋งํ–ˆ๋˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋Š” ๊ทธ๋ฆผ 3-20๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ 3-20. ์—ฌ๋Ÿฌ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ

์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ๋˜ ๋ฐฉ๋ฒ• ์ค‘ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ iss91v2 ๋ธŒ๋žœ์น˜๊ฐ€ ๊ดœ์ฐฎ์•„์„œ ์ ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„์ด๋””์–ด๋ฅผ ํ™•์‹ ํ•  ์ˆ˜ ์—†์—ˆ๋˜ dumbidea ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ™์ด ์ผํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ณด์—ฌ์คฌ๋”๋‹ˆ ์ฉ ๊ดœ์ฐฎ๋‹ค๋Š” ๋ฐ˜์‘์„ ์–ป์—ˆ๋‹ค. iss91 ๋ธŒ๋žœ์น˜๋Š” (C5, C6 ์ปค๋ฐ‹๋„ ํ•จ๊ป˜) ๋ฒ„๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋‘ ๋ธŒ๋žœ์น˜๋ฅผ Mergeํ•˜๋ฉด ๊ทธ๋ฆผ 3-21๊ณผ ๊ฐ™์ด ๋œ๋‹ค.

๊ทธ๋ฆผ 3-21. dumbidea์™€ iss91v2 ๋ธŒ๋žœ์น˜๋ฅผ Mergeํ•˜๊ณ  ๋‚œ ํ›„์˜ ๋ชจ์Šต

์ง€๊ธˆ๊นŒ์ง€ ํ•œ ์ž‘์—…์€ ์ „๋ถ€ ๋กœ์ปฌ์—์„œ๋งŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ผญ ๊ธฐ์–ตํ•˜์ž. ๋กœ์ปฌ ์ €์žฅ์†Œ์—์„œ๋งŒ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  Mergeํ–ˆ์œผ๋ฉฐ ์„œ๋ฒ„์™€ ํ†ต์‹ ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ์ผ์€ ์—†์—ˆ๋‹ค.

๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜

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

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

๋‹ค์†Œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ ์˜ˆ์ œ๋ฅผ ์ข€ ๋” ์‚ดํŽด๋ณด์ž. git.ourcompany.com์ด๋ผ๋Š” Git ์„œ๋ฒ„๊ฐ€ ์žˆ๊ณ  ์ด ์„œ๋ฒ„์˜ ์ €์žฅ์†Œ๋ฅผ ํ•˜๋‚˜ Cloneํ•˜๋ฉด Git์€ ์ž๋™์œผ๋กœ origin์ด๋ผ๋Š” ์ด๋ฆ„์„ ๋ถ™์ธ๋‹ค. origin์œผ๋กœ๋ถ€ํ„ฐ ์ €์žฅ์†Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋‚ด๋ ค๋ฐ›๊ณ  master ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด ํฌ์ธํ„ฐ๋Š” origin/master๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ๋ฉ‹๋Œ€๋กœ ์กฐ์ข…ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  Git์€ ๋กœ์ปฌ์˜ master ๋ธŒ๋žœ์น˜๊ฐ€ origin/master๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค. ์ด์ œ ์ด master ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆผ 3-22. ์ €์žฅ์†Œ๋ฅผ Cloneํ•˜๋ฉด ๋กœ์ปฌ master ๋ธŒ๋žœ์น˜, ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ์˜ master ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” origin/master ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒ๊น€

๋กœ์ปฌ ์ €์žฅ์†Œ์—์„œ ์–ด๋–ค ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋™์‹œ์— ๋‹ค๋ฅธ ํŒ€์›์ด git.ourcompany.com ์„œ๋ฒ„์— Pushํ•˜๊ณ  master ๋ธŒ๋žœ์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ํŒ€์› ๊ฐ„์˜ ํžˆ์Šคํ† ๋ฆฌ๋Š” ์„œ๋กœ ๋‹ฌ๋ผ์ง„๋‹ค. ์„œ๋ฒ„ ์ €์žฅ์†Œ๋กœ๋ถ€ํ„ฐ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋„ ์ฃผ๊ณ ๋ฐ›์ง€ ์•Š์•„์„œ origin/master ํฌ์ธํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ๋‹ค.

๊ทธ๋ฆผ 3-23. ๋กœ์ปฌ๊ณผ ์„œ๋ฒ„์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋Š” ๋…๋ฆฝ์ ์ž„

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

๊ทธ๋ฆผ 3-24. Git์˜ Fetch ๋ช…๋ น์€ ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค

๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์šด์˜ํ•˜๋Š” ์ƒํ™ฉ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  Git ์ €์žฅ์†Œ๋ฅผ ํŒ€ ๋‚ด๋ถ€์— ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•ด ๋ณด์ž.

์ด ์ €์žฅ์†Œ์˜ ์ฃผ์†Œ๊ฐ€ git.team1.ourcompany.com ์ด๋ฉด _2์žฅ_์—์„œ ์‚ดํŽด๋ณธ git remote add ๋ช…๋ น์œผ๋กœ ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ํ”„๋กœ์ ํŠธ์— ํŒ€์˜ ์ €์žฅ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋ฆ„์„ teamone์œผ๋กœ ์ง“๊ณ  ๊ธด ์„œ๋ฒ„ ์ฃผ์†Œ ๋Œ€์‹  ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋ฆผ 3-25. ์„œ๋ฒ„๋ฅผ ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ

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

๊ทธ๋ฆผ 3-26. ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋งŒ๋“ค์–ด์ง„ teamone์˜ master ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ

Pushํ•˜๊ธฐ

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

serverfix๋ผ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๊ณต์œ ํ•  ๋•Œ์—๋„ ๋ธŒ๋žœ์น˜๋ฅผ ์ฒ˜์Œ Pushํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ Pushํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด git push (remote) (branch) ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค:

$ git push origin serverfix
Counting objects: 20, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (15/15), 1.74 KiB, done.
Total 15 (delta 5), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new branch]      serverfix -> serverfix

์ด ๋ฉ”์‹œ์ง€์—๋Š” ์ˆจ๊ฒจ์ง„ ๋‚ด์šฉ์ด ๋งŽ๋‹ค.

Git์€ serverfix๋ผ๋Š” ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์„ refs/heads/serverfix:refs/heads/serverfix๋กœ ํ™•์žฅํ•œ๋‹ค. ์ด๊ฒƒ์€ serverfix๋ผ๋Š” ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋ฅผ ์„œ๋ฒ„๋กœ Pushํ•˜๋Š”๋ฐ ๋ฆฌ๋ชจํŠธ์˜ serverfix ๋ธŒ๋žœ์น˜๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋‚˜์ค‘์— _9์žฅ_์—์„œ refs/heads/์˜ ๋œป์„ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ ๋„˜์–ด๊ฐ€๋„๋ก ํ•œ๋‹ค. git push origin serverfix:serverfix๋ผ๊ณ  Pushํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ™์€ ์˜๋ฏธ์ธ๋ฐ ์ด๊ฒƒ์€ '๋กœ์ปฌ์˜ serverfix ๋ธŒ๋žœ์น˜๋ฅผ ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ์˜ serverfix ๋ธŒ๋žœ์น˜๋กœ Pushํ•˜๋ผ'๋ผ๋Š” ๋œป์ด๋‹ค. ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์˜ ์ด๋ฆ„๊ณผ ๋ฆฌ๋ชจํŠธ ์„œ๋ฒ„์˜ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์ด ๋‹ค๋ฅผ ๋•Œ ํ•„์š”ํ•˜๋‹ค. ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ์— serverfix๋ผ๋Š” ์ด๋ฆ„ ๋Œ€์‹  ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด git push origin serverfix:awesomebranch์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค.

๋‚˜์ค‘์— ๋ˆ„๊ตฐ๊ฐ€ ์ €์žฅ์†Œ๋ฅผ Fetchํ•˜๊ณ  ๋‚˜์„œ ์„œ๋ฒ„์— ์žˆ๋Š” serverfix ๋ธŒ๋žœ์น˜์— ์ ‘๊ทผํ•  ๋•Œ origin/serverfix๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค:

$ git fetch origin
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 15 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (15/15), done.
From git@github.com:schacon/simplegit
 * [new branch]      serverfix    -> origin/serverfix

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

์ƒˆ๋กœ ๋ฐ›์€ ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์„ Mergeํ•˜๋ ค๋ฉด git merge origin/serverfix ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค. Mergeํ•˜์ง€ ์•Š๊ณ  ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค.

$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

๊ทธ๋Ÿฌ๋ฉด origin/serverfix์—์„œ ์‹œ์ž‘ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” serverfix๋ผ๋Š” ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

๋ธŒ๋žœ์น˜ ์ถ”์ 

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

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ €์žฅ์†Œ๋ฅผ Cloneํ•ด์˜ฌ ๋•Œ๋„ Git์€ ์ž๋™์œผ๋กœ master ๋ธŒ๋žœ์น˜๋ฅผ origin/master ๋ธŒ๋žœ์น˜์˜ ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋กœ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ž˜์„œ git push, git pull ๋ช…๋ น์ด ์ถ”๊ฐ€์ ์ธ ์•„๊ทœ๋จผํŠธ ์—†์ด๋„ ๋™์ž‘ํ•œ๋‹ค. ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ origin/master๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์ €์žฅ์†Œ์˜ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋„ ์ถ”์ ํ•˜๊ฒŒ(Tracking) ํ•  ์ˆ˜ ์žˆ๋‹ค. git checkout -b [branch] [remotename]/[branch] ๋ช…๋ น์œผ๋กœ ๊ฐ„๋‹จํžˆ ํŠธ๋ž˜ํ‚น ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. Git 1.6.2 ๋ฒ„์ „ ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” --track ์˜ต์…˜๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

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

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'

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

๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜ ์‚ญ์ œ

๋™๋ฃŒ์™€ ํ˜‘์—…ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ฐ€ ์ž‘์—…์„ ๋งˆ์น˜๊ณ  master ๋ธŒ๋žœ์น˜๋กœ Mergeํ–ˆ๋‹ค. ํ˜‘์—…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ๋˜ ๊ทธ ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋Š” ์ด์ œ ์•ˆ์ •ํ™”๋์œผ๋ฏ€๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. git push [remotename] :[branch]๋ผ๊ณ  ์‹คํ–‰ํ•ด์„œ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด ๋ช…๋ น์€ ์ข€ ํŠน์ดํ•˜๊ฒŒ ์ƒ๊ฒผ๋‹ค. serverfix๋ผ๋Š” ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค:

$ git push origin :serverfix
To git@github.com:schacon/simplegit.git
 - [deleted]         serverfix

์œ„ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด ์„œ๋ฒ„์˜ ๋ธŒ๋žœ์น˜๋Š” ์‚ญ์ œ๋œ๋‹ค. ์ด ๋ช…๋ น์„ ์žŠ์–ด๋ฒ„๋ฆด ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด์„œ ํŽ˜์ด์ง€ ๊ท€ํ‰์ด๋ฅผ ์ ‘์–ด๋†“๊ณ  ํ•„์š”ํ•  ๋•Œ ํŽด๋ณด๋Š” ๊ฒŒ ์ข‹์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ด ๋ช…๋ น์€ ์•ž์„œ ์‚ดํŽด๋ณธ git push [remotename] [localbranch]:[remotebranch] ํ˜•์‹์œผ๋กœ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. [localbranch] ๋ถ€๋ถ„์— ๋น„์›Œ ๋‘” ์ฑ„๋กœ ์‹คํ–‰ํ•˜๋ฉด '๋กœ์ปฌ์—์„œ ๋นˆ ๋‚ด์šฉ์„ ๋ฆฌ๋ชจํŠธ์˜ [remotebranch]์— ์ฑ„์›Œ ๋„ฃ์–ด๋ผ' ๋ผ๋Š” ๋œป์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Rebaseํ•˜๊ธฐ

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

Rebase์˜ ๊ธฐ์ดˆ

์•ž์˜ Merge ์ ˆ์—์„œ ์‚ดํŽด๋ณธ ์˜ˆ์ œ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋ณด์ž(๊ทธ๋ฆผ 3-27). ๋‘ ๊ฐœ์˜ ๋‚˜๋ˆ„์–ด์ง„ ๋ธŒ๋žœ์น˜์˜ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆผ 3-27. ๋‘ ๊ฐœ์˜ ๋ธŒ๋žœ์น˜๋กœ ๋‚˜๋ˆ„์–ด์ง„ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ

์ด ๋‘ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ฉ์น˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์•ž์—์„œ ์‚ดํŽด๋ณธ ๋Œ€๋กœ Merge ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‘ ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ๋‘ ๊ฐœ(C3, C4)์™€ ๊ณตํ†ต ์กฐ์ƒ(C2)์„ ์‚ฌ์šฉํ•˜๋Š” 3-way Merge๋กœ ๊ทธ๋ฆผ 3-28์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค.

๊ทธ๋ฆผ 3-28. ๋‚˜๋‰œ ๋ธŒ๋žœ์น˜๋ฅผ Mergeํ•˜๊ธฐ

๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ, C3์—์„œ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ํŒจ์น˜(Patch)๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๋‹ค์‹œ C4์— ์ ์šฉ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. Git์—์„œ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์„ Rebase ๋ผ๊ณ  ํ•œ๋‹ค. Rebase ๋ช…๋ น์œผ๋กœ ํ•œ ๋ธŒ๋žœ์น˜์—์„œ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ Rebaseํ•œ๋‹ค:

$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command

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

๊ทธ๋ฆผ 3-29. C3์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ C4์— ์ ์šฉํ•˜๋Š” Rebase ๊ณผ์ •

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ master ๋ธŒ๋žœ์น˜๋ฅผ Fast-forward ์‹œํ‚จ๋‹ค.

๊ทธ๋ฆผ 3-30. master ๋ธŒ๋žœ์น˜๋ฅผ Fast-forward์‹œํ‚ค๊ธฐ

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

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

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

์ข€ ๋” Rebase

Rebase๋Š” ๋‹จ์ˆœํžˆ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ฉ์น˜๋Š” ๊ฒƒ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์šฉ๋„๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆผ 3-31๊ณผ ๊ฐ™์€ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. server ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์„œ๋ฒ„ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ ๋ธŒ๋žœ์น˜์—์„œ ๋‹ค์‹œ client ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ server ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„๊ฐ€์„œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๋” ์ถ”๊ฐ€ํ•œ๋‹ค.

๊ทธ๋ฆผ 3-31. ๋‹ค๋ฅธ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐˆ๋ผ์ ธ ๋‚˜์˜จ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜

์ด๋•Œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋œ ๋œ server ๋ธŒ๋žœ์น˜๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  client ๋ธŒ๋žœ์น˜๋งŒ master๋กœ ํ•ฉ์น˜๋ ค๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. server์™€๋Š” ์•„๋ฌด ๊ด€๋ จ์ด ์—†๋Š” client ์ปค๋ฐ‹์€ C8, C9์ด๋‹ค. ์ด ๋‘ ์ปค๋ฐ‹์„ master ๋ธŒ๋žœ์น˜์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ --onto ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค:

$ git rebase --onto master server client

์ด ๋ช…๋ น์€ client ๋ธŒ๋žœ์น˜๋ฅผ Checkoutํ•˜๊ณ  server์™€ client์˜ ๊ณตํ†ต์กฐ์ƒ ์ดํ›„์˜ ํŒจ์น˜๋ฅผ ๋งŒ๋“ค์–ด master์— ์ ์šฉํ•œ๋‹ค. ์กฐ๊ธˆ ๋ณต์žกํ•˜๊ธด ํ•ด๋„ ๊ฝค ์“ธ๋ชจ ์žˆ๋‹ค. ๊ทธ๋ฆผ 3-32๋ฅผ ๋ณด์ž.

๊ทธ๋ฆผ 3-32. ๋‹ค๋ฅธ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐˆ๋ผ์ ธ ๋‚˜์˜จ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๋ฅผ Rebaseํ•˜๊ธฐ

์ด์ œ master ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„๊ฐ€์„œ Fast-forward ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค:

$ git checkout master
$ git merge client

๊ทธ๋ฆผ 3-33. master ๋ธŒ๋žœ์น˜๋ฅผ client ๋ธŒ๋žœ์น˜ ์œ„์น˜๋กœ ์ง„ํ–‰ ์‹œํ‚ค๊ธฐ

server ๋ธŒ๋žœ์น˜์˜ ์ผ์ด ๋‹ค ๋๋‚˜๋ฉด git rebase [basebranch] [topicbranch]๋ผ๋Š” ๋ช…๋ น์œผ๋กœ Checkoutํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ server ๋ธŒ๋žœ์น˜๋ฅผ master ๋ธŒ๋žœ์น˜๋กœ rebaseํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ช…๋ น์€ ํ† ํ”ฝ(server) ๋ธŒ๋žœ์น˜๋ฅผ Checkoutํ•˜๊ณ  ๋ฒ ์ด์Šค(master) ๋ธŒ๋žœ์น˜์— Rebaseํ•œ๋‹ค:

$ git rebase master server

server ๋ธŒ๋žœ์น˜์˜ ์ˆ˜์ •์‚ฌํ•ญ์„ master ๋ธŒ๋žœ์น˜์— ์ ์šฉํ–ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ๋Š” ๊ทธ๋ฆผ 3-34์™€ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ 3-34. master ๋ธŒ๋žœ์น˜์— server ๋ธŒ๋žœ์น˜์˜ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ ์šฉ

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ master ๋ธŒ๋žœ์น˜๋ฅผ Fast-forward ์‹œํ‚จ๋‹ค:

$ git checkout master
$ git merge server

๋ชจ๋“  ๊ฒƒ์ด master ๋ธŒ๋žœ์น˜์— ํ†ตํ•ฉ๋๊ธฐ ๋•Œ๋ฌธ์— ๋” ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด client๋‚˜ server ๋ธŒ๋žœ์น˜๋Š” ์‚ญ์ œํ•ด๋„ ๋œ๋‹ค. ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•ด๋„ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋Š” ๊ทธ๋ฆผ 3-35์™€ ๊ฐ™์ด ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ๋‹ค:

$ git branch -d client
$ git branch -d server

๊ทธ๋ฆผ 3-35. ์ตœ์ข… ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ

Rebase์˜ ์œ„ํ—˜์„ฑ

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

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

์ด ์ง€์นจ๋งŒ ์ง€ํ‚ค๋ฉด Rebase๋ฅผ ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ ๋  ๊ฒŒ ์—†๋‹ค. ํ•˜์ง€๋งŒ, ์ด ์ฃผ์˜์‚ฌํ•ญ์„ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์š•์„ ๋จน์„ ๊ฒƒ์ด๋‹ค(์—ญ์ฃผ - ์•„๋งˆ๋„ ๊ฐ€์นด์˜ ํ˜ธ์—ฐ์ง€๊ธฐ๊ฐ€ ํ•„์š”ํ•ด์งˆ ๊ฒƒ์ด๋‹ค).

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

์ด๋ฏธ ๊ณต๊ฐœ ์ €์žฅ์†Œ์— Pushํ•œ ์ปค๋ฐ‹์„ Rebaseํ•˜๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ์ดˆ๋ž˜๋˜๋Š”์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž. ์ค‘์•™ ์ €์žฅ์†Œ์—์„œ Cloneํ•˜๊ณ  ์ผ๋ถ€ ์ˆ˜์ •์„ ํ•˜๋ฉด ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋Š” ๊ทธ๋ฆผ 3-36๊ณผ ๊ฐ™์•„ ์ง„๋‹ค.

๊ทธ๋ฆผ 3-36. ์ €์žฅ์†Œ๋ฅผ Cloneํ•˜๊ณ  ์ผ๋ถ€ ์ˆ˜์ •ํ•จ

์ด์ œ ํŒ€์› ์ค‘ ๋ˆ„๊ตฐ๊ฐ€ ์ปค๋ฐ‹, Mergeํ•˜๊ณ  ๋‚˜์„œ ์„œ๋ฒ„์— Push ํ•œ๋‹ค. ์ด ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋ฅผ Fetch, Mergeํ•˜๋ฉด ๊ทธ๋ฆผ 3-37๊ณผ ๊ฐ™์ด ๋œ๋‹ค.

๊ทธ๋ฆผ 3-37. Fetchํ•œ ํ›„ Mergeํ•จ

๊ทธ๋Ÿฐ๋ฐ Pushํ–ˆ๋˜ ํŒ€์›์€ Mergeํ•œ ์ผ์„ ๋˜๋Œ๋ฆฌ๊ณ  ๋‹ค์‹œ Rebaseํ•œ๋‹ค. ์„œ๋ฒ„์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ƒˆ๋กœ ๋ฎ์–ด์”Œ์šฐ๋ ค๋ฉด git push --force ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ดํ›„์— ์ €์žฅ์†Œ์—์„œ Fetchํ•˜๊ณ  ๋‚˜๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค:

๊ทธ๋ฆผ 3-38. ํ•œ ํŒ€์›์ด ๋‹ค๋ฅธ ํŒ€์›์ด ์˜์กดํ•˜๋Š” ์ปค๋ฐ‹์„ ์—†์• ๊ณ  Rebaseํ•œ ์ปค๋ฐ‹์„ ๋‹ค์‹œ Pushํ•จ

๊ธฐ์กด ์ปค๋ฐ‹์ด ์‚ฌ๋ผ์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ์ฒ˜๋ฆฌํ•œ ์ผ์ด๋ผ๊ณ  ํ•ด๋„ ๋‹ค์‹œ Mergeํ•ด์•ผ ํ•œ๋‹ค. Rebase๋Š” ์ปค๋ฐ‹์˜ SHA-1 ํ•ด์‹œ๋ฅผ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— Git์€ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค. ์‚ฌ์‹ค C4๋Š” ์ด๋ฏธ ํžˆ์Šคํ† ๋ฆฌ์— ์ ์šฉ๋˜์–ด ์žˆ์ง€๋งŒ, Git์€ ๋ชจ๋ฅธ๋‹ค.

๊ทธ๋ฆผ 3-39. ๊ฐ™์€ Merge๋ฅผ ๋‹ค์‹œ ํ•œ๋‹ค

๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€ ๊ณ„์† ๊ฐ™์ด ์ผํ•˜๋ ค๋ฉด ์ด๋Ÿฐ Merge๋„ ํ•ด์•ผ๋งŒ ํ•œ๋‹ค. Mergeํ•˜๋ฉด C4์™€ C4' ์ปค๋ฐ‹ ๋‘˜ ๋‹ค ํžˆ์Šคํ† ๋ฆฌ์— ๋‚จ๊ฒŒ ๋œ๋‹ค. ์‹ค์ œ ๋‚ด์šฉ๊ณผ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฐ™์ง€๋งŒ SHA-1 ํ•ด์‹œ ๊ฐ’์ด ์ „ํ˜€ ๋‹ค๋ฅด๋‹ค. git log๋กœ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์ €์ž, ์ปค๋ฐ‹ ๋‚ ์งœ, ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฐ™์€ ์ปค๋ฐ‹์ด ๋‘ ๊ฐœ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์„œ๋ฒ„์— Pushํ•˜๋ฉด ๊ฐ™์€ ์ปค๋ฐ‹์ด ๋‘ ๊ฐœ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•œ๋‹ค.

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

์š”์•ฝ

์šฐ๋ฆฌ๋Š” ์ด ์žฅ์—์„œ Git์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  Merge ๊ธฐ๋Šฅ์˜ ๊ธฐ๋ณธ์ ์ธ ๋ช…๋ น์„ ๋‹ค๋ฃจ์—ˆ๋‹ค. ์ด์ œ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ์˜ฎ๊ฒจ๋‹ค๋‹ˆ๊ณ  Mergeํ•˜๋Š” ๊ฒƒ์— ์ต์ˆ™ํ•ด์กŒ์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค. ๋ธŒ๋žœ์น˜๋ฅผ Pushํ•˜์—ฌ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ Pushํ•˜๊ธฐ ์ „์— ๋ธŒ๋žœ์น˜๋ฅผ Rebaseํ•˜๋Š” ๊ฒƒ ์ •๋„๋Š” ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

Last updated