모든 버전 관리 시스템은 브랜치를 지원한다. 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있는데, 이렇게 독립적으로 개발하는 것이 브랜치다.
git-scm
오늘 글의 주된 주제입니다 앞서 브랜치에대해 설명을 잠깐 한 것은 Merge 기능을 사용하기전 필수적으로 알아둬야할 선행지식이기 때문입니다.
1-1. 어떠한 경우에 적용되는지?
Fast-foward Merge는 베이스에서 하나의 커밋이 분기점으로 생기고 베이스에는 다른 수정사항 없이 커밋에만 수정사항이 발생후 Merge시 사용됩니다.
1-2. 어떠한 강점이 있는지?
단순히 Main Branch에서 분리된 다른 Branch를 최신버전으로 Head가 이동되기때문에 Marge Commit 이력이 남지 않습니다.
해당 이미지를 봐봅시다 !
1. Master Branch 에서 B까지 커밋후 새로운 브런치(B 라고 하겠음) 분기점 발생
2. B브런치에서 Y까지 커밋후 Merge시 Master의 변경점이 없음으로 Master과 B(feature)의 Head가 모두 Y를 가르킵니다.
2-1. 어떠한 경우에 적용되는지?
3-way Merge는 서로 다른 두 브랜치에서 동시에 변경 사항이 발생하고, 이 두 브랜치를 병합할 때 사용됩니다. 두 브랜치의 커밋 히스토리가 갈라져 있는 경우에 3-way Merge가 필요합니다.
2-2. 어떠한 강점이 있는지?
3-way Merge는 동시에 변경 사항이 발생한 두 브랜치를 효과적으로 병합할 수 있으며, 병합 커밋을 생성하여 변경 사항을 통합합니다. 이로써 동시에 변경이 발생한 부분을 효과적으로 병합할 수 있으며, 변경 이력을 보다 정확하게 관리할 수 있습니다.
2-3. 3-Way Merge의 필수조건
✔️ 1. 두개의 브랜치의 공통되는 조상커밋(Base)
✔️ 2. 다르게 작업중인 브랜치 1
✔️ 3. 다르게 작업중인 브랜치 2
➰ 이것을 합쳐 3-Way Merge라고 합니다.
해당 이미지를 봐봅시다 !
1. 베이스 커밋에서 두개의 커밋파생
2. feature1 커밋은 베이스의 변경점없이 그대로 이어져 Fast-foward Merge로 진행
3. feature2 의 커밋은 두번째과 세번째 커밋의 사이에 베이스의 변경이 일어남 3-Way Merge 진행
3-1. 사용방법
앞으로 소개할 Squash and Merge
와 Rebase
는 앞에서말한 Fast-Foward Merge 와 3-Way Merge 와 다르게 터미널에 직접 명령어를 입력해야합니다.
- 사용방법 -
git merge --squash my-branch // git merge <옵션> <브랜치이름>
3-2. Squash and merge의 특징
✔️ 장점
✔️ 단점
기존 마스터브랜치(init) 에서 파생된 새로운 브랜치에서 A => B => C 를 진행후 다시 마스터브랜치에서 해당 브랜치를 Merge --squash를 시도하면 init 브런치와 A,B,C 브런치 하나가 생성됩니다.
여기서 주의점은 A,B,C의 브런치가 생성이 된다는것은 그 전의 A,B,C에 대한 모든 히스토리와 정보가 날라가며 하나의 커밋으로 병합된다는점 입니다.
오른쪽 상단의 그래프에는 11 12 13 의 변경내역이 보이지만 밑의 log를 확인해보니 로그가 전체다 삭제되고 squash라는 이름의 브랜치로 통합된모습 (squash는 저가 지정한 이름입니다.)
4-1. 사용방법
- 사용방법 -
git rebase my-branch // git rebase <브랜치이름>
4-2. Rebase and merge의 특징
✔️ 장점
✔️ 단점
말 그대로 Re(다시)Base(베이스) 다시 베이스를 만든다는 뜻 입니다.
위의 이미지를 예시로 보면 A=>B
이후 C
와 D
로 분기점이 나눠지는데 이때 Master (A=>B
커밋이 진행되는 브런치) Rebase C 를 하면 C
를 기점으로 다시 베이스가 지정되는것입니다.
이때 C
의 작업내용은 B
의 최신내용에 합쳐져 베이스를 만듭니다!
중요한 Point는 Squash는 여러 커밋을 합쳐서 하나의 커밋으로 만들지만 이력또한 다 사라져 깔끔 할 수 있으나 위험할수 있으며 Rebase는 여러커밋을 Head 커밋을 기준으로 Base를 다시 설정하며 이력을 보존해준다는 점입니다.
1이 MAIN의 브런치이며 11~13이 '11(브런치이름)'의 브런치입니다. main을 기준으로 베이스 다시 나눠진게 보이시나요 ??
2023-10-28 Git - Branch Merge