[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 ๋ธ๋์น๋ฅผ ์ญ์ ํฉ๋๋ค.