Git

ours merge strategy

헬로우월드 2023. 6. 20. 04:24

🔀 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 전략은 현재 브랜치의 내용만 반영하고, 상대 브랜치의 변경 사항은 모두 무시
  • 형식적으로 병합 커밋을 남길 수 있음
  • 실험 브랜치 폐기, 히스토리 정리, 의도적 무시 등에 유용
  • 협업 중에는 절대 신중하게 사용해야 함