Search

9) Branch-merge

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

[1] Branch Merge

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

(1) git merge

โ€ข
๋ถ„๊ธฐ๋œ ๋ธŒ๋žœ์น˜๋“ค์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ๋ช…๋ น์–ด
โ€ข
git merge <ํ•ฉ์น  ๋ธŒ๋žœ์น˜ ์ด๋ฆ„>์˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Mergeํ•˜๊ธฐ ์ „์— ์ผ๋‹จ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ฉ์น˜๋ ค๊ณ  ํ•˜๋Š”, ์ฆ‰ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ switch ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
# 1. ํ˜„์žฌ branch1๊ณผ branch2๊ฐ€ ์žˆ๊ณ , HEAD๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์€ branch1 ์ž…๋‹ˆ๋‹ค. $ git branch * branch1 branch2 # 2. branch2๋ฅผ branch1์— ํ•ฉ์น˜๋ ค๋ฉด? $ git merge branch2 # 3. branch1์„ branch2์— ํ•ฉ์น˜๋ ค๋ฉด? $ git switch branch2 $ git merge branch1
Bash
๋ณต์‚ฌ

(2) Merge์˜ ์„ธ ์ข…๋ฅ˜

1.
Fast-Forward
โ€ข
๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•  ๋•Œ ๋งˆ์น˜ ๋นจ๋ฆฌ๊ฐ๊ธฐ์ฒ˜๋Ÿผ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹์„ ์•ž์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ
a.
ํ˜„์žฌ master๋Š” C2 ์ปค๋ฐ‹์„, hotfix๋Š” C4 ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
b.
master์— hotfix๋ฅผ ๋ณ‘ํ•ฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
$ git switch master $ git merge hotfix Updating s1d5f1s..1325sd4 Fast-forward index.html | 2 ++ 1 file changed, 2 insertions(+)
Bash
๋ณต์‚ฌ
c.
hotfix๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” C4๋Š” C2์— ๊ธฐ๋ฐ˜ํ•œ ์ปค๋ฐ‹์ด๋ฏ€๋กœ, master๊ฐ€ C4์— ์ด๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๋”ฐ๋กœ merge ๊ณผ์ • ์—†์ด ๋ธŒ๋žœ์น˜์˜ ํฌ์ธํ„ฐ๊ฐ€ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ Fast-Forward๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
d.
๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋œ hotfix๋Š” ๋” ์ด์ƒ ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
$ git branch -d hotfix Deleted branch hotfix (1325sd4).
Bash
๋ณต์‚ฌ
2.
3-Way Merge
โ€ข
๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•  ๋•Œ ๊ฐ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ๋‘๊ฐœ์™€ ๊ณตํ†ต ์กฐ์ƒ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ
โ€ข
๋‘ ๋ธŒ๋žœ์น˜์—์„œ ๋‹ค๋ฅธ ํŒŒ์ผ ํ˜น์€ ๊ฐ™์€ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
a.
ํ˜„์žฌ master๋Š” C4 ์ปค๋ฐ‹์„, iss53์€ C5 ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
master์™€ iss53์˜ ๊ณตํ†ต ์กฐ์ƒ์€ C2 ์ปค๋ฐ‹์ž…๋‹ˆ๋‹ค.
b.
์ด ์ƒํ™ฉ์—์„œ master์— iss53์„ ๋ณ‘ํ•ฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
$ git switch master Switched to branch 'master' $ git merge iss53 Merge made by the 'ort' strategy. index.html | 1 + 1 file changed, 1 insertion(+)
Bash
๋ณต์‚ฌ
c.
master์™€ iss53์€ ๊ฐˆ๋ž˜๊ฐ€ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Fast-Forward๋กœ ํ•ฉ์ณ์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ณตํ†ต ์กฐ์ƒ์ธ C2์™€ ๊ฐ์ž๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹์ธ C4, C5๋ฅผ ๋น„๊ตํ•˜์—ฌ 3-way merge๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
d.
์ด๋•Œ ์ƒ๊ธด C6๋Š” master์™€ iss53์ด ๋ณ‘ํ•ฉ๋˜๋ฉด์„œ ๋ฐœ์ƒํ•œ Merge Commit์ž…๋‹ˆ๋‹ค.
e.
๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋œ iss53์€ ๋” ์ด์ƒ ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
$ git branch -d iss53 Deleted branch iss53 (58sdf23).
Bash
๋ณต์‚ฌ
3.
Merge Conflict
โ€ข
๋ณ‘ํ•ฉํ•˜๋Š” ๋‘ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐ™์€ ํŒŒ์ผ์˜ ๊ฐ™์€ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ, Git์ด ์–ด๋Š ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜์ง€ ๋ชปํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ถฉ๋Œ(Conflict) ํ˜„์ƒ
โ€ข
๊ฒฐ๊ตญ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋‚ด์šฉ์„ ์„ ํƒํ•ด์„œ Conflict๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
a.
ํ˜„์žฌ master๋Š” C4 ์ปค๋ฐ‹์„, iss53์€ C5 ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
master์™€ iss53์˜ ๊ณตํ†ต ์กฐ์ƒ์€ C2 ์ปค๋ฐ‹์ž…๋‹ˆ๋‹ค. (3-way merge์—์„œ ์ƒํ™ฉ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค)
b.
3-way merge์™€๋Š” ๋‹ฌ๋ฆฌ, ๋งŒ์•ฝ master์™€ iss53์ด ๊ฐ™์€ ํŒŒ์ผ์˜ ๊ฐ™์€ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๊ณ  ๋ณ‘ํ•ฉํ•œ๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ์š”?
$ git merge iss53 Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.
Bash
๋ณต์‚ฌ
c.
์ถฉ๋Œ์ด ์ผ์–ด๋‚œ ํŒŒ์ผ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด 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")
Bash
๋ณต์‚ฌ
d.
index.html์„ ์—ด์–ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ถฉ๋Œ ๋‚ด์—ญ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.
<<<<<<< HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> iss53:index.html
HTML
๋ณต์‚ฌ
e.
======= ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„๋Š” master์˜ ๋‚ด์šฉ, ์•„๋ž˜๋Š” iss53์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
์ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋‘˜ ๋‹ค ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์•„์˜ˆ ์ƒˆ๋กญ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
<div id="footer"> please contact us at email.support@github.com </div>
HTML
๋ณต์‚ฌ
f.
์ดํ›„ git add์™€ git commit์„ ํ†ตํ•ด ๋ณ‘ํ•ฉํ•œ ๋‚ด์šฉ์„ ์ปค๋ฐ‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$ git add . $ git commit
Bash
๋ณต์‚ฌ
g.
Vim ํŽธ์ง‘๊ธฐ๋ฅผ ์ด์šฉํ•ด์„œ ์ปค๋ฐ‹ ๋‚ด์—ญ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # All conflicts fixed but you are still merging. # # Changes to be committed: # modified: index.html #
Bash
๋ณต์‚ฌ
h.
Vim ํŽธ์ง‘๊ธฐ๋ฅผ ํ†ตํ•ด ์ž‘์„ฑํ•œ ์ปค๋ฐ‹์ด ์ด์ œ C6 ์ปค๋ฐ‹์ด ๋ฉ๋‹ˆ๋‹ค.
i.
๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋œ iss53์€ ๋” ์ด์ƒ ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
$ git branch -d iss53 Deleted branch iss53 (58sdf23).
Bash
๋ณต์‚ฌ

[2] Branch-merge Scenario

์ง€๊ธˆ๊นŒ์ง€ ํ•™์Šตํ–ˆ๋˜ git merge์™€ ์„ธ ๊ฐ€์ง€ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

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

$ mkdir git_merge $ cd git_merge $ git init $ touch test.txt # test.txt ์— master test 1 ์„ ์ž…๋ ฅ ํ›„ ์ €์žฅ $ git add . $ git commit -m "master test 1"
Bash
๋ณต์‚ฌ

(2) Fast-Forward

login ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒ์„ฑ๋œ ์ดํ›„ master ๋ธŒ๋žœ์น˜์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†๋Š” ์ƒํ™ฉ ์ฆ‰, master ๋ธŒ๋žœ์น˜์—์„œ login ๋ธŒ๋žœ์น˜๋ฅผ merge ํ•  ๋•Œ login ๋ธŒ๋žœ์น˜๊ฐ€ master ๋ธŒ๋žœ์น˜ ์ดํ›„์˜ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์œผ๋ฉด ๊ทธ์ € master ๋ธŒ๋žœ์น˜๊ฐ€ login ๋ธŒ๋žœ์น˜์™€ ๋™์ผํ•œ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ด๋™ ์‹œํ‚ฌ ๋ฟ์ž…๋‹ˆ๋‹ค.
1.
login ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ๋ฐ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
$ git switch -c login
Bash
๋ณต์‚ฌ
2.
login.txt๋ฅผ ๋งŒ๋“ค๊ณ  ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
$ touch login.txt $ git add . $ git commit -m "login test 1"
Bash
๋ณต์‚ฌ
3.
master ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
$ git switch master $ git log --oneline --all --graph * df231d0 (login) login test 1 * 1e62b4c (HEAD -> master) master test 1
Bash
๋ณต์‚ฌ
4.
master์— login์„ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
$ git merge login Updating 1e62b4c..df231d0 Fast-forward login.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 login.txt
Bash
๋ณต์‚ฌ
5.
๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. (Fast-forward, ๋‹จ์ˆœํžˆ HEAD๋ฅผ ์•ž์œผ๋กœ ๋นจ๋ฆฌ๊ฐ๊ธฐ)
$ git log --oneline --all --graph * df231d0 (HEAD -> master, login) login test 1 * 1e62b4c master test 1
Bash
๋ณต์‚ฌ
6.
login ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
$ git branch -d login Deleted branch login (was df231d0). $ git log --oneline --all --graph * df231d0 (HEAD -> master) login test 1 * 1e62b4c master test 1
Bash
๋ณต์‚ฌ

(3) 3-way Merge (Merge commit)

ํ˜„์žฌ ๋ธŒ๋žœ์น˜(master)๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹์ด Merge ํ•  ๋ธŒ๋žœ์น˜์˜ ์กฐ์ƒ์ด ์•„๋‹ˆ๋ฉด, git์€ ๊ฐ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹ 2๊ฐœ์™€ ๊ณตํ†ต ์กฐ์ƒ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ 3-way Merge ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ธŒ๋žœ์น˜ ํฌ์ธํ„ฐ๋ฅผ ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ 3-way Merge ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณ„๋„์˜ ์ปค๋ฐ‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ํ•ด๋‹น ๋ธŒ๋žœ์น˜๊ฐ€ ๊ทธ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ด๋™ ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ปค๋ฐ‹์€ ๋ถ€๋ชจ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๊ณ  Merge commit ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
1.
signout ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑ ๋ฐ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
$ git switch -c signout
Bash
๋ณต์‚ฌ
2.
ํŠน์ • ์ž‘์—… ์™„๋ฃŒ ํ›„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
$ touch signout.txt $ git add . $ git commit -m "signout test 1" $ git log --oneline bcade83 (HEAD -> signout) signout test 1 df231d0 (master) login test 1 1e62b4c master test 1
Bash
๋ณต์‚ฌ
3.
master ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
$ git switch master
Bash
๋ณต์‚ฌ
4.
master์— ์ถ”๊ฐ€ ์ž‘์—… ํ›„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. (๋‹จ signout ๋ธŒ๋žœ์น˜์™€ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ƒ์„ฑ ํ˜น์€ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.)
$ touch master.txt $ git add . $ git commit -m "master test 2" $ git log --all --oneline 48bd5a6 (HEAD -> master) master test 2 bcade83 (signout) signout test 1 df231d0 login test 1 1e62b4c master test 1
Bash
๋ณต์‚ฌ
5.
master์— signout์„ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. (์ž๋™ merge commit ๋ฐœ์ƒ)
$ git merge signout Merge made by the 'ort' strategy. signout.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 signout.txt
Bash
๋ณต์‚ฌ
6.
log ํ™•์ธ
$ git log --oneline --all --graph * ac0e971 (HEAD -> master) Merge branch 'signout' |\ | * bcade83 (signout) signout test 1 * | 48bd5a6 master test 2 |/ * df231d0 login test 1 * 1e62b4c master test 1
Bash
๋ณต์‚ฌ
7.
signout ๋ธŒ๋žœ์น˜ ์‚ญ์ œ
$ git branch -d signout Deleted branch signout (was bcade83).
Bash
๋ณต์‚ฌ

(4) Merge Conflict

Merge ํ•˜๋Š” ๋‘ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐ™์€ ํŒŒ์ผ์˜ ํ•œ ๋ถ€๋ถ„์„ ๋™์‹œ์— ์ˆ˜์ •ํ•˜๊ณ  Merge ํ•˜๋ฉด Git์€ ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ž๋™์œผ๋กœ Merge ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. (๋ฐ˜๋ฉด ๋™์ผ ํŒŒ์ผ์ด๋”๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด, Conflict ์—†์ด ์ž๋™์œผ๋กœ Merge Commit ๋ฉ๋‹ˆ๋‹ค!)
1.
hotfix ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑ ๋ฐ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
$ git switch -c hotfix
Bash
๋ณต์‚ฌ
2.
ํŠน์ • ์ž‘์—… ์™„๋ฃŒ ํ›„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
# test.txt ์ˆ˜์ • master test 1 ์ด๊ฑด hotfix์—์„œ ์ž‘์„ฑํ•œ ๋ฌธ์žฅ์ž…๋‹ˆ๋‹ค.
Bash
๋ณต์‚ฌ
$ git add . $ git commit -m "hotfix test 1" $ git log --oneline --graph --all * ad045fa (HEAD -> hotfix) hotfix test 1 * ac0e971 (master) Merge branch 'signout' |\ | * bcade83 signout test 1 * | 48bd5a6 master test 2 |/ * df231d0 login test 1 * 1e62b4c master test 1
Bash
๋ณต์‚ฌ
3.
master ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
$ git switch master
Bash
๋ณต์‚ฌ
4.
ํŠน์ • ์ž‘์—…(hotfix ์™€ ๋™์ผ ํŒŒ์ผ์˜ ๋™์ผ ๋ถ€๋ถ„ ์ˆ˜์ •) ์™„๋ฃŒ ํ›„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
# text.txt ์ˆ˜์ • master test 1 ์ด๊ฑด master์—์„œ ์ž‘์„ฑํ•œ ๋ฌธ์žฅ์ž…๋‹ˆ๋‹ค.
Bash
๋ณต์‚ฌ
$ git add . $ git commit -m "master test 3" $ git log --oneline --all --graph * 3170247 (HEAD -> master) master test 3 | * ad045fa (hotfix) hotfix test 1 |/ * ac0e971 Merge branch 'signout' |\ | * bcade83 signout test 1 * | 48bd5a6 master test 2 |/ * df231d0 login test 1 * 1e62b4c master test 1
Bash
๋ณต์‚ฌ
5.
master์— hotfix๋ฅผ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
$ git merge hotfix
Bash
๋ณต์‚ฌ
6.
๊ฒฐ๊ณผ โ†’ merge conflict ๋ฐœ์ƒ (๊ฐ™์€ ํŒŒ์ผ์˜ ๊ฐ™์€ ๋ฌธ์žฅ์„ ์ˆ˜์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!)
7.
์ถฉ๋Œ ํ™•์ธ ๋ฐ ํ•ด๊ฒฐ
โ€ข
Merge Conflict๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๋•Œ Git์ด ์–ด๋–ค ํŒŒ์ผ์„ Merge ํ•  ์ˆ˜ ์—†์—ˆ๋Š”์ง€ ์‚ดํŽด๋ณด๋ ค๋ฉด git status ๋ช…๋ น์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
$ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add <file>..." to mark resolution) both modified: test.txt no changes added to commit (use "git add" and/or "git commit -a")
Bash
๋ณต์‚ฌ
master test 1 <<<<<<< HEAD ์ด๊ฑด master์—์„œ ์ž‘์„ฑํ•œ ๋ฌธ์žฅ์ž…๋‹ˆ๋‹ค. ======= ์ด๊ฑด hotfix์—์„œ ์ž‘์„ฑํ•œ ๋ฌธ์žฅ์ž…๋‹ˆ๋‹ค. >>>>>>> hotfix
Plain Text
๋ณต์‚ฌ
โ€ข
======= ์œ„์ชฝ์˜ ๋‚ด์šฉ์€ HEAD ๋ฒ„์ „(merge ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ์ž‘์—…ํ•˜๋˜ master ๋ธŒ๋žœ์น˜)์˜ ๋‚ด์šฉ์ด๊ณ  ์•„๋ž˜์ชฝ์€ hotfix ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์œ„์ชฝ์ด๋‚˜ ์•„๋ž˜์ชฝ ๋‚ด์šฉ ์ค‘์—์„œ ๊ณ ๋ฅด๊ฑฐ๋‚˜ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜์—ฌ Merge ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (<<<<<<<, =======, >>>>>>> ๊ฐ€ ํฌํ•จ๋œ ํ–‰์€ ์‚ญ์ œ)
# test.txt ์ตœ์ข…๋ณธ master test 1 ์ด๊ฑด ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ ํ›„์˜ ๋ฌธ์žฅ์ž…๋‹ˆ๋‹ค.
Bash
๋ณต์‚ฌ
8.
merge commit ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
$ git add . $ git commit
Bash
๋ณต์‚ฌ
โ€ข
vim ํŽธ์ง‘๊ธฐ ๋“ฑ์žฅ
Merge branch 'hotfix' # Conflicts: # test.txt # # It looks like you may be committing a merge. # If this is not correct, please run # git update-ref -d MERGE_HEAD # and try again. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # All conflicts fixed but you are still merging. #
Bash
๋ณต์‚ฌ
โ€ข
์ž‘์„ฑ๋œ ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  esc ๋ฅผ ๋ˆ„๋ฅธํ›„ :wq ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ €์žฅ & ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
$ git commit [master 8ef1443] Merge branch 'hotfix'
Bash
๋ณต์‚ฌ
9.
log ํ™•์ธ
$ git log --oneline --all --graph * 8ef1443 (HEAD -> master) Merge branch 'hotfix' |\ | * ad045fa (hotfix) hotfix test 1 * | 3170247 master test 3 |/ * ac0e971 Merge branch 'signout' |\ | * bcade83 signout test 1 * | 48bd5a6 master test 2 |/ * df231d0 login test 1 * 1e62b4c master test 1
Bash
๋ณต์‚ฌ
10.
hotfix ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.