병합(merge)
3-ways merge
master 브랜치로부터 분기된 feature/1 브랜치가 있다고 하자. master 브랜치에서는 stuff 라는 파일이 만들어져 aad6aa6 커밋까지 진행되었고 feature/1 브랜치에서는 stuff2라는 파일을 만들어 4a21cdc 커밋이 진행되었다. stuff 파일은 수정되지 않은 상태다.
두 브랜치가 각각 커밋을 진행했고 서로 겹치게 수정한 파일은 없다고 하자. feature/1에서 진행된 사항들을 master 브랜치로 가져오고 싶다면 다음과 같이 한다.
$ git checkout master
$ git merge feature/1
이처럼 서로 다른 두 커밋을 가진 브랜치가 하나로 병합하는 과정에서 두 브랜치가 양쪽의 이력을 그대로 보존하고자 병합 커밋을 만들면서 병합되는 것을 3-ways merge라고 한다.
Fast-forward merge
feature/1 브랜치에서 두번의 커밋이 있다고 가정하자. 그리고 master 브랜치에서는 커밋이 진행되지 않았다.
즉, 한쪽에서만 변경이 일어난 것이다.
그리고 다음과 같이 feature/1 브랜치의 변경 사항들을 master 브랜치로 병합하자.
$ git checkout master
$ git merge feature/1
Updating 65c8b16..6445bb5
Fast-forward
stuff | 1 +
stuff | 1 +
2 files changed, 2 insertions(+)
위와 같이 feature/1 브랜치에서만 변경사항이 발생했고 이를 master 브랜치로 병합하자 Fast-forward merge가 발생했다. 즉, 한쪽 브랜치에서만 일어난 변경사항을 다른 브랜치로 병합하는 방식이다.
이때 --no-ff 플래그를 전달해 3-ways 병합처럼 만들 수 있다. 이는 병합하는 브랜치의 이력을 의도적으로 남기려고 사용한다.