# Git 브랜치 병합 전략 비교: merge, rebase, cherry-pick
---
## 1. 기본 개념 요약
명령어
| 설명
|
---|
`merge`
| 브랜치 간 변경사항을 병합, 병합 커밋 생성
|
`rebase`
| 커밋 기반을 다른 브랜치 위로 옮겨 이력 재정렬
|
`cherry-pick`
| 특정 커밋만 골라 현재 브랜치에 복사
|
---
## 2. 명령어별 상세 설명
### `git merge <브랜치명>`
- ****역할****: 다른 브랜치의 변경 내용을 현재 브랜치에 병합
- ****병합 커밋****을 만들어 두 브랜치의 내용을 하나로 합침
```bash
git checkout main # 병합 대상 브랜치
git merge feature/login # 병합할 소스 브랜치
```
- 💡 즉: `main ← feature/login` 병합됨
---
### `git rebase <브랜치명>`
- ****역할****: 현재 브랜치 커밋을 `<브랜치명>` 위로 옮김
- 커밋이 ****새로 복사되어 SHA 변경****
- ****병합 커밋 없이 깔끔한 직선형 이력**** 생성
```bash
git checkout feature/login
git rebase main
```
- 💡 즉: `feature/login`을 `main` 기준으로 다시 쌓음
---
### `git cherry-pick <커밋해시>`
- ****역할****: 특정 커밋 하나를 현재 브랜치로 가져옴
- 전체 브랜치를 병합하지 않고 선택적 반영
```bash
git checkout main
git cherry-pick 7a1f3b2
```
---
## 3. 커밋 이력 비교
### `merge`
```
A---B---C---M (main)
\ /
D---E (feature)
```
### `rebase`
```
A---B---C---D'---E' (feature rebased onto main)
```
### `cherry-pick`
```
main: A---B---C---E'
feature: D---E
```
---
## 4. 적합한 상황
상황
| 추천 명령어
|
---|
팀 프로젝트에서 병합 이력 유지
| `merge`
|
개인 작업 커밋 정리
| `rebase`
|
특정 버그 수정만 따로 반영
| `cherry-pick`
|
---
## 5. 주의사항
- `merge`: 병합 커밋으로 이력이 복잡해질 수 있음
- `rebase`: ****협업 중인 브랜치에 사용 금지**** (이력 충돌)
- `cherry-pick`: 동일 커밋이 중복될 수 있음
---
## 6. 추가 명령어: `revert`, `reset`, `stash`
명령어
| 역할
| 주 사용 목적
|
---|
`revert`
| 특정 커밋을 취소하는
****새 커밋 생성****
| 실수한 커밋을 안전하게 되돌림
|
`reset`
| 커밋 이력/스테이징/작업 폴더 상태를 되돌림
| 브랜치나 파일을 과거 상태로 복구
|
`stash`
| 현재 작업을 임시로 저장
| 급히 브랜치를 바꿔야 할 때
|
```bash
# revert: 안전한 취소
git revert <커밋 해시>
# reset: 이력 되돌리기
git reset --soft HEAD~1 # 커밋만 되돌림
git reset --hard HEAD~1 # 작업 내용까지 삭제
# stash: 현재 작업 저장
git stash
git stash pop
```
---