# 병합 # Git 브랜치 병합 전략 비교: merge, rebase, cherry-pick --- ## 목차 1. [기본 개념 요약](#1-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EC%9A%94%EC%95%BD) 2. [명령어별 상세 설명](#2-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%B3%84-%EC%83%81%EC%84%B8-%EC%84%A4%EB%AA%85) 3. [커밋 이력 비교](#3-%EC%BB%A4%EB%B0%8B-%EC%9D%B4%EB%A0%A5-%EB%B9%84%EA%B5%90) 4. [적합한 상황](#4-%EC%A0%81%ED%95%A9%ED%95%9C-%EC%83%81%ED%99%A9) 5. [주의사항](#5-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD) 6. [요약 표](#6-%EC%9A%94%EC%95%BD-%ED%91%9C) 7. [시각적 예제](#7-%EC%8B%9C%EA%B0%81%EC%A0%81-%EC%98%88%EC%A0%9C) 8. [추가 명령어: `revert`, `reset`, `stash`](#8-%EC%B6%94%EA%B0%80-%EB%AA%85%EB%A0%B9%EC%96%B4-revert-reset-stash) --- ## 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. 요약 표
항목 merge rebase cherry-pick
대상 브랜치 전체 브랜치 전체 특정 커밋
이력 변경 여부 ❌ (유지) ✅ (SHA 변경됨) ✅ (선택적 커밋 복사)
병합 커밋 생성됨 생성 안됨 없음
협업 안정성 ✅ 안전 ⚠️ 위험 ✅ 안전
--- ## 7. 시각적 예제 ```bash # 예제 환경 구성 git init echo "A" > f.txt && git add . && git commit -m "A" echo "B" >> f.txt && git commit -am "B" git checkout -b feature echo "C" >> f.txt && git commit -am "C" git checkout main echo "D" >> f.txt && git commit -am "D" ``` ### merge ```bash git merge feature ``` ### rebase ```bash git checkout feature git rebase main ``` ### cherry-pick ```bash git log --oneline # 커밋 해시 확인 git cherry-pick <커밋 해시> ``` --- ## 8. 추가 명령어: `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 ``` ---