Git으로 프로젝트를 관리하다 보면, 결국 두 개 이상의 브랜치를 합쳐야 하는 순간이 옵니다. 이때 선택할 수 있는 병합 방법에는 대표적으로 Fast-Forward 병합과 3-Way 병합이 있습니다.
이름만 들어도 Fast-Forward는 '빠르게 앞으로 나아간다'는 느낌이고, 3-Way는 '복잡한 절차'처럼 들립니다.
아니면, 단순히 이름 때문에 우리가 그렇게 생각하는 걸까요?
이번 글에서는 Fast-Forward와 3-Way 병합의 원리를 이해하고, 실제로 속도의 차이가 발생하는 이유를 알아보겠습니다.
또한, 상황에 따라 어떤 병합 방식이 더 적합한지 선택 기준도 함께 다뤄보겠습니다.
Fast-Forward 병합은 현재 브랜치에서 대상 브랜치까지의 경로가 직선으로 연결되어 있을 때 가능합니다.
Git은 실제로 병합을 수행하지 않고, 단순히 현재 브랜치의 포인터 이동만으로 대상 브랜치의 최신 커밋으로 이동시킵니다.
이렇게 하면 두 브랜치의 히스토리가 하나로 합쳐집니다.
Fast-Forward 병합은 단순히 포인터 레퍼런스를 업데이트하는 작업으로, 병합 시 Git이 추가로 처리해야 할 계산이 거의 없습니다. 이는 병합 과정에서의 연산 시간이 극도로 짧다는 것을 의미합니다.
3-Way 병합은 브랜치들이 서로 다른 변경 사항을 가지고 있어 Fast-Forward 병합이 불가능한 경우 즉, 두 브랜치가 서로 다른 히스토리를 가지고 있을 때 수행됩니다.
이러한 3-Way 병합은 병합 커밋을 통해 두 브랜치의 히스토리를 하나로 통합합니다.
이러한 추가 작업은 Fast-Forward 병합보다 상대적으로 더 많은 시간과 연산을 요구합니다.
GitHub의 웹 인터페이스에서는 기본적으로 Fast-Forward 병합을 지원하지 않습니다.
또한, GitHub의 'Rebase and merge' 옵션은 커밋 정보를 업데이트하고 새로운 커밋 해시를 생성하므로 실제 Fast-Forward 병합과는 차이가 있습니다.
따라서, Git에서의 병합 전략을 이해하고 상황에 맞게 적절한 방법을 선택하는 것이 중요합니다.
1. Fast-Forward 병합이 적합한 경우
2. 3-Way 병합이 적합한 경우
속도만 놓고 보면 Fast-Forward 병합이 더 빠릅니다. 포인터 이동만으로 작업이 끝나기 때문이죠!