ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Git-Merge/Confilct
    Git 2021. 6. 23. 23:58

    병합

    브랜치를 생성하는 목적은 원본 코드에 영향을 주지 않고 분리하여 개발하기 위해서입니다. 독립된 브랜치에서 개발 작업이 끝나면 다시 원본 브랜치에 작업한 결과를 반영해야 합니다. 분리된 브랜치를 한 브랜치로 합치는 작업을 병합(합치기)이라고 합니다. 두 코드를 하나씩 직접 비교해가며 수동으로 병합하거나 깃 같은 도구를 사용하여 자동으로 병합할 수 있습니다. 

     

    깃으로 자동 병합

    깃의 자동 병합은 원본을 기준으로 두 파일의 변경 이력을 비교한다. 변경된 파일 내용이 발견되면 자동으로 수정된 코드 내용을 병합한다.

    깃의 병합은 브랜치를 기준으로 한다. 브랜치는 같은 저장소 내에서 서로 독립적으로 작업을 분리한 영역이다. 분리된 각각의 브랜치에서 수정된 사항을 하나의 브랜치로 병합한다. 병합하고자 하는 브랜치는 같은 로컬 저장소에 있어야 한다.

    과거에는 모든 병합을 수동으로 해 어려움이 많았지만, 이제는 이러한 수동 병합 작업을 깃이 대신처리한다. 하지만 깃이 모든 코드의 병합을 완벽하게 처리할 수는 없다. 아무리 좋은 도구라고 해도 자동으로 반영하지 못하는 것들이 있다. 이를 충돌이라고 한다.

    깃은 병합을 위해 두 가지 기본적인 알고리즘 방식을 제공한다. 깃에서 충돌 없이 병합하려면 이 두 가지 병합 방식의 차이를 알아야 한다.

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

     

    Fast-Forward 병합

    깃의 가장 간단한 브랜치 병합은 Fast-Forward 방식이다. 영어 표현을 풀어 쓰면 빨리 감기라고 할 수 있다. 일반적으로 Fast-Forward 병합 방식은 혼자 개발할 때 사용한다.

    혼자 개발할 때는 브랜치가 생성된 커밋에 따라 순차적으로 분기된다. 또 코드 수정도 순차적으로 할 때가 많다. 즉, 브랜치가 분기되지만 전체 커밋 그림으로 보면 모든 변경 사항은 순차적으로 진행된다. 이러한 순차적 커밋에 맞추어 병합을 처리하는 방법이 Fast-Forward 병합이다.

    병합 위치

    깃의  merge 명령어는 브랜치를 병합한다. merge 명령어는 현재 브랜치를 기준으로 다른 브랜치의 모든 커밋을 변경한다. 브랜치를 병합하려면 기준과 대상이 있어야 하는데 기준은 체크아웃된 현재 브랜치이다. 따라서 병합하려면 먼저 기준이 되는 브랜치로 이동해야 한다. 병합을 하려면 먼저 master 브랜치로 체크아웃을 해야 한다.

     

    3-way 병합

    3-way 병합은 좀 더 복잡한 병합을 처리할 수 있는 방식이다. 여러 개발자와 협업으로 작업하는 경우 대부분 3-way 병합을 사용한다.

    병합은 각 브랜치에서 독립적으로 작업된 소스를 파일 하나로 결합한다. 하지만 브랜치별로 각각 작업한 내용을 병합하는 과정을 힘들고 어렵다. 하지만 깃을 이용하면 편리하게 가능하다.

    3-way 병합은 두 브랜치에서 공통 조상 커밋을 자동으로 찾아 주며, 공통 조상 커밋을 기준으로 브랜치를 병합한다. 그리고 병합을 성공적으로 완료한 후에는 새로운 커밋을 추가로 하나 생성한다. 새로 생성된 커밋을 병합 커밋이라고 한다. 병합 커밋은 부모 커밋이 2개라는 특징이 있다.

    3-way 방식은 Fast-Forward 병합과 달리 병합 메시지가 필요하다. 깃은 두 브랜치를 병합한 후에 새로운 커밋을 하면서 동시에 메시지를 자동 생성한다.

    'Git' 카테고리의 다른 글

    Git Branch-2  (0) 2021.06.15
    Git Branch  (0) 2021.06.14
    Git - .gitigonre  (0) 2021.06.10
    Git 과 GitHub  (0) 2021.06.07
Designed by Tistory.