Git branch란?

메인 브랜치에서 새로운 갈래를 분기해 메인 브랜치에 영향 없이 독립적으로 작업할 수 있도록 도와주는 기능
- 불안정하거나 에러있는 코드라면 삭제하고,
- 안정적인 코드만을 메인 브랜치에 병합할 수 있어 안정성이 올라감
또한 브랜치는 커밋에 대한 포인터로 브랜치를 생성하는 것은 현재 커밋에 대한 새로운 포인터를 생성하는 것과 같다.
Merge란
분기했던 브랜치에서 기존 브랜치와 합치는 것으로 다른 브랜치의 변경사항을 현재 브랜치에 적용시키는 것이다.
git merge "branch-name"
일반적인 Merge는 해당 코드를 통해 할 수 있지만 merge에도 다양한 방법이 존재한다.
merge

- 위에 적었던 merge 방법으로 가장 일반적인 merge 방법이다.
- 해당 merge는 보통 두 브랜치를 합쳤다는 정보가 커밋 히스토리에 남아야하는 경우 사용한다.
fast-forward

- 새로운 브랜치가 분기된 이후 main 브랜치에 새로운 커밋이 없을 때 새로운 브랜치의 변경 이력을 그대로 가져오는 병합 방식
- 메인 브랜치에서 새로운 변경 이력이 있다면 fast-forward merge가 아님
- 현재 브랜치가 가리키는 커밋이 병합하려는 브랜치가 가리키는 커밋의 조상 커밋일 때 두 브랜치는 Fast-forward 관계에 있다고 한다
- 기본적으로 설정되어 있는 옵션은 병합하려는 두 브랜치가 Fast-forward 관계일 때는 Fast-forward 방식으로 병합
- fast-forward 관계에 있어도
git merge -no-ff "branch-name" 명령어를 통해 강제로 3-way merge 방식을 사용할 수 있다.
3-way merge
- 대부분의 협업에서 발생하게 되는 merge 방식
- 브랜치마다 새로운 커밋이 하나 이상 있는 경우 사용
- 새로운 커밋을 생성해 병합한다.
| case | base | 브랜치1 | 브랜치2 | | result |
|---|
| case1 | A | A | B | -> | B |
| case2 | 1 | 2 | 1 | -> | 2 |
| case3 | "Hello" | (공백) | "hello" | -> | (공백) |
| case4 | "hello" | "hi" | "bye" | -> | conflict! |
- 3-way merge에서는 base에서 변화가 발생한 것을 우선 채택한다.
case4 는 base를 기준으로 브랜치1과 브랜치2 모두 변화가 생겼기 때문에 conflict가 발생한다
squash and merge

- 병합할 브랜치의 모든 커밋을 하나의 커밋으로 합친 새로운 커밋을 main 브랜치에 추가하는 방식
- 모든 커밋 이력이 하나로 합쳐져 사라진다
rebase and merge

- 사진에서 base는 A 커밋이지만
- rebase를 통해 C 커밋으로 베이스가 바뀌고 베이스를 기준으로 브랜치가 이동했다.
rebase merge란 말 그대로 base를 재지정하는 병합방식
- 병합할 브랜치의 커밋을 새로운 base로 이어붙여지게 되므로 구조가 새롭게 바뀌고 새로운 커밋이 생기지 않는다.
- 커밋 히스토리를 깔끔하게 유지하는게 더 중요한 경우 사용한다.
출처