Search

8) Branch

๊ตฌ๋ถ„
2์ผ์ฐจ

[1] Branch

Git์—์„œ Branch๋ผ๋Š” ๊ฐœ๋…์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ ๋ฒ„์ „ ๊ด€๋ฆฌ์˜ ๊ฝƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(1) Branch๋ž€?

โ€ข
Branch๋Š” ๋‚˜๋ญ‡๊ฐ€์ง€๋ผ๋Š” ๋œป์˜ ์˜์–ด ๋‹จ์–ด์ž…๋‹ˆ๋‹ค.
โ€ข
์ฆ‰ ๋ธŒ๋žœ์น˜๋ž€ ๋‚˜๋ญ‡๊ฐ€์ง€์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฐˆ๋ž˜๋กœ ์ž‘์—… ๊ณต๊ฐ„์„ ๋‚˜๋ˆ„์–ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” Git์˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
โ€ข
์žฅ์ 
1.
๋ธŒ๋žœ์น˜๋Š” ๋…๋ฆฝ ๊ณต๊ฐ„์„ ํ˜•์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ(master)์— ๋Œ€ํ•ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
2.
ํ•˜๋‚˜์˜ ์ž‘์—…์€ ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜๋กœ ๋‚˜๋ˆ„์–ด ์ง„ํ–‰๋˜๋ฏ€๋กœ ์ฒด๊ณ„์ ์ธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
3.
ํŠนํžˆ๋‚˜ Git์€ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“œ๋Š” ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋น ๋ฅด๊ณ , ์šฉ๋Ÿ‰๋„ ์ ๊ฒŒ ๋“ญ๋‹ˆ๋‹ค.
โ€ข
๊ทธ๋ž˜๋„ ๋ธŒ๋žœ์น˜ ๊ผญ ์จ์•ผํ•˜๋‚˜์š”?
1.
์ผ๋‹จ master ๋ธŒ๋žœ์น˜๋Š” ์ƒ์šฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ธ์ œ๋“  ์„ธ์ƒ์— ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
2.
๋งŒ์•ฝ ์ƒ์šฉ์— ์—๋Ÿฌ๊ฐ€ ์žˆ์–ด์„œ ๊ณ ์ณ์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?
3.
๊ณ ๊ฐ๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ํ•จ๋ถ€๋กœ ๋ฒ„์ „์„ ๋˜๋Œ๋ฆฌ๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
4.
๋”ฐ๋ผ์„œ ๋ธŒ๋žœ์น˜๋ฅผ ํ†ตํ•ด ๋ณ„๋„์˜ ์ž‘์—… ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ , ๊ทธ๊ณณ์—์„œ ๋˜๋Œ๋ฆฌ๊ฑฐ๋‚˜ ์‚ญ์ œ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
5.
๋ธŒ๋žœ์น˜๋Š” ์™„์ „ํ•˜๊ฒŒ ๋…๋ฆฝ์ด ๋˜์–ด์žˆ์–ด์„œ ์–ด๋–ค ์ž‘์—…์„ ํ•ด๋„ master์—๋Š” ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ๋ชปํ•˜์ฃ .
6.
๊ทธ๋ฆฌ๊ณ  ์ดํ›„์— ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค๋ฉด? ๊ทธ ๋‚ด์šฉ์„ master์— ๋ฐ˜์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!
7.
์ด๋Ÿฌํ•œ ์ด์œ  ๋•Œ๋ฌธ์— Git์—์„œ ๋ธŒ๋žœ์น˜๋Š” ์ •๋ง ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘์˜ ํ•˜๋‚˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(2) git branch

๋ธŒ๋žœ์น˜ ์กฐํšŒ, ์ƒ์„ฑ, ์‚ญ์ œ ๋“ฑ ๋ธŒ๋žœ์น˜์™€ ๊ด€๋ จ๋œ Git ๋ช…๋ น์–ด
# ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก ํ™•์ธ $ git branch # ์›๊ฒฉ ์ €์žฅ์†Œ์˜ ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก ํ™•์ธ $ git branch -r # ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ $ git branch <๋ธŒ๋žœ์น˜ ์ด๋ฆ„> # ํŠน์ • ์ปค๋ฐ‹ ๊ธฐ์ค€์œผ๋กœ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ $ git branch <๋ธŒ๋žœ์น˜ ์ด๋ฆ„> <์ปค๋ฐ‹ ID> # ํŠน์ • ๋ธŒ๋žœ์น˜ ์‚ญ์ œ $ git branch -d <๋ธŒ๋žœ์น˜ ์ด๋ฆ„> # ๋ณ‘ํ•ฉ๋œ ๋ธŒ๋žœ์น˜๋งŒ ์‚ญ์ œ ๊ฐ€๋Šฅ $ git branch -D <๋ธŒ๋žœ์น˜ ์ด๋ฆ„> # (์ฃผ์˜) ๊ฐ•์ œ ์‚ญ์ œ (๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์€ ๋ธŒ๋žœ์น˜๋„ ์‚ญ์ œ ๊ฐ€๋Šฅ)
Bash
๋ณต์‚ฌ

(3) git switch

ํ˜„์žฌ ๋ธŒ๋žœ์น˜์—์„œ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ HEAD๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๋ช…๋ น์–ด HEAD๋ž€ ํ˜„์žฌ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
# ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ $ git switch <๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„> # ๋ธŒ๋žœ์น˜๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์ด๋™ $ git switch -c <๋ธŒ๋žœ์น˜ ์ด๋ฆ„> # ํŠน์ • ์ปค๋ฐ‹ ๊ธฐ์ค€์œผ๋กœ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์ด๋™ $ git switch -c <๋ธŒ๋žœ์น˜ ์ด๋ฆ„> <์ปค๋ฐ‹ ID>
Bash
๋ณต์‚ฌ
git switch ํ•˜๊ธฐ ์ „์—, ํ•ด๋‹น ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ ํ•˜์…จ๋‚˜์š”? master ๋ธŒ๋žœ์น˜์™€ feature ๋ธŒ๋žœ์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. feature ๋ธŒ๋žœ์น˜์—์„œ test.txt๋ฅผ ๋งŒ๋“ค๊ณ  git commit ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ master ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด, test.txt ํŒŒ์ผ์ด ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ธŒ๋žœ์น˜๋ฅผ ์ด๋™ํ•˜๊ธฐ ์ „์—, ๊ผญ ์ปค๋ฐ‹์„ ์™„๋ฃŒํ•˜๊ณ  ์ด๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

[2] Branch scenario

git branch์™€ git switch๋ฅผ ํ†ตํ•ด ๋ธŒ๋žœ์น˜๋ฅผ ์กฐํšŒ, ์ƒ์„ฑ, ์ด๋™ํ•˜๋Š” ์‹ค์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

(1) ์‚ฌ์ „ ์„ธํŒ…

1.
ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์— git-branch-practice ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋™ ํ›„ vscode๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
$ mkdir git-branch-practice $ cd git-branch-practice $ code .
Bash
๋ณต์‚ฌ
2.
Git ์ €์žฅ์†Œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
$ git init Initialized empty Git repository in C:/Users/kyle/git-branch-practice/.git/
Bash
๋ณต์‚ฌ
3.
test.txt๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ๊ฐ master-1, master-2, master-3 ์ด๋ผ๋Š” ๋‚ด์šฉ์„ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅํ•˜์—ฌ ์ปค๋ฐ‹ 3๊ฐœ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
$ touch test.txt test.txt์— master-1 ์ž‘์„ฑ $ git add . $ git commit -m "master-1" test.txt์— master-2 ์ž‘์„ฑ $ git add . $ git commit -m "master-2" test.txt์— master-3 ์ž‘์„ฑ $ git add . $ git commit -m "master-3"
Bash
๋ณต์‚ฌ
4.
git log --oneline์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์™€์•ผ ์ •์ƒ์ž…๋‹ˆ๋‹ค.
์ด 3๊ฐœ์˜ ๋ฒ„์ „์ด master ๋ธŒ๋žœ์น˜์— ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
$ git log --oneline 0604dcd (HEAD -> master) master-3 9c22c89 master-2 3d71510 master-1
Bash
๋ณต์‚ฌ
5.
ํ˜„์žฌ๊นŒ์ง€ ๊ฒฐ๊ณผ

(2) ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, ์กฐํšŒ

1.
ํ˜„์žฌ ์œ„์น˜(master ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹)์—์„œ login์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
$ git branch login
Bash
๋ณต์‚ฌ
2.
login๋ธŒ๋žœ์น˜๊ฐ€ ์ž˜ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
* master์˜ ์˜๋ฏธ๋Š” ํ˜„์žฌ HEAD๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ธŒ๋žœ์น˜๋Š” master๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
$ git branch login * master
Bash
๋ณต์‚ฌ
3.
git log --oneline์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์™€์•ผ ์ •์ƒ์ž…๋‹ˆ๋‹ค.
0604dcd ์ปค๋ฐ‹ ๊ธฐ์ค€์œผ๋กœ master์™€ login๋ธŒ๋žœ์น˜๊ฐ€ ์œ„์น˜ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$ git log --oneline 0604dcd (HEAD -> master, login) master-3 9c22c89 master-2 3d71510 master-1
Bash
๋ณต์‚ฌ
4.
master ๋ธŒ๋žœ์น˜์—์„œ 1๊ฐœ์˜ ์ปค๋ฐ‹์„ ๋” ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
test.txt์— master-4 ์ž‘์„ฑ $ git add . $ git commit -m "master-4"
Bash
๋ณต์‚ฌ
5.
ํ˜„์žฌ๊นŒ์ง€ ๊ฒฐ๊ณผ

(3) ๋ธŒ๋žœ์น˜ ์ด๋™

1.
ํ˜„์žฌ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์˜ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
$ git log --oneline 5ca7701 (HEAD -> master) master-4 0604dcd (login) master-3 9c22c89 master-2 3d71510 master-1
Bash
๋ณต์‚ฌ
2.
์ด๋•Œ login๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ์š”?
$ git switch login
Bash
๋ณต์‚ฌ
master ๋ธŒ๋žœ์น˜์˜ test.txt์— ์ž‘์„ฑํ•œ master-4๊ฐ€ ์ง€์›Œ์กŒ์Šต๋‹ˆ๋‹ค!!
# login ๋ธŒ๋žœ์น˜์˜ test.txt master-1 master-2 master-3
Bash
๋ณต์‚ฌ
3.
๊ทธ๋ฆฌ๊ณ  git log --oneline์„ ์ž…๋ ฅํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
์ด์ œ HEAD๋Š” login ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , master ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
$ git log --oneline 0604dcd (HEAD -> login) master-3 9c22c89 master-2 3d71510 master-1
Bash
๋ณต์‚ฌ
4.
master ๋ธŒ๋žœ์น˜๋Š” ์‚ญ์ œ๋œ ๊ฑธ๊นŒ์š”?
์•„๋‹™๋‹ˆ๋‹ค! ๋ธŒ๋žœ์น˜๋ฅผ ์กฐํšŒ ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
HEAD๊ฐ€ login ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉด์„œ, log๋„ login ๋ธŒ๋žœ์น˜ ๊ธฐ์ค€์œผ๋กœ ๋ณด์ด๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
$ git branch * login master
Bash
๋ณต์‚ฌ
5.
git log --oneline --all์„ ์ž…๋ ฅํ•˜๋ฉด ๋ชจ๋“  ๋ธŒ๋žœ์น˜์˜ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$ git log --oneline --all 5ca7701 (master) master-4 0604dcd (HEAD -> login) master-3 9c22c89 master-2 3d71510 master-1
Bash
๋ณต์‚ฌ
6.
ํ˜„์žฌ๊นŒ์ง€ ๊ฒฐ๊ณผ
์ฆ‰ ๋ธŒ๋žœ์น˜๋ฅผ ์ด๋™ํ•œ๋‹ค๋Š”๊ฑด HEAD๊ฐ€ ํ•ด๋‹น ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ  ๋ธŒ๋žœ์น˜๋Š” ์ตœ์‹  ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ, HEAD๊ฐ€ ํ•ด๋‹น ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›Œํ‚น ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋‚ด์šฉ๋„ HEAD๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹ ์ƒํƒœ๋กœ ๋ณ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

(4) login ๋ธŒ๋žœ์น˜์—์„œ ์ปค๋ฐ‹ ์ƒ์„ฑ

1.
test.txt ํŒŒ์ผ์— login-1์ด๋ผ๊ณ  ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
# login ๋ธŒ๋žœ์น˜์˜ test.txt master-1 master-2 master-3 login-1
Bash
๋ณต์‚ฌ
2.
์ถ”๊ฐ€์ ์œผ๋กœ test_login.txt๋„ ์ƒ์„ฑํ•˜๊ณ  login-1์ด๋ผ๊ณ  ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค.
$ touch test_login.txt # ์ดํ›„ test_login.txt์— ์ž‘์„ฑ login-1
Bash
๋ณต์‚ฌ
3.
์ปค๋ฐ‹์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
$ git add . $ git commit -m "login-1"
Bash
๋ณต์‚ฌ
4.
git log --oneline --all --graph๋ฅผ ํ†ตํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
master ๋ธŒ๋žœ์น˜์™€ login ๋ธŒ๋žœ์น˜๊ฐ€ ๋‹ค๋ฅธ ๊ฐˆ๋ž˜๋กœ ๊ฐˆ๋ผ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$ git log --oneline --graph --all * 3b0a091 (HEAD -> login) login-1 | * 5ca7701 (master) master-4 |/ * 0604dcd master-3 * 9c22c89 master-2 * 3d71510 master-1
Bash
๋ณต์‚ฌ
5.
ํ˜„์žฌ๊นŒ์ง€ ๊ฒฐ๊ณผ