같은 뿌리를 가지고 있으나 서로 다른 길을 걸어가고 있는 파일들
같은 파일 이라면 알아서 Git에서 병합을 해주지만
파일 내용이 다를 경우에는 충돌(conflict)이 발생
ex) 고객사마다 다른 내용을 추가해야 할 때 사용
git branch
: 브랜치 목록 보기
git branch 브랜치이름
: 브랜치이름
의 새로운 브랜치 생성
master
: 가장 상위 브랜치
git checkout 브랜치이름
: 브랜치이름
의 브랜치로 이동
git merge 브랜치이름
: 현재 내가 있는 브랜치에서 브랜치이름
브랜치의 파일을 병합
git branch -d 브랜치이름
: 브랜치이름
을 삭제
서로 다른 브랜치를 병합 하는 것
같은 파일임에도 서로 다른 위치가 수정되었다면, 정상적으로 병합됨
같은 파일에 같은 위치를 수정했을 경우에는 문제가 발생
merge 명령을 했을 경우에 수행되는 병합 스타일은 크게 둘로 나뉜다.
master에 checkout 한 상태로 hotfix를 merge 하는 경우
master에 checkout 한 상태로 iss53을 merge하는 경우
fast-forward
: 첫번째 그림에서처럼 hotfix의 C4는 master의 C2에 기반한 커밋이기 때문에, 별도의 merge 과정 없이 그냥 최신 커밋으로 이동한다. (커밋을 생성하지 않음) 이런 방식이 바로 fast-forward
이다.3 way merge
: 두번째 그림에서처럼 iss53의 C5는 master의 C4와는 아무런 영향이 없는 커밋이기 때문에, fast-forward가 아닌 3 way merge
가 수행되게 된다. (merge commit이 생성됨)base
(branch들의 공통된 조상)와 나머지 2개의 branch를 비교하여 수정된 부분을 채택한다
즉, 2 way merge보다 훨씬 더 많은 부분을 자동화해서 병합할 수 있다
3 Way Merge
를 더 자세히 살펴보면, 위 그림과 같이 수행된다.
병합해야 할 2개의 별도의 커밋이 가지고 있는 공통된 조상 을 찾은 후, 결과를 저장할 별도의 커밋(merge commit)을 생성하여 병합을 수행한다
git merge 브랜치명
으로 명령 했을 때, 서로 같은 부분을 수정했다면 충돌이 일어나
자동으로 merge가 불가능 하다.
(이 경우에는 merge commit 또한 생성되지 않는다)
그럴 때는 git이 자동으로 해당 브랜치에 있는 파일을 아래와 같이 바꿔준다
nano 파일명
혹은 vim 파일명
으로 파일을 열어서 git이 표시해준 수정사항 내용을 보고 직접 수정해준다
수정 후에는 git add 파일명
으로 파일을 업로드 해 준 후, git commit
을 해주면,
다음과 같이 Merge 된 파일이 정상적으로 commit 된 것을 확인할 수 있다
대표적으로 p4merge
라는 툴이 있으며, 다운받아서 머지툴로 설정해주면 머지할 때 좀 더 편리하게 툴을 이용하여 할 수 있다
관련 생활코딩 영상 보기