Branch Merge 전략 네 가지
① Fast Forward
자식 브랜치에서 변경 및 수정한 작업 내용이나 파일이 부모 브랜치에서 변경한 이력이 없어서 충돌 이슈가 없이 병합되는 경우다.
② 3 Way Merge
부모와 자식 브랜치에서 같은 파일을 수정할 경우 병합 시 충돌 문제가 발생하는데, 메인 브랜치로 병합하는 과정에 세 개의 커밋(공통 조상 커밋, 부모 브랜치 최신 커밋, 자식 브랜치 최신 커밋)을 비교해 수동으로 병합하는 방식이다. 메인 브랜치에서 충돌 이슈를 해결한다. 주로 메인 브랜치는 전체 프로젝트의 리더가 관리 및 담당하게 되는데 프로젝트의 규모가 클 수록 병합 과정이 늘어나면서 병목이 발생할 수 있다.
③ Rebase
자식 브랜치에서 부모 브랜치의 최신 버전으로 다운로드 및 병합하면서 자식 브랜치에서 직접 충돌 이슈를 해결하는 방식이다. 해당 브랜치를 담당하고 있는 개발자가 충돌 문제를 직접 해겨해야 하는데, 이는 자식 브랜치를 다루는 개발자도 프로젝트 리더와 같이 전체 아키텍처나 개발 프로세스 및 역량이 갖추어져 있어야 한다. 커밋 히스토리를 선형으로 깔끔하게 유지할 수 있는 장점이 있다.
④ Squash and Merge
자식 브랜치에서 여러 가지 작업이 진행되면서 다수의 커밋이 만들어질 수 있는데, 이 때 부모 브랜치로 병합하는 과정에는 하나의 커밋으로 합쳐서 병합하는 방식이다.
브랜치 병합 전략 별 샘플 시나리오
① Fast Forward
- 새로운 브랜치 생성 및 전환
$ git branch dev
$ git switch dev
$ git branch
main
* dev
- 신규 파일 생성 및 커밋
echo "sample" > sample.txt
git add .
git commit -m "ff test"
- 메인 브랜치 전환 후 병합
git switch main
git merge dev
- 병합 결과 확인
$ ll
total 8
-rw-r--r--. 1 ec2-user ec2-user 18 Apr 7 07:49 README.md
-rw-r--r--. 1 ec2-user ec2-user 7 Apr 8 09:57 sample.txt
② 3 Way Merge
- 새로운 브랜치 생성 및 전환
$ git branch dev2
$ git switch dev2
$ git branch
main
dev
* dev2
- 신규 파일 생성 및 커밋
echo "3way merge test" > three-way.txt
git add .
git commit -m "twm test"
- 메인 브랜치 전환 후 파일 생성 및 커밋 (충돌이 발생하도록 같은 파일명으로 생성)
git switch main
echo "Conflict" > three-way.txt
git add .
git commit -m "twm test"
- 병합 및 충돌 내용 확인
$ git merge dev2
(main|MERGING) $ vim three-way.txt # 명령 프롬프트의 상태가 변경됨
<<<<<<< HEAD
Conflict
=======
3way merge test
>>>>>>> dev2
- 에디터에서 수동으로 코드 변경 후 저장
3way merge test
Conflict
- 최종 변경 내역 커밋
git add .
git commit -m "twm test"
# 명령 프롬프트의 MERGING 값이 사라진 것을 확인
(main) $
③ Rebase
- dev2 브랜치로 전환 및 파일 수정
echo "rebase test" >> three-way.txt
git add .
git commit -m "rb test"
- rebase 명령 후 수동으로 충돌 해결 및 저장
$ git rebase main
(dev2|REBASE 1/1) $ vim three-way.txt
3way merge test
Conflict
rebase test
- rebase 처리
git add .
git rebase --continue
- 메인 브랜치에서 파일 변경사항 확인 후 병합
$ git switch main
$ cat three-way.txt
3way merge test
Conflict
$ git merge dev2
$ cat three-way.txt
3way merge test
Conflict
rebase test
④ Squash and Merge
- dev 브랜치에서 병합
$ git switch dev
$ git merge main
$ ll
total 12
-rw-r--r--. 1 ec2-user ec2-user 18 Apr 7 07:49 README.md
-rw-r--r--. 1 ec2-user ec2-user 7 Apr 8 09:57 sample.txt
-rw-r--r--. 1 ec2-user ec2-user 37 Apr 8 10:26 three-way.txt
- 파일 삭제 후 커밋
rm -rf sample.txt
git add .
git commit -m "rm sample"
- three-way 파일 수정 후 커밋
echo "sm test" >> three-way.txt
git add .
git commit -m "sm test"
- 메인 브랜치로 전환 후 병합
git switch main
git merge dev
- 커밋 로그를 보면 dev 브랜치에서 진행한 2개의 커밋이 모두 반영되어 있는 것을 확인할 수 있다.
$ git log --oneline
b223364 (HEAD -> main, dev) sm test
a7aad6a rm sample
...
- 하나의 커밋만 남기고 싶은 경우 병합 시 squash 옵션을 추가한다.
# dev 브랜치로 전환 후 샘플 파일 추가 및 커밋
git switch dev
echo "add option" >> squash-test.txt
git add .
git commit -m "add squash-file"
echo "--squash" >> squash-test.txt
git add .
git commit -m "update squash gile"
# 메인 브랜치로 전환 후 커밋 명령 수행 (--squash 옵션 추가)
git switch main
git merge --squash dev
git commit -m 'one commit'
- 커밋 결과 확인
$ git log --oneline
610308b (HEAD -> main) one commit
b223364 sm test
a7aad6a rm sample
...
'CICD > Git' 카테고리의 다른 글
[Git] Branch 전략 (0) | 2025.04.09 |
---|---|
[Git] Git reset / revert (0) | 2025.04.08 |
[Git] Command 정리 (0) | 2025.04.08 |
[Git] Git 기본 개요 (0) | 2025.04.08 |
[Git] SSH 방식으로 복수의 원격 저장소 등록 방법 (1) | 2024.12.18 |