Git branch
란?
![](https://velog.velcdn.com/images/mxkxx1011/post/9d6c2b23-6462-4c52-9ef6-6d41db7f1ce0/image.png)
메인 브랜치에서 새로운 갈래를 분기해 메인 브랜치에 영향 없이 독립적으로 작업할 수 있도록 도와주는 기능
- 불안정하거나 에러있는 코드라면 삭제하고,
- 안정적인 코드만을 메인 브랜치에 병합할 수 있어 안정성이 올라감
또한 브랜치는 커밋에 대한 포인터로 브랜치를 생성하는 것은 현재 커밋에 대한 새로운 포인터를 생성하는 것과 같다.
Merge
란
분기했던 브랜치에서 기존 브랜치와 합치는 것으로 다른 브랜치의 변경사항을 현재 브랜치에 적용시키는 것이다.
git merge "branch-name"
일반적인 Merge는 해당 코드를 통해 할 수 있지만 merge에도 다양한 방법이 존재한다.
merge
![](https://velog.velcdn.com/images/mxkxx1011/post/c4794348-ff6f-415e-ad08-236ce5b736c4/image.png)
- 위에 적었던 merge 방법으로 가장 일반적인 merge 방법이다.
- 해당 merge는 보통 두 브랜치를 합쳤다는 정보가 커밋 히스토리에 남아야하는 경우 사용한다.
fast-forward
![](https://velog.velcdn.com/images/mxkxx1011/post/3b2eb2d3-0e1e-431d-a526-7b014bfbe53e/image.png)
- 새로운 브랜치가 분기된 이후 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
![](https://velog.velcdn.com/images/mxkxx1011/post/e11ca82d-30cd-4b23-8d27-2565f870353a/image.png)
- 병합할 브랜치의 모든 커밋을 하나의 커밋으로 합친 새로운 커밋을 main 브랜치에 추가하는 방식
- 모든 커밋 이력이 하나로 합쳐져 사라진다
rebase and merge
![](https://velog.velcdn.com/images/mxkxx1011/post/43e6a4a0-ca66-47a7-9120-ab15231164a2/image.png)
- 사진에서 base는 A 커밋이지만
- rebase를 통해 C 커밋으로 베이스가 바뀌고 베이스를 기준으로 브랜치가 이동했다.
rebase merge
란 말 그대로 base를 재지정하는 병합방식
- 병합할 브랜치의 커밋을 새로운 base로 이어붙여지게 되므로 구조가 새롭게 바뀌고 새로운 커밋이 생기지 않는다.
- 커밋 히스토리를 깔끔하게 유지하는게 더 중요한 경우 사용한다.
출처