git merge
merge는 다른 branch에 있는 커밋을 가져올때 사용한다
예를 들어서,
master, premium 브랜치가 있고, 현재 premium branch에 있을때
git merge master
- 현재 위치인 premium branch에 master branch 를 합치겠다
- merge 하면 merge 커밋이라는 새로운 커밋이 생김 (merge commit)
Fast-forward merge
master branch 에 있음. (HEAD 가 master 브랜치 가리키고 있음)

이때 git merge premium 을 하면?

- premium 브랜치가 가리키던 커밋을 master 커밋도 똑같이 가리키게 됨.
- 총 커밋수는 그대로다
⇒ 새로운 커밋이 생기는게 아니라 단지 브랜치가 이동하게 되는 머지!
- 커밋 히스토리에서 같은 선(line) 상에 있는 브랜치를 머지할 때 Fast-forward 머지가 이루어진다
3-way merge
- 두 브랜치가 커밋 히스토리 상에서 분리된 2개의 선에 각각 존재할 때 머지를 하면 머지 커밋이 새롭게 생기는데 이런 머지를 3-way merge 라고 한다
- 1,2,3 세가지 커밋을 고려해서 머지하기 때문

(1)번 : 두 갈래로 갈라지기 전 공통 조상이 되는커밋
(2)번 : 한 브랜치가 가리키는 커밋
(3)번 : 다른 브랜치가 가리키는 커밋
master 브랜치와 premium 브랜치를 머지했을 때 상황별 결과

모든 커밋에 sample.txt 파일이 있다고 가정하면,
- base : 두 브랜치의 공통 부모 커밋의 sample.txt 파일의 내용 중 일부 = 위 그림 (1)번
- master : 마스터 브랜치의 최신 커밋의 sample.txt 파일의 내용 중 일부 = 위 그림 (2)번
- premium : 프리미엄 브랜치의 sample.txt 파일의 내용 중 일부 = 위 그림 (3)번
- 머지 결과 : master 브랜치에서 premium 브랜치를 머지했을 때의 최종 결과
머지결과에 대한 설명
case1
- base를 기준으로 볼 때, master에서는 변화가 없었지만, premium에서는 A가 B로 변경된 상태
- 3-way merge는 base에서 변화가 발생한 것을 우선 채택합니다. 그래서 머지 결과는 'B'가 된다
case2
- base에서 변화가 발생한 2가 머지 결과가 됨
case3
- "hello"를 삭제해서 공백 상태가 된 것이 변화가 더 발생한 것이기 때문에
- 머지 결과는 공백이 됨
case4
- 이전 경우들과 좀 다름!
- 둘 다 base 때와는 다른 변화가 일어남 ⇒ 이렇게 두 브랜치에서 다 변화가 있을 때 ⇒ 'Git도 모른다!'
- Conflict가 발생
3 - way merge 어떤 방식으로 이루어지는지 정리
- base때의 내용과 비교했을 때 달라진 부분이 있는 것이 우선시되고,
- 두 브랜치에서 둘다 변화가 일어났을 때는 Conflict를 발생시켜서 사용자가 스스로 선택하게끔 한다