Git branch + merge 사용하기 예제
24 Jan 2017 | gitGit의 branch 및 merge에 대해 공부한 내용을 예제를 통해 설명하고 요약해봅니다.(With SourceTree)
잘 설명된 원본 내용은 아래 링크를 참고하세요
Git 브랜치 - 브랜치와 Merge의 기초
Branch 생성
보통 프로그램의 별도 기능을 작성하거나, Bug,Issue 등을 따로 처리할 경우 사용하게 됩니다.
예를 들어 다음과 같이 생성된 프로젝트가 있습니다.
$ git init
$ echo 'v1' > origin.txt
$ git add .
$ git commit -m 'v1'
SourceTree를 통해 그래프를 보면 master노드에 ‘v1’ 내용을 담은 origin.txt 파일이 존재합니다.
신규기능인 feature.txt 개발을 위해 branch를 생성후 파일을 만들어 commit합니다.
$ git branch feature1
$ git checkout feature1
$ echo 'f1' > feature.txt
$ git add .
$ git commit -m 'f1'
위와 같이 feature1이라는 branch가 생성되고 feature.txt가 ‘f1’내용으로 개발된 것을 볼 수 있습니다.
다시 master 노드로 돌아가 origin.txt를 ‘v2’로 변경해 봅니다.
$ git checkout master
$ echo 'v2' > origin.txt
$ git commit -a -m 'v2'
이제 좀 더 branch 가지가 분명하게 보이기 시작했습니다.
Master노드에 Merge
feature1 branch의 기능 개발이 끝났으니 master에 merge 해보도록 하겠습니다. master에 feature1 branch 내용을 가져올 예정이니 실행은 master 노드에서 해야합니다.
$ git checkout master
$ git merge feature1 -m 'merge f1'
위와 같이 master노드와 feature1 branch노드가 merge되었습니다.
Reset으로 되돌리기
이번엔 노드간 충돌예제를 만들어 보기 위해 merge전으로 다시 돌아가 보겠습니다.
reset 명령을 사용합니다. reset관련 정보는 아래 링크를 참고하세요
Git 도구 - Reset 명확히 알고 가기
$ git reflog
8ee26d8 HEAD@{0}: merge feature1: Merge made by the 'recursive' strategy.
9e75da8 HEAD@{1}: commit: v2
23fa160 HEAD@{2}: checkout: moving from feature1 to master
73aa9b3 HEAD@{3}: commit: f1
23fa160 HEAD@{4}: checkout: moving from master to feature1
23fa160 HEAD@{5}: checkout: moving from feature1 to master
23fa160 HEAD@{6}: checkout: moving from master to feature1
23fa160 HEAD@{7}: commit (initial): v1
git reflog
명령을 통해 히스토리를 확인할 수 있습니다. ‘v2’를 commit한 ‘HEAD@{2}’ 시점으로 돌아가 보겠습니다.
$ git reset --hard HEAD@{2}
reset의 옵션은 아래와 같습니다.
옵션 | 설명 |
---|---|
–soft | Repository이력만 되돌립니다. |
[–mixed] | Stage영역까지만 되돌립니다. |
–hard | Working Directory까지 되돌립니다. |
위와 같이 hard옵션으로 되돌리고 SourceTree를 확인해보면 다시 merge전으로 돌아온 것을 확인할 수 있습니다.
Merge 충돌 해결하기
master노드와 feature1 branch노드간의 충돌을 만들기 위해 origin.txt파일을 수정해보겠습니다.
$ git checkout feature1
$ echo 'v2-f1' > origin.txt
$ git commit -a -m 'conflict origin.txt'
master노드와 feature1 branch노드의 origin.txt파일이 각각 달라졌습니다. 이제 merge를 합니다.
$ git checkout master
$ git merge feature1 -m 'conflict merge'
Auto-merging origin.txt
CONFLICT (content): Merge conflict in origin.txt
Automatic merge failed; fix conflicts and then commit the result.
origin.txt파일의 내용을 merging하다가 충돌이 나있는 상태입니다.
충돌난 내용은 위와 같이 구분하여 표시되고 위 내용을 알맞는 값으로 변경한 후 다시 commit하면 merge가 완료됩니다.
$ git add .
$ git commit -m 'finished merge'
Comments