๐Ÿ‘พ git ์™„๋ฒฝ ์ •๋ณต - git branch

2021๋…„ 5์›” 17์ผ

๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—๋Š” git์˜ ํ•ต์‹ฌ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์žฅ์ ์ธ branch์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

git์˜ branch๋Š” ๋งค์šฐ ๊ฐ€๋ฒผ์›Œ์„œ ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ git์€ branch๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ž‘์—…ํ•˜๊ณ  ๋‚˜์ค‘์— mergeํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

branch๋Š” ๋ฌด์—‡์ธ๊ฐ€?

Git์ด branch๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  git์ด ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๋Š”์ง€ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

git์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝ์‚ฌํ•ญ(diff)๋กœ ๊ธฐ๋กํ•˜์ง€ ์•Š๊ณ  ์ผ๋ จ์˜ ์Šค๋ƒ…์ƒท์œผ๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

commitํ•˜๋ฉด git์€ ํ˜„ staging area์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์Šคํƒญ์ƒท์— ๋Œ€ํ•œ pointer, author, message์™€ ๊ฐ™์€ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ, ์ด์ „ ์ปค๋ฐ‹์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ์ปค๋ฐ‹ ๊ฐœ์ฒด(commit object)๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

git commmit์œผ๋กœ ์ปค๋ฐ‹ํ•˜๋ฉด ๋จผ์ € root directory์™€ ๊ฐ ํ•˜์œ„ directory์˜ tree ๊ฐœ์ฒด๋ฅผ ์ฒดํฌ์„ฌ๊ณผ ํ•จ๊ป˜ ์ €์žฅ์†Œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

commit-object

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

commit-before

์œ„์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด ๊ฐ ์Šค๋ƒ…์ƒท์€ ์ด์ „์˜ commit์˜ ์Šค๋ƒ…์ƒท์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑํ•˜๊ธฐ

$ git branch testing

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

branch-create

๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ์ž‘์—…์ค‘์ธ ๋ธŒ๋žœ์น˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ git์€ ์–ด๋–ป๊ฒŒ ํŒŒ์•…ํ• ๊นŒ์š” ?

๋‹ค๋ฅธ ๋ฒ„์ „๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ๋Š” ๋‹ฌ๋ฆฌ git์€ HEAD๋ผ๋Š” ํŠน์ˆ˜ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํฌ์ธํ„ฐ๋Š” ์ง€๊ธˆ ์ž‘์—…ํ•˜๋Š” ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

branch-head

์ฆ‰, git branch ๋ช…๋ น์–ด๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑ๋งŒ ํ•  ๋ฟ์ด์ง€ ์ž‘์—…ํ•˜๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๋ฐ”๊พธ์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

$ git checkout testing

์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด HEAD๋Š” testing ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

checkout-head

์ปค๋ฐ‹์„ ์ƒˆ๋กœ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

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

commit-a

์ƒˆ๋กœ ์ปค๋ฐ‹ํ•ด์„œ testing ๋ธŒ๋žœ์น˜๋Š” ์•ž์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ master ๋ธŒ๋žœ์น˜๋Š” ์—ฌ์ „ํžˆ ์ด์ „ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

$ git checkout master

checkout-b

์œ„์˜ ๋ช…๋ น์–ด๋Š” master ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” commit์„ HEAD๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๊ณ  working directory์˜ ํŒŒ์ผ๋„ ๊ทธ ์‹œ์ ์œผ๋กœ ๋˜๋Œ๋ ค ๋†“์•˜์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ commit์„ ํ•˜๊ฒŒ๋˜๋ฉด ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ์ž‘์—…๋“ค๊ณผ ๋ณ„๊ฐœ๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— testing ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด add๋กœ stage์— ์˜ฌ๋ ค๋†“๊ณ  commit์„ ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค๋ฅธ ์ผ์„ ์ง„ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

branch์™€ merge์˜ ๊ธฐ์ดˆ

๋ณดํ†ต ๋ธŒ๋žœ์น˜์™€ merge๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ƒˆ branch๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. ์ƒˆ๋กœ ๋งŒ๋“  branch์—์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.

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

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

branch์˜ ๊ธฐ์ดˆ

branch-a

์ด๋ ‡๊ฒŒ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ issue-53๋ฒˆ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

๊ทธ๋Ÿผ ์ด ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๋ฉด์„œ checkout๊นŒ์ง€ ํ•จ๊ป˜ํ•˜๊ธฐ ์œ„ํ•ด์„  -b ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค!

$ git checkout -b issue_53

checkout-a

์ด๋ ‡๊ฒŒ HEAD๊นŒ์ง€ ์ƒ์„ฑ๋œ ๋ธŒ๋žœ์น˜์ธ issue-53์œผ๋กœ ์ด๋™ํ–ˆ์œผ๋ฉด ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ vim index.html
$ git add index.html
$ git commit -m '[add] issue 53'

index.html ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  commit์„ ํ•˜๋ฉดํ•ด๋‹น ๋ธŒ๋žœ์น˜๊ฐ€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค.

commit-b

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ๋ธŒ๋žœ์น˜๋ฅผ ์ด๋™ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ฃผ์˜ํ•ด์•ผํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ง ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ํŒŒ์ผ์ด checkout ํ•  ๋ธŒ๋žœ์น˜์™€ ์ถฉ๋Œ๋‚˜๋ฉด ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ๋–„๋Š” working directory๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

master ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•ด์„œ issue_53 ๋ธŒ๋žœ์น˜๋ฅผ Merge ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ git checkout master
$ git merge issue_53

merge_a

Merge ๋ฉ”์‹œ์ง€์—์„œ fast-forward๊ฐ€ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋‹จ์–ด์˜ ์˜๋ฏธ๋Š” A๋ธŒ๋žœ์น˜์—์„œ B๋ธŒ๋žœ์น˜๋กœ mergeํ•  ๋•Œ b๋ธŒ๋žœ์น˜๊ฐ€ a๋ธŒ๋žœ์น˜ ์ดํ›„์˜ commit์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์œผ๋ฉด ๊ทธ์ € A๋ธŒ๋žœ์น˜๊ฐ€ B๋ธŒ๋žœ์น˜์™€ ๋™์ผํ•œ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ด๋™์‹œํ‚จ๋‹ค๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ๋ธŒ๋žœ์น˜๊ฐ„์˜ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์…”์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด issue_53 ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…์„ ํ•˜๋˜ ์ค‘ master ๋ธŒ๋žœ์น˜์— ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒจ hotfix ๋ธŒ๋žœ์น˜๋ฅผ master์—์„œ ๋งŒ๋“ค์–ด์„œ ์ž‘์—… ํ›„ master์— merge ํ•˜๊ฒŒ ๋˜์–ด๋„ issue_53 ๋ธŒ๋žœ์น˜์—๋Š” ์˜ํ–ฅ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ๋Œ€์‹  git merge master ๋ช…๋ น์œผ๋กœ master ๋ธŒ๋žœ์น˜๋ฅผ issue_53 ๋ธŒ๋žœ์น˜์— mergeํ•˜๋ฉด issue_53 ๋ธŒ๋žœ์น˜์— hotfix๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.