ours merge strategy
🔀 Git의 ours
merge 전략
Git은 복잡한 브랜치 전략을 유연하게 관리할 수 있는 강력한 도구입니다. 그중 ours
병합 전략은 일반적인 병합과는 다른 의도적인 무시 전략을 사용합니다. 이 글에서는 ours
전략의 철학, 내부 동작 방식, 실전 예제, 오용 방지 팁까지 상세하게 다룹니다.
🧠 1. ours
전략이란?
✔ 정의:
ours
병합 전략은 충돌이 발생하더라도 "현재 브랜치의 내용만 유지하고 상대 브랜치의 변경 사항은 무시"하는 전략입니다.
즉, 병합 대상 브랜치에서 어떤 내용이 변경되었든 간에, 현재 체크아웃된 브랜치의 변경 내용만을 정답으로 간주합니다.
🧪 2. 내부 동작 방식
병합 기본 구조:
병합(Merge)은 Git이 아래 3개의 커밋을 기준으로 3-way merge를 수행하는 과정입니다.
o---o---o---A (feature)
/
---o---o---B (main)
- 공통 조상(merge base):
o
- 현재 브랜치:
main
(B) - 병합 대상 브랜치:
feature
(A)
git merge -s ours feature
를 실행하면:
- 실제로는 병합 커밋이 생성되지만,
- 커밋의 내용은 무조건 현재 브랜치(
main
)의 내용으로 결정됩니다. feature
브랜치의 커밋은 무시됩니다.
병합된 것처럼 보이지만, 실제로는 상대 브랜치의 내용은 아무것도 반영되지 않은 상태입니다.
📂 3. 실전 예제: ours
전략으로 기능 브랜치 무시하기
# 초기화 및 첫 커밋
git init ours-demo
cd ours-demo
echo "base" > file.txt
git add .
git commit -m "Initial commit"
# feature 브랜치 생성 및 수정
git checkout -b feature
echo "feature change" > file.txt
git commit -am "Change in feature branch"
# main 브랜치에서 또 다른 수정
git checkout main
echo "main change" > file.txt
git commit -am "Change in main branch"
# ours 병합 전략 사용
git merge -s ours feature -m "Merging feature with ours strategy"
결과 확인
cat file.txt
# 출력: main change
- 병합 커밋은 존재함.
- 그러나
file.txt
는 feature 브랜치가 아닌main
브랜치의 내용만 유지됨.
🧰 4. ours
전략의 활용 사례
활용 상황 | 설명 |
---|---|
🔁 의도적 무시 | 특정 브랜치의 변경사항을 전혀 반영하고 싶지 않을 때 사용 |
📌 브랜치 히스토리 통합 | 여러 브랜치 히스토리를 형식적으로 병합하되 실제 내용은 유지하고 싶을 때 |
🔥 실험 브랜치 폐기 | 기능 브랜치가 실험적으로 만들어졌지만 본 브랜치에 반영하지 않기로 했을 때 |
⚠️ 5. 주의할 점
항목 | 설명 |
---|---|
❗ 오용 주의 | 협업 중 실수로 ours 병합을 하면 상대 브랜치 작업을 모두 날려버리는 효과가 있습니다. |
⛔ pull 시 사용 금지 | git pull 과 -s ours 를 함께 쓰면 예상치 못한 데이터 손실 가능성 |
💬 사용 의도 명확히 | ours 는 내용 무시를 명시적으로 선택하는 것이므로 기록 목적 병합 외에는 신중하게 사용해야 합니다. |
🔍 6. 관련 전략과의 비교
전략 | 설명 | 상대 브랜치 반영 여부 |
---|---|---|
recursive (기본) |
자동 충돌 해결을 시도하는 일반 병합 | ✅ 예 |
ours |
현재 브랜치 우선, 상대 브랜치 무시 | ❌ 아니오 |
theirs (rebase 시) |
상대 브랜치의 변경을 우선시 | ✅ 예 (하지만 merge 전략으로는 존재하지 않음) |
octopus |
3개 이상 브랜치 병합 | ✅ 제한적 |
subtree |
서브트리 병합 전용 전략 | ✅ (디렉토리 레벨) |
✅ 7. ours 전략의 현실적 주요 용도:
🔥 "특정 브랜치를 병합하지 않고 정리하고 싶을 때"
즉, 병합 커밋은 만들되 해당 브랜치의 작업은 버리고 싶을 때 사용하는 것입니다.
예: 실험적인 feature 브랜치를 정리하려는 경우
# 실험적 브랜치
git checkout -b experimental
# ... 많은 커밋들 ...
# main 브랜치로 이동
git checkout main
# 병합은 하되, 실제 내용은 무시
git merge -s ours experimental -m "Ignore experimental changes"
# experimental 브랜치 삭제
git branch -d experimental
결과
- main 브랜치에 experimental이 병합된 형식적 흔적만 남음
- experimental의 실제 커밋 내용은 완전히 무시
- experimental 브랜치는 안전하게 삭제 가능 (이미 병합된 것으로 인식됨)
💡 왜 그냥 삭제하지 않고 merge -s ours를 사용하는가?
Git은 다음과 같은 보호 장치를 갖고 있습니다:
- git branch -d <branch>는 "이미 병합된 브랜치만 삭제" 가능
- 병합되지 않은 브랜치는 -D (강제 삭제)를 사용해야 함
즉, 병합된 이력은 남기고 싶지만, 내용은 반영하고 싶지 않을 때:
git merge -s ours는 **"병합된 것으로 표시하되 내용은 무시"**하므로
브랜치 삭제 조건을 만족시키는 동시에 안전하게 처리할 수 있는 방법입니다.
🚨 실전에서의 오용 주의
- 협업 중 이 전략을 동의 없이 사용하면 상대 작업을 완전히 무시하게 됨
- CI/CD 파이프라인 상에서는 예상치 못한 결과를 초래할 수 있음
📝 결론
Git의 ours
병합 전략은 단순한 병합 도구를 넘어 의도적 무시라는 철학적 선택을 제공합니다. 특히 실험적인 브랜치를 버릴 때나, 구조적으로 통합만 원할 때 매우 유용하지만, 그만큼 위험한 전략이기도 합니다. 올바른 맥락에서 신중하게 사용해야 합니다.
✅ 요약
ours
전략은 현재 브랜치의 내용만 반영하고, 상대 브랜치의 변경 사항은 모두 무시- 형식적으로 병합 커밋을 남길 수 있음
- 실험 브랜치 폐기, 히스토리 정리, 의도적 무시 등에 유용
- 협업 중에는 절대 신중하게 사용해야 함