Merge란 두개의 branch를 하나로 병합하는 것을 말한다. 여기서 말하는 병합이란 2가지의 내용을 하나로 합치는 것을 의미하며, 일반적으로 branch가 삭제되지는 않는다.
제일 자주 실행하는 merge의 방식이다. 브랜치 a에서 브랜치 b를 머지 하게 되면 새로은 머지커밋이 생기고 a브랜치가 해당 커밋을 가리키게 된다. 이때 a와 b는 동일한 브랜치(공통조상)에서 생성된 브랜치여야 한다. 3-way merge라고 이름 붙여진 이름은 3가지 브랜치가 합쳐지기 때문이다. 1. 기준이 되는 브랜치 2. 병합을 하려고 하는 브랜치 3. 병합이 될 브랜치 총 3개의 브랜치가 합쳐지는데, 이 경우 브랜치들이 전부 다른 모습(커밋)을 가지고 있다.
/* in master branch */
git merge feature15


이미지에서 master 브랜치는 '병합의 바탕이 되는 브랜치', feature 15 브랜치는 '병합될 브랜치' 라고 적었지만 두 브랜치 모두 '병합될 브랜치' 이다. 다만 git merge 명령어를 master 브랜치에서 실행했기 때문에 머지 후 만들어지는 커밋을 master 브랜치가 가리킬것이다. 따라서 master 브랜치를 '병합의 바탕이 되는 브랜치' 라고 적었다.
새로운 머지커밋이 만들어지지 않고 제일 최근 커밋으로 이동하는것을 말한다. 브랜치가 모두 다른 커밋일때 머지가 발생하는 3-way merge와 달리 fast-foward merge는 병합을 하려고 하는 브랜치는 신규 커밋이 없고 병합이 되는 브랜치만 신규 커밋이 있는 상황이다.


브랜치에서 생성된 커밋들을 하나의 커밋으로 합쳐서 머지하는 방법이다. --squash [브랜치명] 옵션을 추가해서 사용할 수 있다.
git checkout master
git merge --squash feature15
git commit -m "메세지"


rebase 명령어란 브랜치의 base를 옮긴다는 뜻으로 git branch [브랜치명] 으로 브랜치를 생성했을때 바탕이 되었던 브랜치를 변경한다는 뜻이다. 그림에서 feater15 브랜치는 C2 커밋이 base 이지만, rebase 명령어로 master 브랜치가 있는 C4로 변경할 수 있다. 그 후 merge를 진행하면 fast-foward merge와 결과가 같다.
git checkout feature15
git rebase master
git checkout master
git merge feature15


결론은 git log를 깔끔하게 관리하기 위해서 이다. git을 사용하는 이유는 버전관리를 위함도 있지만, 협업을 하기 위해서도 있다. 다양한 사람이 참여하기 때문에 commit로그가 복잡해질것이고, 이 log를 관리하는것도 중요한 요소가 된다. 따라서 rebase, squash 등등의 여러 방법을 통해서 최대한 간결하게 유지하기 위함이다.
Git 브랜치 - 브랜치와 Merge 의 기초
https://codingapple.com/unit/git-rebase-squash/
https://hudi.blog/git-merge-squash-rebase/
https://velog.io/@kmg2933/Git-Merge-Squash-Rebase-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
https://seosh817.tistory.com/240