Skip to content

Latest commit

ย 

History

History
1277 lines (1106 loc) ยท 71.5 KB

File metadata and controls

1277 lines (1106 loc) ยท 71.5 KB

ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ธฐ

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

์ฒซ ๋ฒˆ์งธ๋กœ ์‚ดํŽด๋ณผ ๋ณ€์ˆ˜๋Š” ํ™œ๋ฐœํžˆ ํ™œ๋™ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ˆ˜์ด๋‹ค. ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ฝ”๋“œ๋ฅผ ์Ÿ์•„ ๋‚ด๋Š”๊ฐ€ ํ•˜๋Š” ์ ์ด ํ™œ๋ฐœํ•œ ๊ฐœ๋ฐœ์ž์˜ ๊ธฐ์ค€์ด๋‹ค. ๋Œ€๋ถ€๋ถ„ ๋‘˜, ์…‹ ์ •๋„์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋ฃจ์— ๋ช‡ ๋ฒˆ ์ปค๋ฐ‹์„ ํ•˜๊ณ  ํ™œ๋ฐœํ•˜์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ๋Š” ๋” ๋„์—„๋„์—„ํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ์•„์ฃผ ํฐ ํ”„๋กœ์ ํŠธ๋Š” ์ˆ˜๋ฐฑ, ์ˆ˜์ฒœ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋ฃจ์—๋„ ์ˆ˜์‹ญ, ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์ปค๋ฐ‹์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŽ์œผ๋ฉด ๋งŽ์„์ˆ˜๋ก ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ ์šฉํ•˜๊ฑฐ๋‚˜ Merge ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. ์–ด๋–ค ์ปค๋ฐ‹์€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฏธ ๊ธฐ์—ฌํ•œ ๊ฒƒ์œผ๋กœ ๋ถˆํ•„์š”ํ•ด์ง€๊ธฐ๋„ ํ•˜๊ณ  ๋•Œ๋ก  ์„œ๋กœ ์ถฉ๋Œ์ด ์ผ์–ด๋‚œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์ฝ”๋“œ๋ฅผ ์ตœ์‹ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

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

์„ธ ๋ฒˆ์งธ ๋ณ€์ˆ˜๋Š” ์ ‘๊ทผ ๊ถŒํ•œ์ด๋‹ค. 'ํ”„๋กœ์ ํŠธ์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ์–ด์„œ ์ง์ ‘ ์“ธ ์ˆ˜ ์žˆ๋Š”๊ฐ€? ์•„๋‹ˆ๋ฉด ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ๊ฐ€?'์— ๋”ฐ๋ผ์„œ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋งค์šฐ ๋‹ฌ๋ผ์ง„๋‹ค. ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ˆ˜์ • ์‚ฌํ•ญ์„ ํ”„๋กœ์ ํŠธ์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ˆ˜์ •์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” ์ •์ฑ…์ด ํ”„๋กœ์ ํŠธ์— ์žˆ๋Š”๊ฐ€? ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‹œ๊ฐ„์„ ํ”„๋กœ์ ํŠธ์— ํ• ์• ํ•˜๋Š”๊ฐ€? ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๊ธฐ์—ฌํ•˜๋Š”๊ฐ€?

์ด๋Ÿฐ ์งˆ๋ฌธ์— ๋”ฐ๋ผ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์›Œํฌํ”Œ๋กœ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ๊ฐ„๋‹จํ•œ ๊ฒƒ๋ถ€ํ„ฐ ๋ณต์žกํ•œ ๊ฒƒ๊นŒ์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๊ฐ ์ƒํ™ฉ์„ ์‚ดํŽด๋ณด๋ฉด ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ์›Œํฌํ”Œ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

์ปค๋ฐ‹ ๊ฐ€์ด๋“œ๋ผ์ธ

๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๋จผ์ € ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์ฃผ์˜์‚ฌํ•ญ์„ ์•Œ์•„๋ณด์ž. ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์•Œ์•„๋‘๋ฉด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€ ํ•จ๊ป˜ ์ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋งŽ์ด ๋œ๋‹ค. Git ํ”„๋กœ์ ํŠธ์— ๋ณด๋ฉด ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์ฐธ๊ณ ํ•  ๋งŒํ•œ ์ข‹์€ ํŒ์ด ๋งŽ๋‹ค. Git ํ”„๋กœ์ ํŠธ์˜ Documentation/SubmittingPatches ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

๋ฌด์—‡๋ณด๋‹ค๋„ ๋จผ์ € ๊ณต๋ฐฑ๋ฌธ์ž๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ์ปค๋ฐ‹ํ•ด์•ผ ํ•œ๋‹ค. Git์€ ๊ณต๋ฐฑ๋ฌธ์ž๋ฅผ ๊ฒ€์‚ฌํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋ช…๋ น์„ ์ œ๊ณตํ•œ๋‹ค. ์ปค๋ฐ‹์„ ํ•˜๊ธฐ ์ „์— git diff --check ๋ช…๋ น์œผ๋กœ ๊ณต๋ฐฑ๋ฌธ์ž์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

`git diff --check` ์˜ ๊ฒฐ๊ณผ.
Figure 1. git diff --check ์˜ ๊ฒฐ๊ณผ.

์ปค๋ฐ‹์„ ํ•˜๊ธฐ ์ „์— ๊ณต๋ฐฑ๋ฌธ์ž์— ๋Œ€ํ•ด ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋ฉด ๊ณต๋ฐฑ์œผ๋กœ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ปค๋ฐ‹๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ์ด๋Ÿฐ ์ปค๋ฐ‹์œผ๋กœ ์ธํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‹ ๊ฒฝ ์“ฐ๋Š” ์ผ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ ์ปค๋ฐ‹์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š” Changeset์ด๋‹ค. ์ตœ๋Œ€ํ•œ ์ˆ˜์ •์‚ฌํ•ญ์„ ํ•œ ์ฃผ์ œ๋กœ ์š”์•ฝํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์Šˆ์— ๋Œ€ํ•œ ์ˆ˜์ •์‚ฌํ•ญ์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์— ๋‹ด์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์Šˆ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ Staging Area๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•œ ์ปค๋ฐ‹์— ์ด์Šˆ ํ•˜๋‚˜๋งŒ ๋‹ด๊ธฐ๋„๋ก ํ•œ๋‹ค. ์ž‘์—… ๋‚ด์šฉ์„ ๋ถ„ํ• ํ•˜๊ณ , ๊ฐ ์ปค๋ฐ‹๋งˆ๋‹ค ์ ์ ˆํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ๊ฐ™์€ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” git add -patch ๋ช…๋ น์„ ์จ์„œ ํ•œ ๋ถ€๋ถ„์”ฉ ๋‚˜๋ˆ„์–ด Staging Area์— ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค(๊ด€๋ จ ๋‚ด์šฉ์€ ch07-git-tools.asc ์—์„œ ๋‹ค๋ฃฌ๋‹ค). ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ตœ์ข… ํ”„๋กœ์ ํŠธ์˜ ๋ชจ์Šต์€ ํ•œ ๋ฒˆ์— ์ปค๋ฐ‹์„ ํ•˜๋“  ๋‹ค์„ฏ ๋ฒˆ์— ๋‚˜๋ˆ„์–ด ์ปค๋ฐ‹์„ ํ•˜๋“  ๋˜‘๊ฐ™๋‹ค.

ํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜๋ˆ„์–ด ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๋ฅธ ๋™๋ฃŒ๊ฐ€ ์ˆ˜์ •ํ•œ ๋ถ€๋ถ„์„ ํ™•์ธํ•  ๋•Œ๋‚˜ ๊ฐ ์ปค๋ฐ‹์˜ ์‹œ์ ์œผ๋กœ ๋ณต์›ํ•ด์„œ ๊ฒ€ํ† ํ•  ๋•Œ ์ดํ•ดํ•˜๊ธฐ ํ›จ์”ฌ ์‰ฝ๋‹ค. ch07-git-tools.asc ์—์„œ ์ด๋ฏธ ์ €์žฅ๋œ ์ปค๋ฐ‹์„ ๋‹ค์‹œ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ์„ ๋‹จ๊ณ„์ ์œผ๋กœ Staging Area์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณธ๋‹ค. ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ปค๋ฐ‹์„ ์Œ“์•„๊ฐ€์•ผ ํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ช…์‹ฌํ•ด์•ผ ํ•  ์ ์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž์ฒด๋‹ค. ์ข‹์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์Šต๊ด€์€ Git์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋งŽ์ด ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค. ๋ฉ”์‹œ์ง€์˜ ์ฒซ ๋ผ์ธ์— 50์ž๊ฐ€ ๋„˜์ง€ ์•Š๋Š” ์•„์ฃผ ๊ฐ„๋žตํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ ์–ด ํ•ด๋‹น ์ปค๋ฐ‹์„ ์š”์•ฝํ•œ๋‹ค. ๋‹ค์Œ ํ•œ ๋ผ์ธ์€ ๋น„์šฐ๊ณ  ๊ทธ๋‹ค์Œ ๋ผ์ธ๋ถ€ํ„ฐ ์ปค๋ฐ‹์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Git ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐœ๋ฐœ ๋™๊ธฐ์™€ ๊ตฌํ˜„ ์ƒํ™ฉ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด๋‚˜ ์ƒํ™ฉ ๋“ฑ์„ ์ž์„ธํ•˜๊ฒŒ ์š”๊ตฌํ•œ๋‹ค. ์ด๋Ÿฐ ์ ์€ ๋”ฐ๋ฅผ ๋งŒํ•œ ์ข‹์€ ๊ฐ€์ด๋“œ๋ผ์ธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌํ˜• ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ช…๋ น๋ฌธ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด โ€œI added tests for (ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•จ)โ€ ๋ณด๋‹ค๋Š” โ€œAdd tests for (ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€)โ€ ์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์€ Tim Pope๊ฐ€ ์ž‘์„ฑํ•œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ํ…œํ”Œ๋ฆฟ์ด๋‹ค.

์˜๋ฌธ 50๊ธ€์ž ์ดํ•˜์˜ ๊ฐ„๋žตํ•œ ์ˆ˜์ • ์š”์•ฝ

์ž์„ธํ•œ ์„ค๋ช…. ์˜๋ฌธ 72๊ธ€์ž ์ด์ƒ์ด ๋˜๋ฉด
๋ผ์ธ ๋ฐ”๊ฟˆ์„ ํ•˜๊ณ  ์ด์–ด์ง€๋Š” ๋‚ด์šฉ์„ ์ž‘์„ฑํ•œ๋‹ค.
ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋ผ์ธ์ด ์ด๋ฉ”์ผ
๋ฉ”์‹œ์ง€์˜ ์ œ๋ชฉ์ด ๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ฉ”์ผ
๋‚ด์šฉ์ด ๋œ๋‹ค. ๋นˆ ๋ผ์ธ์€ ๋ณธ๋ฌธ๊ณผ ์š”์•ฝ์„
๊ตฌ๋ณ„ํ•ด์ฃผ๊ธฐ์— ์ค‘์š”ํ•˜๋‹ค(๋ณธ๋ฌธ ์ „์ฒด๋ฅผ ์ƒ๋žตํ•˜์ง€ ์•Š๋Š” ํ•œ).

์ด์–ด์ง€๋Š” ๋‚ด์šฉ๋„ ํ•œ ๋ผ์ธ ๋„์šฐ๊ณ  ์“ด๋‹ค.

  - ๋ชฉ๋ก ํ‘œ์‹œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  - ๋ณดํ†ต '-' ๋‚˜ '*' ํ‘œ์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ชฉ๋ก์„ ํ‘œํ˜„ํ•˜๊ณ 
    ํ‘œ์‹œ ์•ž์— ๊ณต๋ฐฑ ํ•˜๋‚˜, ๊ฐ ๋ชฉ๋ก ์‚ฌ์ด์—๋Š” ๋นˆ ๋ผ์ธ
    ํ•˜๋‚˜๋ฅผ ๋„ฃ๋Š”๋ฐ, ์ด๊ฑด ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

๋ฉ”์‹œ์ง€๋ฅผ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ํ•จ๊ป˜ ์ผํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ฌผ๋ก ์ด๊ณ  ์ž์‹ ์—๊ฒŒ๋„ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค. Git ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ์—๋Š” ์ž˜ ์“ฐ์ธ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‚ด๋ ค๋ฐ›์•„์„œ git log --no-merges ๋ช…๋ น์œผ๋กœ ๊ผญ ์‚ดํŽด๋ณด๊ธฐ๋ฅผ ๊ถŒํ•œ๋‹ค.

Note
์ฑ… ์ฒ˜๋Ÿผ ํ•˜์ง€๋ง๊ณ , ์‹œํ‚ค๋Š” ๋Œ€๋กœ ํ•˜๊ธฐ.

์‹œ๊ฐ„ ๊ด€๊ณ„์ƒ, ์ด ์ฑ…์—์„œ ์„ค๋ช…ํ•˜๋Š” ์˜ˆ์ œ์˜ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” ์œ„์™€ ๊ฐ™์ด ์•„์ฃผ ๋ฉ‹์ง€๊ฒŒ ์“ฐ์ง€ ์•Š์•˜๋‹ค. git commit ๋ช…๋ น์—์„œ -m ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ๋Š”๋‹ค.

ํ•˜์ง€๋งŒ! ์ €์ž์ฒ˜๋Ÿผ ํ•˜์ง€ ๋ง๊ณ  ์‹œํ‚ค๋Š” ๋Œ€๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋น„๊ณต๊ฐœ ์†Œ๊ทœ๋ชจ ํŒ€

๋‘์„ธ ๋ช…์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋น„๊ณต๊ฐœ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ์ผ ๊ฒƒ์ด๋‹ค. โ€œ๋น„๊ณต๊ฐœโ€ ๋ผ๊ณ  ํ•จ์€ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๊ณต๊ฐœ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋งํ•˜๋Š” ๊ฒƒ์ด์ง€ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ ๋งํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋Š” ๊ณต์œ ํ•˜๋Š” ์ €์žฅ์†Œ์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ด๋Ÿฐ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณดํ†ต Subversion ๊ฐ™์€ ์ค‘์•™์ง‘์ค‘ํ˜• ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฌผ๋ก  Git์ด ๊ฐ€์ง„ ์˜คํ”„๋ผ์ธ ์ปค๋ฐ‹ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ธŒ๋žœ์น˜ Merge ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๊ธด ํ•˜์ง€๋งŒ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ Merge ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ๋‘ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ €์žฅ์†Œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‚ดํŽด๋ณด์ž. ๊ฐœ๋ฐœ์ž์ธ John์€ ์ €์žฅ์†Œ๋ฅผ Clone ํ•˜๊ณ  ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‚˜์„œ ๋กœ์ปฌ์— ์ปค๋ฐ‹ํ•œ๋‹ค (์˜ˆ์ œ์—์„œ Git์ด ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์‹œ์ง€ ์ค‘ ์ผ๋ถ€๋Š” โ€ฆโ€‹ ์œผ๋กœ ์ค„์ด๊ณ  ์ƒ๋žตํ–ˆ๋‹ค).

# John's Machine
$ git clone john@githost:simplegit.git
Cloning into 'simplegit'...
...
$ cd simplegit/
$ vim lib/simplegit.rb
$ git commit -am 'remove invalid default value'
[master 738ee87] remove invalid default value
 1 files changed, 1 insertions(+), 1 deletions(-)

๊ฐœ๋ฐœ์ž์ธ Jessica๋„ ์ €์žฅ์†Œ๋ฅผ Clone ํ•˜๊ณ  ๋‚˜์„œ ํŒŒ์ผ์„ ํ•˜๋‚˜ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปค๋ฐ‹ํ•œ๋‹ค.

# Jessica's Machine
$ git clone jessica@githost:simplegit.git
Cloning into 'simplegit'...
...
$ cd simplegit/
$ vim TODO
$ git commit -am 'add reset task'
[master fbff5bc] add reset task
 1 files changed, 1 insertions(+), 0 deletions(-)

Jessica๋Š” ์„œ๋ฒ„์— ์ปค๋ฐ‹์„ Push ํ•œ๋‹ค.

# Jessica's Machine
$ git push origin master
...
To jessica@githost:simplegit.git
   1edee6b..fbff5bc  master -> master

Push ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚œ ๊ฒฐ๊ณผ ์ค‘ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ค„์€ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ค„์˜ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋Š” <oldref>..<newref> fromref โ†’ toref ์ด๋‹ค. oldref ๋Š” ์ด์ „ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ, newref ๋Š” ์ƒˆ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ, fromref ๋Š” Push ๋ช…๋ น์—์„œ ์‚ฌ์šฉํ•œ ๋กœ์ปฌ ๋ ˆํผ๋Ÿฐ์Šค์˜ ์ด๋ฆ„์„, toref ๋Š” Push๋กœ ์—…๋ฐ์ดํŠธํ•œ ๋ฆฌ๋ชจํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด์–ด์ง€๋Š” ๋‚ด์šฉ์—์„œ ์ง€๊ธˆ๊ณผ ๋น„์Šทํ•œ Push ๋ช…๋ น ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ์—ฌ๋Ÿฌ๋ฒˆ ๋“ฑ์žฅํ•œ๋‹ค. ์ด ์ถœ๋ ฅ ๋ฉ”์‹œ์ง€์˜ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉด ๋‹ค์–‘ํ•œ ์ƒํƒœ์—์„œ ์ •ํ™•ํ•˜๊ฒŒ ์–ด๋–ค์ผ์ด ๋ฒŒ์–ด์ง€๋Š”๊ฐ€๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ข€ ๋” ์‚ดํŽด๋ณด๋ ค๋ฉด Git ๋ฌธ์„œ git-push๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๋‹ค์‹œ ์˜ˆ์ œ ๋‚ด์šฉ์œผ๋กœ ๋Œ์•„์˜ค๋ฉด, John๋„ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ปค๋ฐ‹์„ ๋งŒ๋“  ํ›„ ์„œ๋ฒ„๋กœ ์ปค๋ฐ‹์„ Push ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

# John's Machine
$ git push origin master
To john@githost:simplegit.git
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to 'john@githost:simplegit.git'

Jessica์˜ Pushํ•œ ๋‚ด์šฉ์œผ๋กœ ์ธํ•ด, John์˜ ์ปค๋ฐ‹์€ ์„œ๋ฒ„์—์„œ ๊ฑฐ์ ˆ๋œ๋‹ค. Subversion์„ ์‚ฌ์šฉํ–ˆ๋˜ ์‚ฌ๋žŒ์€ ์ด ๋ถ€๋ถ„์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ๊ฐ™์€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ ๊ฒƒ๋„ ์•„๋‹Œ๋ฐ ์™œ Push๊ฐ€ ๊ฑฐ์ ˆ๋˜๋Š” ๊ฑธ๊นŒ? Subversion์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š” ์ด๋Ÿฐ Merge ์ž‘์—…์€ ์ž๋™์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ Git์€ ๋กœ์ปฌ์—์„œ ๋จผ์ € Merge ํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด John์€ Push ํ•˜๊ธฐ ์ „์— Jessica๊ฐ€ ์ˆ˜์ •ํ•œ ์ปค๋ฐ‹์„ Fetch ํ•˜๊ณ  Merge ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์šฐ์„  John์€ Jessica์˜ ์ž‘์—… ๋‚ด์šฉ์„ ์•„๋ž˜์™€ ๊ฐ™์ด Fetch ํ•œ๋‹ค(์•„๋ž˜ ๋ช…๋ น์€ Jessica์˜ ์ž‘์—… ๋‚ด์šฉ์„ ๋‚ด๋ ค๋ฐ›๊ธด ํ•˜์ง€๋งŒ Merge ๊นŒ์ง€ ํ•˜์ง€๋Š” ์•Š๋Š” ์ž‘์—…์ด๋‹ค).

$ git fetch origin
...
From john@githost:simplegit
 + 049d078...fbff5bc master     -> origin/master

Fetch ํ•˜๊ณ  ๋‚˜๋ฉด John์˜ ๋กœ์ปฌ ์ €์žฅ์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

Fetch ํ•˜๊ณ  ๋‚œ John์˜ ์ €์žฅ์†Œ.
Figure 2. Fetch ํ•˜๊ณ  ๋‚œ John์˜ ์ €์žฅ์†Œ.

์ด์ œ John์€ Fetchํ•˜์—ฌ ๊ฐ€์ ธ ์˜จ Jessica์˜ ์ž‘์—… ๋‚ด์šฉ์„ Merge ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ git merge origin/master
Merge made by the 'recursive' strategy.
 TODO |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

Merge๊ฐ€ ์ž˜ ์ด๋ฃจ์–ด์ง€๋ฉด John์˜ ๋ธŒ๋žœ์น˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

`origin/master` ๋ธŒ๋žœ์น˜๋ฅผ Merge ํ•˜๊ณ  ๋‚œ ํ›„ John์˜ ์ €์žฅ์†Œ.
Figure 3. origin/master ๋ธŒ๋žœ์น˜๋ฅผ Merge ํ•˜๊ณ  ๋‚œ ํ›„ John์˜ ์ €์žฅ์†Œ.

John์€ Merge ํ•˜๊ณ  ๋‚˜์„œ ์ž์‹ ์ด ์ž‘์—…ํ•œ ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๊ทธ ํ›„์— ๊ณต์œ ํ•˜๋Š” ์ €์žฅ์†Œ์— Push ํ•œ๋‹ค.

$ git push origin master
...
To john@githost:simplegit.git
   fbff5bc..72bbc59  master -> master

์ด์ œ John์˜ ์ €์žฅ์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋˜์—ˆ๋‹ค.

Push ํ•˜๊ณ  ๋‚œ ํ›„ John์˜ ์ €์žฅ์†Œ.
Figure 4. Push ํ•˜๊ณ  ๋‚œ ํ›„ John์˜ ์ €์žฅ์†Œ.

๋™์‹œ์— Jessica๋Š” ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค. issue54 ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ์„ธ ๋ฒˆ์— ๊ฑธ์ณ์„œ ์ปค๋ฐ‹ํ•œ๋‹ค. ์•„์ง John์˜ ์ปค๋ฐ‹์„ Fetch ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋œ๋‹ค.

Jessica์˜ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜.
Figure 5. Jessica์˜ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜.

Jessica๋Š” John์ด ์ƒˆ๋กœ Pushํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์–ด ํ•˜๋˜ ์ž‘์—…์„ ๋ฉˆ์ถ”๊ณ  John์˜ ์ž‘์—… ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง Jessica๋Š” John์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ์ƒํƒœ์ด๋‹ค.

# Jessica's Machine
$ git fetch origin
...
From jessica@githost:simplegit
   fbff5bc..72bbc59  master     -> origin/master

์œ„ ๋ช…๋ น์œผ๋กœ John์ด Push ํ•œ ์ปค๋ฐ‹์„ ๋ชจ๋‘ ๋‚ด๋ ค๋ฐ›๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Jessica์˜ ์ €์žฅ์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

John์˜ ์ปค๋ฐ‹์„ Fetch ํ•œ ํ›„ Jessica์˜ ์ €์žฅ์†Œ.
Figure 6. John์˜ ์ปค๋ฐ‹์„ Fetch ํ•œ ํ›„ Jessica์˜ ์ €์žฅ์†Œ.

์ด์ œ orgin/master ์™€ Merge ํ•  ์ฐจ๋ก€๋‹ค. Jessica๋Š” ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์—์„œ์˜ ์ž‘์—…์„ ๋งˆ์น˜๊ณ  ์–ด๋–ค ๋‚ด์šฉ์ด Merge ๋˜๋Š”์ง€ git log ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•œ๋‹ค.

$ git log --no-merges issue54..origin/master
commit 738ee872852dfaa9d6634e0dea7a324040193016
Author: John Smith <jsmith@example.com>
Date:   Fri May 29 16:01:27 2009 -0700

   remove invalid default value

issue54..origin/master ๋ฌธ๋ฒ•์€ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋’ค์˜ ๋ธŒ๋žœ์น˜(origin/master)์— ์†ํ•œ ์ปค๋ฐ‹ ์ค‘ ์•ž์˜ ๋ธŒ๋žœ์น˜(issue54)์— ์†ํ•˜์ง€ ์•Š์€ ์ปค๋ฐ‹์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฌธ๋ฒ•์ด๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ch07-git-tools.asc์—์„œ ๋‹ค๋ฃฌ๋‹ค.

์•ž์˜ ๋ช…๋ น์— ๋”ฐ๋ผ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ John์ด ์ƒ์„ฑํ•˜๊ณ  Jessica๊ฐ€ Merge ํ•˜์ง€ ์•Š์€ ์ปค๋ฐ‹์„ ํ•˜๋‚˜ ์ฐพ์•˜๋‹ค. origin/master ๋ธŒ๋žœ์น˜๋ฅผ Merge ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒ€์ƒ‰๋œ ์ปค๋ฐ‹ ํ•˜๋‚˜๊ฐ€ ๋กœ์ปฌ ์ž‘์—…์— Merge ๋  ๊ฒƒ์ด๋‹ค.

Merge ํ•  ๋‚ด์šฉ์„ ํ™•์ธํ•œ Jessica๋Š” ์ž์‹ ์ด ์ž‘์—…ํ•œ ๋‚ด์šฉ๊ณผ John์ด Push ํ•œ ์ž‘์—…(origin/master)์„ master ๋ธŒ๋žœ์น˜์— Merge ํ•˜๊ณ  Push ํ•œ๋‹ค.

issue54 ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์— ์Œ“์€ ๋ชจ๋“  ๋‚ด์šฉ์„ ํ•ฉ์น˜๋ ค๋ฉด, ์šฐ์„  master ๋ธŒ๋žœ์น˜๋ฅผ Checkout ํ•ด์•ผ ํ•œ๋‹ค.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.

origin/master, issue54 ๋ชจ๋‘ Upstream ๋ธŒ๋žœ์น˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜ ์ค‘์— ๋ฌด์—‡์„ ๋จผ์ € Merge ํ•˜๋“  ์ƒ๊ด€์ด ์—†๋‹ค. ๋ฌผ๋ก  ์–ด๋–ค ๊ฒƒ์„ ๋จผ์ € Merge ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ํžˆ์Šคํ† ๋ฆฌ ์ˆœ์„œ๋Š” ๋‹ฌ๋ผ์ง€์ง€๋งŒ, ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋˜‘๊ฐ™๋‹ค. Jessica๋Š” ๋จผ์ € issue54 ๋ธŒ๋žœ์น˜๋ฅผ Merge ํ•œ๋‹ค.

$ git merge issue54
Updating fbff5bc..4af4298
Fast forward
 README           |    1 +
 lib/simplegit.rb |    6 +++++-
 2 files changed, 6 insertions(+), 1 deletions(-)

๋ณด๋‹ค์‹œํ”ผ Fast-forward Merge ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ช…๋ น ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. origin/master ์— ์Œ“์—ฌ์žˆ๋˜ John์˜ ์ž‘์—… ๋‚ด์šฉ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•˜์—ฌ Jessica๋Š” Merge ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.

$ git merge origin/master
Auto-merging lib/simplegit.rb
Merge made by the 'recursive' strategy.
 lib/simplegit.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

์œ„์™€ ๊ฐ™์ด Merge๊ฐ€ ์ž˜ ๋˜๋ฉด ๊ทธ๋ฆผ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

John์˜ ์ปค๋ฐ‹์„ Merge ํ›„ Jessica์˜ ์ €์žฅ์†Œ.
Figure 7. John์˜ ์ปค๋ฐ‹์„ Merge ํ›„ Jessica์˜ ์ €์žฅ์†Œ.

origin/master ๋ธŒ๋žœ์น˜๊ฐ€ Jessica์˜ master ๋ธŒ๋žœ์น˜๋กœ ๋‚˜์•„๊ฐˆ(reachable) ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Push๋Š” ์„ฑ๊ณตํ•œ๋‹ค(๋ฌผ๋ก  John์ด ๊ทธ ์‚ฌ์ด์— Push ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด).

$ git push origin master
...
To jessica@githost:simplegit.git
   72bbc59..8059c15  master -> master

๋‘ ๊ฐœ๋ฐœ์ž์˜ ์ปค๋ฐ‹์„ ์„ฑ๊ณต์ ์œผ๋กœ Merge ํ•˜๊ณ  ๋‚˜๋ฉด ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Jessica๊ฐ€ ์„œ๋ฒ„๋กœ Push ํ•˜๊ณ  ๋‚œ ํ›„์˜ ์ €์žฅ์†Œ.
Figure 8. Jessica๊ฐ€ ์„œ๋ฒ„๋กœ Push ํ•˜๊ณ  ๋‚œ ํ›„์˜ ์ €์žฅ์†Œ.

๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ƒํ™ฉ์˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค. ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์—์„œ ์ˆ˜์ •ํ•˜๊ณ  ๋กœ์ปฌ์˜ master ๋ธŒ๋žœ์น˜์— Merge ํ•œ๋‹ค. ์ž‘์—…ํ•œ ๋‚ด์šฉ์„ ํ”„๋กœ์ ํŠธ์˜ ๊ณต์œ  ์ €์žฅ์†Œ์— Push ํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ์šฐ์„  origin/master ๋ธŒ๋žœ์น˜๋ฅผ Fetch ํ•˜๊ณ  Merge ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ Merge ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์„œ๋ฒ„๋กœ Push ํ•œ๋‹ค. ์ด๋Ÿฐ ์›Œํฌํ”Œ๋กœ๊ฐ€ ์ผ๋ฐ˜์ ์ด๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ Git์„ ์‚ฌ์šฉํ•˜๋Š” ์›Œํฌํ”Œ๋กœ.
Figure 9. ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ Git์„ ์‚ฌ์šฉํ•˜๋Š” ์›Œํฌํ”Œ๋กœ.

๋น„๊ณต๊ฐœ ๋Œ€๊ทœ๋ชจ ํŒ€

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

John๊ณผ Jessica๋Š” โ€œfeatureAโ€ ๊ธฐ๋Šฅ์„ ํ•จ๊ป˜ ์ž‘์—…ํ•˜๊ฒŒ ๋๋‹ค. Jessica๋Š” Josie์™€ ํ•จ๊ป˜ โ€œfeatureBโ€ ๊ธฐ๋Šฅ๋„ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์ด๋ผ๋ฉด ํšŒ์‚ฌ๋Š” Integration-manager ์›Œํฌํ”Œ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค. ์ž‘์€ ํŒ€์ด ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฌผ์€ Integration-Manager๊ฐ€ Merge ํ•˜๊ณ  ๊ณต์œ  ์ €์žฅ์†Œ์˜ master ๋ธŒ๋žœ์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ํŒ€๋งˆ๋‹ค ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค๊ณ  Integration-Manager๋Š” ๊ทธ ๋ธŒ๋žœ์น˜๋ฅผ Pull ํ•ด์„œ Merge ํ•œ๋‹ค.

๋‘ ํŒ€์— ๋ชจ๋‘ ์†ํ•œ Jessica์˜ ์ž‘์—… ์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ณด์ž. ์šฐ์„  Jessica๋Š” ์ €์žฅ์†Œ๋ฅผ Clone ํ•˜๊ณ  featureA ์ž‘์—…์„ ๋จผ์ € ํ•œ๋‹ค. featureA ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์ปค๋ฐ‹ํ•œ๋‹ค.

# Jessica's Machine
$ git checkout -b featureA
Switched to a new branch 'featureA'
$ vim lib/simplegit.rb
$ git commit -am 'add limit to log function'
[featureA 3300904] add limit to log function
 1 files changed, 1 insertions(+), 1 deletions(-)

์ด ์ˆ˜์ •ํ•œ ๋ถ€๋ถ„์„ John๊ณผ ๊ณต์œ ํ•ด์•ผ ํ•œ๋‹ค. ๊ณต์œ ํ•˜๋ ค๋ฉด ์šฐ์„  featureA ๋ธŒ๋žœ์น˜๋ฅผ ์„œ๋ฒ„๋กœ Push ํ•œ๋‹ค. Integration-Manager๋งŒ master ๋ธŒ๋žœ์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— master ๋ธŒ๋žœ์น˜๋กœ Push๋ฅผ ํ•  ์ˆ˜ ์—†๊ณ  ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ John๊ณผ ๊ณต์œ ํ•œ๋‹ค.

$ git push -u origin featureA
...
To jessica@githost:simplegit.git
 * [new branch]      featureA -> featureA

Jessica๋Š” ์ž์‹ ์ด ํ•œ ์ผ์„ featureA ๋ผ๋Š” ๋ธŒ๋žœ์น˜๋กœ Push ํ–ˆ๋‹ค๋Š” ์ด๋ฉ”์ผ์„ John์—๊ฒŒ ๋ณด๋‚ธ๋‹ค. John์˜ ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ Jessica๋Š” Josie์™€ ํ•จ๊ป˜ ํ•˜๋Š” featureB ์ž‘์—…์„ ํ•˜๊ธฐ๋กœ ํ•œ๋‹ค. ์„œ๋ฒ„์˜ master ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.

# Jessica's Machine
$ git fetch origin
$ git checkout -b featureB origin/master
Switched to a new branch 'featureB'

๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ํ•˜๊ณ  featureB ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹ํ•œ๋‹ค.

$ vim lib/simplegit.rb
$ git commit -am 'made the ls-tree function recursive'
[featureB e5b0fdc] made the ls-tree function recursive
 1 files changed, 1 insertions(+), 1 deletions(-)
$ vim lib/simplegit.rb
$ git commit -am 'add ls-files'
[featureB 8512791] add ls-files
 1 files changed, 5 insertions(+), 0 deletions(-)

๊ทธ๋Ÿผ Jessica์˜ ์ €์žฅ์†Œ๋Š” ๊ทธ๋ฆผ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Jessica์˜ ์ €์žฅ์†Œ.
Figure 10. Jessica์˜ ์ €์žฅ์†Œ.

์ž‘์—…์„ ๋งˆ์น˜๊ณ  Push ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ Jesie๊ฐ€ ์ด๋ฏธ โ€œfeatureBโ€ ์ž‘์—…์„ ํ•˜๊ณ  ์„œ๋ฒ„์— featureBee ๋ธŒ๋žœ์น˜๋กœ Push ํ–ˆ๋‹ค๋Š” ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์™”๋‹ค. Jessica๋Š” Jesie์˜ ์ž‘์—…์„ ๋จผ์ € Merge ํ•ด์•ผ๋งŒ Push ํ•  ์ˆ˜ ์žˆ๋‹ค. Merge ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ์„  git fetch ๋กœ Fetch ํ•œ๋‹ค.

$ git fetch origin
...
From jessica@githost:simplegit
 * [new branch]      featureBee -> origin/featureBee

Jessica๊ฐ€ ์•ž์„œ Checkout ํ•œ featureB ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…์ค‘์ผ ๋•Œ, Fetch ํ•ด ์˜จ ๋ธŒ๋žœ์น˜๋ฅผ git merge ๋ช…๋ น์œผ๋กœ Merge ํ•œ๋‹ค.

$ git merge origin/featureBee
Auto-merging lib/simplegit.rb
Merge made by the 'recursive' strategy.
 lib/simplegit.rb |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

์ด ์‹œ์ ์—์„œ Jissica๋Š” Merge ํ•œ โ€œfeatureBโ€ ์ž‘์—…์„ ์„œ๋ฒ„๋กœ Push ํ•  ๋•Œ ์„œ๋ฒ„์˜ featureB ๋ธŒ๋žœ์น˜๋กœ Pushํ•˜์ง€ ์•Š๊ณ ์ž ํ•œ๋‹ค. ์ด๋ฏธ Josie๊ฐ€ ์ƒ์„ฑํ•œ featureBee ๋กœ ์ž‘์—… ๋‚ด์šฉ์„ Push ํ•˜๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

$ git push -u origin featureB:featureBee
...
To jessica@githost:simplegit.git
   fba9af8..cd685d1  featureB -> featureBee

์ด๊ฒƒ์€ refspec ์ด๋ž€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ๋ฐ ch10-git-internals.asc ์—์„œ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค. ๋ช…๋ น์—์„œ ์‚ฌ์šฉํ•œ -u ์˜ต์…˜์€ --set-upstream ์˜ต์…˜์˜ ์งง์€ ํ‘œํ˜„์ธ๋ฐ ๋ธŒ๋žœ์น˜๋ฅผ ์ถ”์ ํ•˜๋„๋ก ์„ค์ •ํ•ด์„œ ์ดํ›„ Push ๋‚˜ Pull ํ•  ๋•Œ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

John์ด ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ํ•˜๊ณ  ๋‚˜์„œ featureA ์— Push ํ–ˆ๊ณ  ํ™•์ธํ•ด ๋‹ฌ๋ผ๋Š” ๋‚ด์šฉ์˜ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์™”๋‹ค. Jessica๋Š” John์˜ ์ž‘์—… ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ํ•œ ๋ฒˆ git fetch ๋กœ Push๋œ ์ž‘์—…์„ Fetch ํ•œ๋‹ค.

$ git fetch origin
...
From jessica@githost:simplegit
   3300904..aad881d  featureA   -> origin/featureA

Jessica์˜ ๋กœ์ปฌ featureA ๋ธŒ๋žœ์น˜์™€ Fetch ํ•ด ์˜จ John์˜ ์ž‘์—…๋‚ด์šฉ์ด ๊ฐ™์€ featureA ๋ธŒ๋žœ์น˜ ์ƒ์—์„œ ์–ด๋–ค ๊ฒƒ์ด ์—…๋ฐ์ดํŠธ๋๋Š”์ง€ git log ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•œ๋‹ค.

$ git log featureA..origin/featureA
commit aad881d154acdaeb2b6b18ea0e827ed8a6d671e6
Author: John Smith <jsmith@example.com>
Date:   Fri May 29 19:57:33 2009 -0700

    changed log output to 30 from 25

ํ™•์ธ์„ ๋งˆ์น˜๋ฉด ๋กœ์ปฌ์˜ featureA ๋ธŒ๋žœ์น˜๋กœ John์˜ ์ž‘์—… ๋‚ด์šฉ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Merge ํ•œ๋‹ค.

$ git checkout featureA
Switched to branch 'featureA'
$ git merge origin/featureA
Updating 3300904..aad881d
Fast forward
 lib/simplegit.rb |   10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)

Jessica๋Š” ์ผ๋ถ€ ์ˆ˜์ •ํ•˜๊ณ , featureA ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹ํ•˜๊ณ , ์ˆ˜์ •ํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ์„œ๋ฒ„๋กœ Push ํ•œ๋‹ค.

$ git commit -am 'small tweak'
[featureA 774b3ed] small tweak
 1 files changed, 1 insertions(+), 1 deletions(-)
$ git push
...
To jessica@githost:simplegit.git
   3300904..774b3ed  featureA -> featureA

์œ„์™€ ๊ฐ™์€ ์ž‘์—…์„ ๋งˆ์น˜๊ณ  ๋‚˜๋ฉด Jessica์˜ ์ €์žฅ์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์Šต์ด ๋œ๋‹ค.

๋งˆ์ง€๋ง‰ Push ํ•˜๊ณ  ๋‚œ ํ›„์˜ Jessica์˜ ์ €์žฅ์†Œ.
Figure 11. ๋งˆ์ง€๋ง‰ Push ํ•˜๊ณ  ๋‚œ ํ›„์˜ Jessica์˜ ์ €์žฅ์†Œ.

๊ทธ๋Ÿผ featureA ์™€ featureBee ๋ธŒ๋žœ์น˜๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ Merge ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  Integration-Manager์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค. Integration-Manager๊ฐ€ ๋‘ ๋ธŒ๋žœ์น˜๋ฅผ ๋ชจ๋‘ Merge ํ•˜๊ณ  ๋‚œ ํ›„์— ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ Fetch ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์–‘์ด ๋œ๋‹ค.

๋‘ ๋ธŒ๋žœ์น˜๊ฐ€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— Merge ๋œ ํ›„์˜ ์ €์žฅ์†Œ.
Figure 12. ๋‘ ๋ธŒ๋žœ์น˜๊ฐ€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— Merge ๋œ ํ›„์˜ ์ €์žฅ์†Œ.

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

Managed ํŒ€์˜ ์›Œํฌํ”Œ๋กœ.
Figure 13. Managed ํŒ€์˜ ์›Œํฌํ”Œ๋กœ.

๊ณต๊ฐœ ํ”„๋กœ์ ํŠธ Fork

๋น„๊ณต๊ฐœ ํŒ€์„ ์šด์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ณต๊ฐœ ํŒ€์„ ์šด์˜ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค. ๊ณต๊ฐœ ํŒ€์„ ์šด์˜ํ•  ๋•Œ๋Š” ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ๊ณต์œ  ์ €์žฅ์†Œ์— ์ง์ ‘์ ์œผ๋กœ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ฐ€์ง€์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋กœ์ ํŠธ์˜ ๊ด€๋ฆฌ์ž๋Š” ๋ช‡ ๊ฐ€์ง€ ์ผ์„ ๋” ํ•ด์ค˜์•ผ ํ•œ๋‹ค. Fork๋ฅผ ์ง€์›ํ•˜๋Š” Git ํ˜ธ์ŠคํŒ…์—์„œ Fork๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฒ•์„ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณธ๋‹ค. Git ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ(GitHub, BitBucket, repo.or.cz ๋“ฑ) ๋Œ€๋ถ€๋ถ„์€ Fork ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๋Š” ๋ณดํ†ต Fork ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์šด์˜ํ•œ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฉ”์ผ๊ณผ Patch๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ๋Š”๋ฐ ๋’ค์ด์–ด ์‚ดํŽด๋ณธ๋‹ค.

์šฐ์„  ์ฒ˜์Œ ํ•  ์ผ์€ ๋ฉ”์ธ ์ €์žฅ์†Œ๋ฅผ Clone ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ผ์ • ๋ถ€๋ถ„ ๊ธฐ์—ฌํ•œ๋‹ค. ๊ทธ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

$ git clone <url>
$ cd project
$ git checkout -b featureA
  ... work ...
$ git commit
  ... work ...
$ git commit
Note

rebase -i ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์œผ๋กœ ํ•ฉ์น˜๊ฑฐ๋‚˜ ํ”„๋กœ์ ํŠธ์˜ ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜์ •์‚ฌํ•ญ์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋„๋ก ์ปค๋ฐ‹์„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ch07-git-tools.asc ์—์„œ ๋Œ€ํ™”์‹์œผ๋กœ Rebase ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณธ๋‹ค.

์ผ๋‹จ ํ”„๋กœ์ ํŠธ์˜ ์›น์‚ฌ์ดํŠธ๋กœ ๊ฐ€์„œ โ€œForkโ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์›๋ž˜ ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ์—์„œ ๊ฐˆ๋ผ์ ธ ๋‚˜์˜จ, ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋Š” ์ €์žฅ์†Œ๊ฐ€ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋กœ์ปฌ์—์„œ ์ˆ˜์ •ํ•œ ์ปค๋ฐ‹์„ ์›๋ž˜ ์ €์žฅ์†Œ์— Push ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ €์žฅ์†Œ๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ์˜ ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ๋กœ ๋“ฑ๋กํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด myfork ๋กœ ๋“ฑ๋กํ•œ๋‹ค.

$ git remote add myfork <url>

์ž ์ด์ œ ๋“ฑ๋กํ•œ ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ์— Push ํ•œ๋‹ค. ์ž‘์—…ํ•˜๋˜ ๊ฒƒ์„ ๋กœ์ปฌ ์ €์žฅ์†Œ์˜ master ๋ธŒ๋žœ์น˜์— Merge ํ•œ ํ›„ Push ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜์— ๋ฐ”๋กœ Push๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๋ฅผ ํ”„๋กœ์ ํŠธ์— ํฌํ•จ์‹œํ‚ค๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๋ฅผ Merge ํ•˜๊ธฐ ์ด์ „ ์ƒํƒœ๋กœ master ๋ธŒ๋žœ์น˜๋ฅผ ๋˜๋Œ๋ฆด ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (cherry-pick ๋ช…๋ น์€ ch05-distributed-git.asc ์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃฌ๋‹ค). ๊ด€๋ฆฌ์ž๊ฐ€ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๋ฅผ Merge ํ•˜๋“  Rebase ํ•˜๋“  Cherry-Pick ํ•˜๋“ ์ง€ ๊ฐ„์— ๊ฒฐ๊ตญ ๋‹ค์‹œ ๊ด€๋ฆฌ์ž์˜ ์ €์žฅ์†Œ๋ฅผ Pull ํ•  ๋•Œ๋Š” ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์ด ๋“ค์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ๋ผ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์—… ๋‚ด์šฉ์„ Push ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ git push -u myfork featureA

Fork ํ•œ ์ €์žฅ์†Œ์— Push ํ•˜๊ณ  ๋‚˜๋ฉด ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ด ๋‚ด์šฉ์„ ์•Œ๋ ค์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์„ Pull Request ๋ผ๊ณ  ํ•œ๋‹ค. Git ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ์—์„œ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ณด๋‚ผ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ git request-pull ๋ช…๋ น์œผ๋กœ ์ด๋ฉ”์ผ์„ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. GitHub์˜ โ€œPull Requestโ€ ๋ฒ„ํŠผ์€ ์ž๋™์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š”๋ฐ ๊ด€๋ จ ๋‚ด์šฉ์€ ch06-github.asc ์—์„œ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

git request-pull ๋ช…๋ น์€ ์•„๊ทœ๋จผํŠธ๋ฅผ ๋‘ ๊ฐœ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ์ฒซ ๋ฒˆ์งธ ์•„๊ทœ๋จผํŠธ๋Š” ์ž‘์—…ํ•œ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์˜ Base ๋ธŒ๋žœ์น˜์ด๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๊ฐ€ ์œ„์น˜ํ•œ ์ €์žฅ์†Œ URL์ธ๋ฐ ์œ„์—์„œ ๋“ฑ๋กํ•œ ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ ์ด๋ฆ„์„ ์ ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ช…๋ น์€ ํ† ํ”ฝ ๋ธŒ๋žœ์น˜ ์ˆ˜์ •์‚ฌํ•ญ์„ ์š”์•ฝํ•œ ๋‚ด์šฉ์„ ๊ฒฐ๊ณผ๋กœ ๋ณด์—ฌ์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Jessica๊ฐ€ John์—๊ฒŒ Pull ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ƒํ™ฉ์„ ์‚ดํŽด๋ณด์ž. Jessica๋Š” ํ† ํ”ฝ ๋ธŒ๋žœ์น˜์— ๋‘ ๋ฒˆ ์ปค๋ฐ‹์„ ํ•˜๊ณ  Fork ํ•œ ์ €์žฅ์†Œ์— Push ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

$ git request-pull origin/master myfork
The following changes since commit 1edee6b1d61823a2de3b09c160d7080b8d1b3a40:
Jessica Smith (1):
        added a new function

are available in the git repository at:

  git://githost/simplegit.git featureA

Jessica Smith (2):
      add limit to log function
      change log output to 30 from 25

 lib/simplegit.rb |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

๊ด€๋ฆฌ์ž์—๊ฒŒ ์ด ๋‚ด์šฉ์„ ๋ณด๋‚ธ๋‹ค. ์ด ๋‚ด์šฉ์—๋Š” ํ† ํ”ฝ ๋ธŒ๋žœ์น˜๊ฐ€ ์–ด๋А ์‹œ์ ์— ๊ฐˆ๋ผ์ ธ ๋‚˜์˜จ ๊ฒƒ์ธ์ง€, ์–ด๋–ค ์ปค๋ฐ‹์ด ์žˆ๋Š”์ง€, Pull ํ•˜๋ ค๋ฉด ์–ด๋–ค ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋“ค์–ด ์žˆ๋‹ค.

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

$ git checkout -b featureB origin/master
  ... work ...
$ git commit
$ git push myfork featureB
$ git request-pull origin/master myfork
  ... email generated request pull to maintainer ...
$ git fetch origin

๊ฐ ํ† ํ”ฝ์€ ์ผ์ข…์˜ ์‹คํ—˜์‹ค์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ํ† ํ”ฝ์€ ์„œ๋กœ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ณ  Rebase ํ•  ์ˆ˜ ์žˆ๋‹ค.

featureB ์ˆ˜์ •์ž‘์—…์ด ๋๋‚œ ์งํ›„ ์ €์žฅ์†Œ์˜ ๋ชจ์Šต.
Figure 14. featureB ์ˆ˜์ •์ž‘์—…์ด ๋๋‚œ ์งํ›„ ์ €์žฅ์†Œ์˜ ๋ชจ์Šต.

ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๊ฐ€ ์‚ฌ๋žŒ๋“ค์˜ ์ˆ˜์ • ์‚ฌํ•ญ์„ Merge ํ•˜๊ณ  ๋‚˜์„œ Jessica์˜ ๋ธŒ๋žœ์น˜๋ฅผ Merge ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ถฉ๋Œ์ด ๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Jessica๊ฐ€ ์ž์‹ ์˜ ๋ธŒ๋žœ์น˜๋ฅผ origin/master ์— Rebase ํ•ด์„œ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ค์‹œ Pull Request์„ ๋ณด๋‚ธ๋‹ค.

$ git checkout featureA
$ git rebase origin/master
$ git push -f myfork featureA

์œ„ ๋ช…๋ น๋“ค์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด ํžˆ์Šคํ† ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•„์ง„๋‹ค.

FeatureA์— ๋Œ€ํ•œ Rebase๊ฐ€ ์ ์šฉ๋œ ํ›„์˜ ๋ชจ์Šต.
Figure 15. FeatureA์— ๋Œ€ํ•œ Rebase๊ฐ€ ์ ์šฉ๋œ ํ›„์˜ ๋ชจ์Šต.

๋ธŒ๋žœ์น˜๋ฅผ Rebase ํ•ด ๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์— Push ํ•  ๋•Œ -f ์˜ต์…˜์„ ์ฃผ๊ณ  ๊ฐ•์ œ๋กœ ๊ธฐ์กด ์„œ๋ฒ„์— ์žˆ๋˜ featureA ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์„ ๋ฎ์–ด ์จ์•ผ ํ•œ๋‹ค. ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ(์˜ˆ๋ฅผ ๋“ค์–ด featureAv2) ์„œ๋ฒ„์— Push ํ•ด๋„ ๋œ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ•˜๋‚˜ ๋” ์‚ดํŽด๋ณด์ž. ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๋Š” featureB ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์€ ์ข‹์ง€๋งŒ, ์ƒ์„ธ ๊ตฌํ˜„์€ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค. ๊ด€๋ฆฌ์ž๋Š” featureB ๋‹ด๋‹น์ž์—๊ฒŒ ์ƒ์„ธ ๊ตฌํ˜„์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•œ๋‹ค. featureB ๋‹ด๋‹น์ž๋Š” ํ•˜๋Š” ๊น€์— featureB ๋ธŒ๋žœ์น˜๋ฅผ ํ”„๋กœ์ ํŠธ์˜ ์ตœ์‹  master ๋ธŒ๋žœ์น˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ฎ๊ธด๋‹ค. ๋จผ์ € origin/master ๋ธŒ๋žœ์น˜์—์„œ featureBv2 ๋ธŒ๋žœ์น˜๋ฅผ ์ƒˆ๋กœ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , featureB ์˜ ์ปค๋ฐ‹๋“ค์„ ๋ชจ๋‘ Squash ํ•ด์„œ Merge ํ•˜๊ณ , ๋งŒ์•ฝ ์ถฉ๋Œ์ด ๋‚˜๋ฉด ํ•ด๊ฒฐํ•˜๊ณ , ์ƒ์„ธ ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•˜๊ณ , ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ Push ํ•œ๋‹ค.

$ git checkout -b featureBv2 origin/master
$ git merge --squash featureB
  ... change implementation ...
$ git commit
$ git push myfork featureBv2

--squash ์˜ต์…˜์€ ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— Merge ํ•  ๋•Œ ํ•ด๋‹น ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹์„ ๋ชจ๋‘ ์ปค๋ฐ‹ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์„œ Merge ํ•œ๋‹ค. ์ด ๋•Œ Merge ์ปค๋ฐ‹์€ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์—์„œ ์ˆ˜์ •ํ•œ ์‚ฌํ•ญ์„ ์ „๋ถ€ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋˜‘๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์ปค๋ฐ‹์€ ๋ถ€๋ชจ๊ฐ€ ํ•˜๋‚˜์ด๊ณ  ์ปค๋ฐ‹์„ ๊ธฐ๋กํ•˜๊ธฐ ์ „์— ์ข€ ๋” ์ˆ˜์ •ํ•  ๊ธฐํšŒ๋„ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์—์„œ ์ˆ˜์ •ํ•œ ์‚ฌํ•ญ์„ ์ „๋ถ€ ๊ฐ€์ ธ์˜ค๋ฉด์„œ ๊ทธ์ „์— ์ถ”๊ฐ€์ ์œผ๋กœ ์ˆ˜์ •ํ•  ๊ฒŒ ์žˆ์œผ๋ฉด ์ˆ˜์ •ํ•˜๊ณ  Merge ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์ปค๋ฐ‹์€ ๋ถ€๋ชจ๊ฐ€ ํ•˜๋‚˜๋‹ค. --no-commit ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ปค๋ฐ‹์„ ํ•ฉ์ณ ๋†“๊ณ  ์ž๋™์œผ๋กœ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ˆ˜์ •์„ ๋งˆ์น˜๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ featureBv2 ๋ธŒ๋žœ์น˜๋ฅผ ํ™•์ธํ•ด ๋ณด๋ผ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ๋‹ค.

featureBv2 ๋ธŒ๋žœ์น˜๋ฅผ ์ปค๋ฐ‹ํ•œ ์ดํ›„ ์ €์žฅ์†Œ ๋ชจ์Šต.
Figure 16. featureBv2 ๋ธŒ๋žœ์น˜๋ฅผ ์ปค๋ฐ‹ํ•œ ์ดํ›„ ์ €์žฅ์†Œ ๋ชจ์Šต.

๋Œ€๊ทœ๋ชจ ๊ณต๊ฐœ ํ”„๋กœ์ ํŠธ์™€ ์ด๋ฉ”์ผ์„ ํ†ตํ•œ ๊ด€๋ฆฌ

๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋Š” ๋ณดํ†ต ์ˆ˜์ •์‚ฌํ•ญ์ด๋‚˜ Patch๋ฅผ ์ˆ˜์šฉํ•˜๋Š” ์ž์‹ ๋งŒ์˜ ๊ทœ์น™์„ ๋งˆ๋ จํ•ด๋†“๊ณ  ์žˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๊ทœ์น™์€ ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ์น™์„ ๋ฏธ๋ฆฌ ์•Œ์•„๋‘˜ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์˜ค๋ž˜๋œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋Š” ๋Œ€๋ถ€๋ถ„ ๋ฉ”์ผ๋ง๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ Patch๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š”๋ฐ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณธ๋‹ค.

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

$ git checkout -b topicA
  ... work ...
$ git commit
  ... work ...
$ git commit

์ปค๋ฐ‹์„ ๋‘ ๋ฒˆ ํ•˜๊ณ  ๋ฉ”์ผ๋ง๋ฆฌ์ŠคํŠธ์— ๋ณด๋‚ด ๋ณด์ž. git format-patch ๋ช…๋ น์œผ๋กœ ๋ฉ”์ผ๋ง๋ฆฌ์ŠคํŠธ์— ๋ณด๋‚ผ mbox ํ˜•์‹์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ฐ ์ปค๋ฐ‹์€ ํ•˜๋‚˜์”ฉ ์ด๋ฉ”์ผ ๋ฉ”์‹œ์ง€๋กœ ์ƒ์„ฑ๋˜๋Š”๋ฐ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ์ฒซ ๋ฒˆ์งธ ๋ผ์ธ์ด ์ œ๋ชฉ์ด ๋˜๊ณ  Merge ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ๊ณผ Patch ์ž์ฒด๊ฐ€ ๋ฉ”์ผ ๋ฉ”์‹œ์ง€์˜ ๋ณธ๋ฌธ์ด ๋œ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ˆ˜์‹ ํ•œ ์ด๋ฉ”์ผ์— ๋“ค์–ด ์žˆ๋Š” Patch๋ฅผ ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹๋‹ค. ๋ฉ”์ผ ์†์—๋Š” ์ปค๋ฐ‹์˜ ๋ชจ๋“  ๋‚ด์šฉ์ด ํฌํ•จ๋œ๋‹ค. ๋ฉ”์ผ์— ํฌํ•จ๋œ Patch๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ ์ ˆ์—์„œ ์‚ดํŽด๋ณธ๋‹ค.

$ git format-patch -M origin/master
0001-add-limit-to-log-function.patch
0002-changed-log-output-to-30-from-25.patch

format-patch ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์ƒ์„ฑํ•œ ํŒŒ์ผ ์ด๋ฆ„์„ ๋ณด์—ฌ์ค€๋‹ค. -M ์˜ต์…˜์€ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๋ผ๋Š” ์˜ต์…˜์ด๋‹ค. ๊ฐ ํŒŒ์ผ์˜ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

$ cat 0001-add-limit-to-log-function.patch
From 330090432754092d704da8e76ca5c05c198e71a8 Mon Sep 17 00:00:00 2001
From: Jessica Smith <jessica@example.com>
Date: Sun, 6 Apr 2008 10:17:23 -0700
Subject: [PATCH 1/2] add limit to log function

Limit log functionality to the first 20

---
 lib/simplegit.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index 76f47bc..f9815f1 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -14,7 +14,7 @@ class SimpleGit
   end

   def log(treeish = 'master')
-    command("git log #{treeish}")
+    command("git log -n 20 #{treeish}")
   end

   def ls_tree(treeish = 'master')
--
2.1.0

๋ฉ”์ผ๋ง๋ฆฌ์ŠคํŠธ์— ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ๊ฐ Patch ํŒŒ์ผ์„ ์†์œผ๋กœ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค. --- ๋ผ์ธ๊ณผ Patch๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๋ผ์ธ(diff --git ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ผ์ธ) ์‚ฌ์ด์— ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋Š” ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜์ค‘์— Patch์— ์ ์šฉ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

ํŠน์ • ๋ฉ”์ผ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ๋ช…๋ น์–ด๋กœ ๋ฉ”์ผ๋ง๋ฆฌ์ŠคํŠธ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋ถ™์—ฌ ๋„ฃ๊ธฐ๋กœ ์œ„์˜ ๋‚ด์šฉ์ด ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š” ๋ฉ”์ผ ํ”„๋กœ๊ทธ๋žจ๋„ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ณต๋ฐฑ์ด๋‚˜ ๋ผ์ธ ๋ฐ”๊ฟˆ ๋ฌธ์ž ๋“ฑ์„ ๋„ฃ์–ด ์ฃผ๋Š” ๋ฉ”์ผ ํ”„๋กœ๊ทธ๋žจ์€ ์›๋ณธ ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ๋‹คํ–‰ํžˆ Git์—๋Š” Patch ๋ฉ”์ผ์„ ๊ทธ๋Œ€๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๊ฐ€ ์žˆ๋‹ค. IMAP ํ”„๋กœํ† ์ฝœ๋กœ ๋ณด๋‚ธ๋‹ค. ์ €์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Gmail์„ ์‚ฌ์šฉํ•˜์—ฌ Patch ๋ฉ”์ผ์„ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์ž. ์ถ”๊ฐ€๋กœ Git ํ”„๋กœ์ ํŠธ์˜ Documentation/SubmittingPatches ๋ฌธ์„œ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์–‘ํ•œ ๋ฉ”์ผ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

๋ฉ”์ผ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋จผ์ € ~/.gitconfig ํŒŒ์ผ์—์„œ ์ด๋ฉ”์ผ ๋ถ€๋ถ„ ์„ค์ •ํ•œ๋‹ค. git config ๋ช…๋ น์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์ง์ ‘ ํŒŒ์ผ์„ ์—ด์–ด์„œ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ฌดํŠผ, ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •์„ ํ•œ๋‹ค.

[imap]
  folder = "[Gmail]/Drafts"
  host = imaps://imap.gmail.com
  user = user@gmail.com
  pass = YX]8g76G_2^sFbd
  port = 993
  sslverify = false

IMAP ์„œ๋ฒ„๊ฐ€ SSL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋งˆ์ง€๋ง‰ ๋‘ ๋ผ์ธ์€ ํ•„์š” ์—†๊ณ  host์—์„œ imaps:// ๋Œ€์‹  imap:// ๋กœ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด git imap-send ๋ช…๋ น์œผ๋กœ Patch ํŒŒ์ผ์„ IMAP ์„œ๋ฒ„์˜ Draft ํด๋”์— ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

$ cat *.patch |git imap-send
Resolving imap.gmail.com... ok
Connecting to [74.125.142.109]:993... ok
Logging in...
sending 2 messages
100% (2/2) done

์ดํ›„ Gmail์˜ Draft ํด๋”๋กœ ๊ฐ€์„œ To ๋ถ€๋ถ„์„ ๋ฉ”์ผ๋ง๋ฆฌ์ŠคํŠธ์˜ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  CC ๋ถ€๋ถ„์— ํ•ด๋‹น ๋ฉ”์ผ์„ ์ฐธ๊ณ ํ•ด์•ผ ํ•˜๋Š” ๊ด€๋ฆฌ์ž๋‚˜ ๊ฐœ๋ฐœ์ž์˜ ๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ ๊ณ  ์‹ค์ œ๋กœ ์ „์†กํ•œ๋‹ค.

SMTP ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•ด์„œ Patch๋ฅผ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ๋‹ค. ๋จผ์ € SMTP ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. git config ๋ช…๋ น์œผ๋กœ ํ•˜๋‚˜์”ฉ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์ด ~/.gitconfig ํŒŒ์ผ์˜ sendemail ์„น์…˜์„ ์†์œผ๋กœ ์ง์ ‘ ๊ณ ์ณ๋„ ๋œ๋‹ค.

[sendemail]
  smtpencryption = tls
  smtpserver = smtp.gmail.com
  smtpuser = user@gmail.com
  smtpserverport = 587

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด git send-email ๋ช…๋ น์œผ๋กœ ํŒจ์น˜๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

$ git send-email *.patch
0001-added-limit-to-log-function.patch
0002-changed-log-output-to-30-from-25.patch
Who should the emails appear to be from? [Jessica Smith <jessica@example.com>]
Emails will be sent from: Jessica Smith <jessica@example.com>
Who should the emails be sent to? jessica@example.com
Message-ID to be used as In-Reply-To for the first email? y

๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์„œ๋ฒ„๋กœ Patch๋ฅผ ๋ณด๋‚ด๋Š” ๋‚ด์šฉ์ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚œ๋‹ค.

(mbox) Adding cc: Jessica Smith <jessica@example.com> from
  \line 'From: Jessica Smith <jessica@example.com>'
OK. Log says:
Sendmail: /usr/sbin/sendmail -i jessica@example.com
From: Jessica Smith <jessica@example.com>
To: jessica@example.com
Subject: [PATCH 1/2] added limit to log function
Date: Sat, 30 May 2009 13:29:15 -0700
Message-Id: <1243715356-61726-1-git-send-email-jessica@example.com>
X-Mailer: git-send-email 1.6.2.rc1.20.g8c5b.dirty
In-Reply-To: <y>
References: <y>

Result: OK

์š”์•ฝ

์ด๋ฒˆ ์ ˆ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์›Œํฌํ”Œ๋กœ์— ๋”ฐ๋ผ Git์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ณ  ๊ทธ์— ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์„ ์„ค๋ช…ํ–ˆ๋‹ค. ๋‹ค์Œ ์ ˆ์—์„œ๋Š” ๋™์ „์˜ ๋’ท๋ฉด์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์šด์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ์‚ดํŽด๋ณธ๋‹ค. ์ฆ‰ ์นœ์ ˆํ•œ Dictator๋‚˜ Integration-Manager๊ฐ€ ๋˜์–ด ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.