git merge <분기된 브랜치명>
일반적으로 많이 사용되는 병합 방식이며, 커밋 내역을 모두 남길 때에 사용된다. merge는 Fast-forward, Recursive로 두 가지의 병합 방식으로 나눌 수 있다.
$ git merge develop
Updating c77ebbe..dff05fa
Fast-forward
develop.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 develop.txt
병합하게 되면 Fast-forward 라고 나오며 병합이 완료된다. master
에서 분기되어 develop
이 나왔다면 develop
은 master
가 가지고 있는 모든 내용을 포함하고 있으므로 추가로 커밋이 이루어진다면 develop
은 master
보다 최신 버전이라고 할 수 있다. 여기서 master
에서 추가로 커밋이 이루어지지 않고 병합이 이루어진다면 develop
은 master
내용을 모두 포함하며 추가적인 내용을 담고 있으므로 그대로 master
와 분기된 시점 이후로 추가된 내용이 그대로 붙게 된다.
따로 병합할 때 커밋 메시지가 발생하지 않고 커밋 순서대로 기록된 것을 확인할 수 있다.
$ git merge develop
Merge made by the 'recursive' strategy.
develop.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 develop.txt
병합할 때 recursive 라고 나오며 병합이 완료된다. 이 경우도 마찬가지로 master
에서 develop
이 분기되어 나왔고 추가적인 기능이 develop
에서 개발되어 커밋 되었다고 보자. 여기까진 같지만 만약에 master
에서 hotfix와 같은 새로운 문제가 발생해 내용 고쳐서 커밋을 했다고 생각한다면 develop
은 master
보다 최신 버전이라고 하기에는 어렵다. 이때는 master
와 develop
이 서로 다른 내용을 가지고 있으므로 이 내용을 합친 새로운 커밋 메시지를 만들어서 병합하게 된다.
분기된 시점부터 베이스가 되는 브랜치에 커밋이 발생했기 때문에 병합할 때 새로운 커밋 메시지가 생기며 병합되는 것을 확인할 수 있다.
git merge --squash <분기된 브랜치명>
분기된 develop
브랜치에서 커밋이 이루어지고 커밋된 내용을 master
브랜치로 가져와 새로운 커밋을 만들어내고 브랜치를 없애 브랜치 커밋 명세들을 지우는 병합 방식을 말한다.
왼쪽 사진부터 보게 된다면 develop
브랜치에서 작업 내용을 모두 커밋한 상태이다. 중간 사진은 squash merge를 이용하여 develop
에 있던 수정 내용을 가져와 커밋 메시지를 생성하였고 마지막으로 오른쪽 사진은 필요가 없어진 브랜치를 삭제하는 것으로 마무리가 된 것을 확인할 수 있다.
git rebase <base 브랜치명>
git checkout <base 브랜치명>
git merge <분기된 브랜치명>
분기된 develop
브랜치에서 커밋이 이루어지고 커밋된 내용을 master
브랜치에 rebase를 통해 커밋 내용을 재배치하고 추가 커밋 메시지 없이 병합되는 것을 말한다.
왼쪽 사진은 develop
에서 커밋을 마친 직후이고 오른쪽 사진은 master
브랜치로 커밋된 내용을 재배치한 상황이다. 보게 되면 develop
에서 커밋된 내용이 재배치되면서 해시값들이 모두 변경되었고 추가 메시지 없이 병합이 이루어진 것을 확인할 수 있다.