본문 바로가기
Git using(깃 사용하기)

깃(git) 병합 - merge (Fast-Forward / 3-way)

by 코딩하는 동현😎 2022. 4. 20.

병합

브랜치를 생성하는 목적은 원본 코드에 영향을 주지 않고 분리해서 개발하기 위한 것입니다.

독립된 브랜치에서 개발 작업이 끝나면 다시 원본 브랜치에 작업한 결과를 반영해야합니다.

두 코드를 하나씩 직접 비교해가며 수동 병합을 할 수도 있고, 깃의 도구를 이용해서 병합할 수 있습니다.

 

요약

git checkout 병합하는_브랜치 : 기준이 되는 브랜치로 먼저 이동

git merge 병합당하는_브랜치 : 자동 병합

 

git branch --merged: 브랜치 목록, 병합한 브랜치는 (*)로 표시

git branch --no-merged :병합하지 않은 브랜치 조회


하나씩 직접 비교하는 수동 병합

수동으로 병합하려면 양쪽 파일을 일일이 비교하여 바뀐 점을 찾아서 적용해야합니다.

소스코드가 여러개면 A를 복제해서 B를 수정하고, B를 복제해서 C도 수정한다음에 병합합니다.


깃으로 자동 병합

깃의 자동 병합은 원본을 기준으로 두 파일의 변경 이력을 비교합니다.

변경된 파일 내용이 발견되면 자동으로 수정된 코드 내용을 병합합니다.

깃이 자동으로 완벽하게 처리 할 순 없으므로 충돌을 처리해야 합니다.

깃에는 총 두가지 알고리즘이 있습니다.

  • Fast-Forward 병합
  • 3-way 병합

명령어는 똑같습니다.

git checkout 병합하는_브랜치 : 기준이 되는 브랜치로 먼저 이동

git merge 병합당하는_브랜치 : 자동 병합

 


Fast-Forward 병합

주로 혼자 개발할때 사용하는 아주 단순한 알고리즘 입니다.

아래 그림 보시면 브랜치가 분기되어있지만, 전체 커밋 그림으로 보면 순차적으로 일직선으로 커밋이 연결돼있습니다.

아래 그림의 상황에서만 적용되는 알고리즘입니다.

 

기준 브랜치 : master  , 병합당하는 브랜치: feature 로 하면

feature의 내용과 모든 커밋이 master로 이동되겠죠?

git checkout master : 기준이 되는 브랜치로 먼저 이동

git merge feature : git merge 병합당하는_브랜치

 

이렇게 feature는 사라지게 되고 마스터에 내용이 다 반영이 됩니다.

 


3-way 병합

위에 Fast-Forward 상황은 드물겠죠?

보통 이렇게 브랜치가 서로 분기되어서 각자 다른 방향으로 갈라질것입니다.

 

이렇게 좀 더 복잡하고 일반적인 병합을 처리할때 쓰이는 알고리즘이고, 실제로 이 알고리즘이 거의 쓰일 것입니다.


두 브랜치를 병합하려면 먼저 분활 기준인 공통 커밋을 찾아야합니다 (깃이 자동으로 찾아줍니다)

  1. 공통 조상 커밋
  2. 부모 커밋 A
  3. 부모 커밋 B

공통 조상 커밋을 기준으로 두 부모 브랜치의 커밋 내용을 반영해서 새로운 병합 커밋을 만듭니다.


병합 충돌

실제 개발 환경에서는 여러 사람이 같은 위치의 코드를 수정하기 때문에 깃의 자동병합으론 해결못하는 충돌이 자주 일어납니다.

파일의 다른 위치를 수정했다면 깃에서 서로 다른 위치의 소스를 자동으로 병합하기 때문에 문제 없습니다.

그러나 파일에서 동일한 위치를 수정하면 어느것이 맞는지 깃에서 자동으로 알 수 없기 때문에 충돌이 발생합니다.

footer 브랜치
master 브랜치

두 브랜치를 병합할때 다른 부분은 병합이 되도, footer의 by부분은 충돌이 일어나겠죠?

git checkout master : 기준이 되는 브랜치로 먼저 이동

git merge feature : 병합당하는_브랜치

명령어를 입력하면 master 브랜치의 코드가 아래처럼 수정됩니다.

HEAD가 현재 브랜치이고, 둘다 수락하거나 둘중하나를 수락하면 자동으로 충돌이 해결됩니다.

 

선택하고 add  , commit 하면 병합이 완료됩니다.


수동으로 충돌 해결

직접 코드를 수정하고 add, commit 하면 끝입니다.

당연히 <<<<<<<< HEAD , >>>>>>>>>footer 같은 충돌기호는 다 지워야합니다.


충돌 예방 방법

  • 내부적으로 팀원 간 규칙을 정하고 상의하면서 개발을 진행하면 항후 발생할 충돌을 줄입니다.
  • 자주 커밋하고 자주 병합할 수록 충돌이 발생할 기회는 적습니다.
  • 자신의 브랜치 상태가 최신일수록 병합할 때 발생하는 충돌을 최소화 할수 있습니다
  • 기준이 되는 브랜치(예를 들어 master)를 자주 모니터링하고, 변화된 부분을 즉시 자신의 브랜치에 반영하면서 작업하면 충돌을 줄일 수 있습니다.

브랜치 병합 여부 확인

병합한 브랜치는 (*)로 표시됩니다.

 

git branch --no-merged :병합하지 않은 브랜치 조회

반응형

댓글