이 세 개의 용어는 git에서 근본적으로 같은 merge 과정을 말한다. 하나의 브랜치에서 바뀐부분을 가져오고, 다른 브랜치와 합치는 것도 해당된다.
두 브랜치 사이에서 충돌이 발생할 때, Git은 three-way merge를 실행한다.
그리고 three-way merge는 브랜치의 공통의 조상과 각 브랜치의 변경 사항을 고려하여 가능한곳의 충돌을 자동으로 해결한다.
이 merge 프로세스의 결과는 두 브랜치의 변경 사항을 합치는 새로운 commit 메시지이다.
그리고 merge commit은 일반적으로 각각의 브랜치에서 하나씩 가져온 두 개의 부모 commit을 가지고 있다.
이 merge는 git merge
명령어로 실행된다.
이 용어들은 같은 개념을 의미하기 때문에 자주 상호교환적으로 사용된다.
이 프로세스에는 common ancestor(공통 조상), the source branch(소스 브랜치), the target branch(대상 브랜치) 라는 세 가지 주요 요소가 포함되므로 ‘Three-way merge’라는 용어가 사용된다.
대상 브랜치를 소스 브랜치의 끝으로 직접 업데이트할 수 있을 때 발생하는 기본 병합의 한 유형이다. 이 경우 새 merge commit이 생성되지 않는다.
소스 브랜치가 생성된 이후 대상 브랜치에 새 커밋이 없을 때 발생한다. 결과적으로 브랜치는 단순히 새 commit을 가리키게 된다.
cssCopy code
A---B---C---D (main)
\
E---F (feature-branch)
Fast-forward merge:
cssCopy code
A---B---C---D---E---F (main, feature-branch)
basic merge는 새 merge commit을 항상 생성하지만, fast-forward merge는 그렇지 않다.
cssCopy code
A---B---C (main)
\
D---E---F (feature-branch)
Rebase:
cssCopy code
A---B---C---D'---E'---F' (main, feature-branch)
Scenario를 보면 D, E, F commit들이 main 브랜치로 선형적이고 더 깨끗한 history를 만들면서 rebase된 것을 알 수 있다.
feature-branch
)가 있다고 가정해보겠다.cssCopy code
A---B---C (main)
\
D---E---F (feature-branch)
feature-branch
를 main
브랜치에 squash merge하기로 한다.cssCopy code
A---B---C---G (main)
G
commit은 feature-branch
의 모든 변경사항(D
, E
, F
)을 단 하나에 커밋에 합친다.