Infra

develop 브랜치와 feature 브랜치가 컨플릭트 났던 이슈 트러블 슈팅

flutter developer 2025. 2. 5. 02:48

문제 상황 

feature 브랜치에서 작업이 진행되었고,  develop 브랜치에 머지하려고 할 때 컨플릭트 발생

아래와 같은 브랜치 상태에서 develop 브랜치로 변경하려고 하니 변경 사항이 겹쳐서 checkout이 막힌 상황이었다.

 A --- B --- C --- D --- E --- F --- G (develop, old)
                      \
                        X --- Y --- Z (feature/chat-list, new)
  • develop 브랜치는 기존 G 커밋에서 멈춰 있었고,
  • feature/chat-list 브랜치에서 X, Y, Z 커밋이 추가됨
  • develop 브랜치로 이동하려고 했지만 변경 사항이 겹쳐버려 컨플릭트가 발생했다.
  • 이때 강제로 develop 브랜치를 feature/chat-list와 동일하게 만들고 싶었다.

오류 메시지 

error: Your local changes to the following files would be overwritten by checkout:
        apps/sample/pubspec.lock
Please commit your changes or stash them before you switch branches.
Aborting

현재 변경된 파일이 존재하여 컨플릭트가 나는 바람에 develop 브랜치로 이동할 수 없다며 에러문구가 떴다.


해결 방법 

방법 1: 기존 develop 변경 사항을 버리고 feature/chat-list와 동일하게 만들기

git checkout develop  # develop 브랜치로 이동

 

기존 develop 브랜치의 변경 사항(E, F, G)을 완전히 무시하고, feature/chat-list와 동일하게 만든다.

 

git reset --hard

만약 이동이 불가능하면 아래 명령어로 강제로 변경 사항을 삭제하고 이동한다.

 

git reset --hard feature/chat-list

이제 develop 브랜치를 feature/chat-list와 동일하게 덮어쓴다.  그리고 원격 저장소에도 강제로 적용한다.

git push origin develop --force

이렇게 하면 develop 브랜치는 feature/chat-list와 동일한 상태가 되며, 기존의 develop 변경 사항(E, F, G)은 사라진다.


방법 2: 기존 develop 변경 사항(E, F, G)도 반영하면서 feature/chat-list를 병합하기

git checkout develop 
git merge feature/chat-list

기존 develop 브랜치에서 진행된 변경 사항을 유지하면서 feature/chat-list의 변경 사항을 반영하려면 merge를 사용한다.

git add .  # 충돌 해결 후 변경 사항 스테이징
git commit -m "Merge feature/chat-list into develop with previous changes"  # 병합 완료 후 커밋

이 과정에서 충돌(conflict)이 발생할 수 있으므로 git status를 확인하고, 필요하면 수동으로 해결한 후 커밋한다.

 

 원격 브랜치에도 강제 적용 

만약 원격 저장소에도 이 변경 사항을 반영하려면 다음 명령어를 실행한다.

git push origin develop --force

⚠️ --force 옵션을 사용할 경우 기존 develop 브랜치의 히스토리가 덮어씌워지므로 주의!


해결 후 브랜치 상태 

방법 1 적용 후 (feature/chat-list와 동일하게 덮어쓰기)

 A --- B --- C --- D --- E --- F --- G (old develop, 삭제되었음)
                      \
                        X --- Y --- Z (new develop)

이제 develop 브랜치는 feature/chat-list와 완전히 동일해졌다.

 

방법 2 적용 후 (develop 변경 사항도 유지하면서 병합)

 A --- B --- C --- D --- E --- F           G develop (merged)
                               |           |
                               X --- Y --- Z (feature/chat-list changes merged)

이제 develop 브랜치는 feature/chat-list의 변경 사항을 포함하면서도, 기존 develop의 변경 사항(E, F, G)도 유지된 상태가 되었다.


  • 기존 develop 변경 사항을 버리고 싶다면? git reset --hard feature/chat-list
  • 기존 develop 변경 사항을 유지하면서 병합하려면? (수동으로 컨플리트 처리후) git merge feature/chat-list