본문 바로가기

[Git] 깃(Git) 병합(Merge)

Git
·
2020. 4. 20. 19:41
반응형

병합(Merge)

merge
병합은 브랜치를 하나로 합치는 것입니다.
현재 브랜치에 다른 브랜치를 병합할 수 있습니다.
공동 작업을 할 경우에는 브랜치를 하나로 합쳐야 하는 경우가 발생하는데 그때 병합을 하면 됩니다.

병합(Merge) 종류

Fast-forward 병합

Fast-forward는 ‘빨리감기’라는 뜻입니다. Fast-forward 병합은 현재 브랜치에서 대상 브랜치를 병합할 때 대상 브랜치의 커밋이 현재 브랜치보다 앞서 있는 경우 현재 브랜치의 HEAD 포인터를 대상 브랜치로 이동(빨리감기)하는 것입니다.

예를 들어 다음과 같은 브랜치가 있다고 가정하겠습니다.
병합1

새로운 브랜치 issue를 생성합니다.
병합2

issue 브랜치에서 코드 변경 후 커밋을 합니다.
병합3

master 브랜치로 돌아와서 issue 브랜치와 병합합니다.
병합4

병합할 경우 master 브랜치(현재 브랜치)의 커밋 이력은 issue 브랜치(대상 브랜치)의 커밋 이력과 동일하고 issue 브랜치의 커밋이 앞선 상황이기 때문에 master 브랜치의 포인터만 이동시켜주는 Fast-forward 병합이 일어납니다.

병합이 완료되면 Fast-forward 병합이 일어났다는 메시지가 출력되고, 로그를 출력하면 master 브랜치와 issue 브랜치는 같은 HEAD를 가리킵니다.(HEAD -> master, issue).

master 브랜치와 issue 브랜치는 동일한 브랜치이기 때문에 issue 브랜치를 삭제해도 무방합니다.

3-way 병합

3-way 병합은 두 브랜치의 공통 조상을 찾아서 새로운 커밋을 만드는 것입니다.

예를 들어 다음과 같은 브랜치가 있다고 가정하겠습니다.
3-way 병합1

master 브랜치에서 코드 변경 후 커밋을 합니다.
3-way 병합2

issue 브랜치에서 코드 변경 후 커밋을 합니다. (병합 충돌이 일어나지 않게 코드 변경을 하였습니다.)
3-way 병합3

master 브랜치로 돌아와서 issue 브랜치와 병합합니다.
3-way 병합4

git merge issue를 입력하고 나면 커밋 메시지 작성 창이 뜨는데 커밋 메시지 입력 후 빠져나옵니다. (기본 커밋 메세지로 커밋하고 싶은 경우 :wq를 입력 후 빠져 나오시면 됩니다.)
3-way 병합5
3-way 병합6

병합할 경우 master 브랜치와 issue 브랜치의 공통 조상인 커밋2를 찾고 커밋4커밋3을 합쳐서 새로운 커밋을 생성합니다.

병합이 완료되면 ‘recursive’ strategy라는 메시지가 출력됩니다.

병합(Merge) 충돌(Conflict)

같은 코드를 수정하고 병합할 경우 병합 충돌이 발생합니다. 병합 충돌이 일어났을 경우 깃은 어떤 코드를 선택할지 모르기 때문에 개발자가 직접 코드를 수정해 주어야 합니다.

병합 충돌이 일어나면 깃은 코드에 <<<<<<<, ======, >>>>>>>을 추가합니다.

개발자는 원하는 코드를 취사선택 한 후 코드에서 필요없는 부분을 지우고 필요한 부분을 남기면 병합 충돌이 해결 됩니다.

병합 충돌을 해결한 후 커밋을 하면 병합이 완료됩니다.

예를 들어 다음과 같은 브랜치가 있다고 가정하겠습니다.
병합 충돌1

master 브랜치의 index.html은 다음과 같습니다.

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Hello World</h1>
<p>p 추가</p>
<div>div 추가</div>
</body>
</html>

test 브랜치의 index.html은 다음과 같습니다.

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Hello World</h1>
<p>p 추가</p>
<span>span 추가</span>
</body>
</html>

master 브랜치에서 test 브랜치와 병합합니다.
병합 충돌2

병합을 하면 ‘Merge conflict’, ‘Automatic merge failed’ 메시지가 출력되고, 병합중인 상태가 됩니다.

병합 충돌이 발생한 코드를 편집기로 엽니다. (Visual Studio Code를 활용하면 병합 내용을 쉽게 확인 할 수 있고, 쉽게 취사 선택 할 수 있습니다.)
병합 충돌3

병합 충돌을 해결하기 위해 원하는 코드만 남기고 나머지는 지워줍니다.
병합 충돌4

코드를 수정한 후 커밋을 하면 병합이 완료됩니다.
병합 충돌5

병합(Merge) 명령어

병합

$ git merge <branchname>
  • <branchname>: 병합할 브랜치 이름(대상 브랜치)
$ git merge –-squash <branchname>
  • <branchname>: 병합할 브랜치 이름(대상 브랜치)
  • --squash: 대상 브랜치에서 작업했던 이력을 하나의 이력으로 압축
$ git merge –-no-ff <branchname>
  • <branchname>: 병합할 브랜치 이름(대상 브랜치)
  • --no-ff: fast-forward 병합을 하지 않고 새로운 커밋을 만듦
$ git cherry-pick <commit>

다른 브랜치의 커밋을 현재 브랜지에 병합

  • <commit>: 병합할 커밋 id

병합 취소

$ git merge --abort
  • --abort: 병합 중일 경우 병합 취소
반응형
블로그 이미지
Frontend Engineer

댓글