~☆~ 우하하!!~ 개발블로그

git 충돌 해결 방법 (사례1-fatal: refusing to merge unrelated histories) 본문

git

git 충돌 해결 방법 (사례1-fatal: refusing to merge unrelated histories)

iwoohaha 2024. 11. 12. 12:25
728x90
반응형

git 사용중에 이런 사례가 발생했다.

 

(Local에서)

로컬에서 프로젝트를 생성했다. 프로젝트 생성과 동시에 로컬에 git repository 를 만들었다. main 브랜치에 초기 커밋(README 파일이 포함됨) 외에 새로운 2개의 수정사항에 대한 커밋을 수행했다.

 

(Remote에서)

이 프로젝트를 gitlab 에서 관리하기 위해서 gitlab 에서 새 프로젝트를 생성했다. 새 프로젝트 생성시에 README 파일 하나가 만들어지도록 선택했다.

 

(Local에서)

Remote 리파지토리 주소를 로컬 저장소의 remote 주소로 등록했다.

main 브랜치로부터 woohaha 라는 브랜치를 새로 땄다. gitlab 에서는 main 브랜치로의 직접 push 가 불가능하기 때문이다.

그리고 woohaha 브랜치를 push 하였다.

 

(Remote에서)

woohaha 브랜치를 main 브랜치로 merge 하려 했으나, 충돌이 발생했다.

 

그림으로 정리해본다면

 

충돌이 발생한 이유는 remote 저장소의 README 파일과 local 에서 push 한 woohaha 브랜치의 README 파일의 내용이 달랐기 때문이다. 서로 다른 출발점에서 시작된 repository 이기 때문에 자동 merge 가 가능하지 않았다.

 

이 충돌을 다음과 같이 해결하였다.

Local 에 존재하는 main 브랜치는 Local 의 브랜치이므로 해당 브랜치(main)를 삭제하고,

git branch -d main

 

Remote 의 main 브랜치를 Local 의 main 으로 checkout 했다.

git checkout -b main origin/main

 

이렇게 하면 로컬에는 2개의 브랜치가 존재하게 된다. 

main 브랜치는 Remote 의 main 브랜치이고, woohaha 브랜치는 Local 의 woohaha 브랜치이다.

이제 2개의 브랜치를 merge 하되, Local 의 woohaha 브랜치에 머지하여 Remote 로 push 해야 하므로 main -> woohaha 방향의 merge 여야 한다.

merge 로 수정될 브랜치를 checkout 한다.

git checkout woohaha

 

main 브랜치를 현재 체크아웃된 브랜치에 머지한다.

git merge main

 

이 명령어 역시 fatal: refusing to merge unrelated histories 라는 메시지를 표시하며 제대로 동작하지 않는다.

이 메시지는 2개의 서로 다른 브랜치가 서로 관련 없는 독립적인 히스토리를 가지고 있는 상황이기 때문에 일반적인 merge 작업이 불가능하다는 의미이다.

 

그러나 로컬에서의 머지 작업이므로 여러 도구의 힘을 빌릴 수가 있다.

아래 스크린샷은 Fork 라는 git client 프로그램에서 woohaha 브랜치로 main 브랜치를 머지하는 과정(main 브랜치를 base 로 재배치하고 woohaha 의 브랜치의 커밋을 적용함)에서 충돌이 발생한 파일을 보여주는 상황이다.

 

스크린샷에서 볼 수 있듯이 README.md 파일에 대한 충돌이 표시되고 있는데, 이 파일은 main 브랜치의 파일과 woohaha 브랜치의 파일이 완전히 다르므로 둘 중 어느 것 하나를 선택해야만 한다.

여기에서 woohaha 브랜치의 것을 선택하여 충돌을 해결해주면 된다.

 

 

여기까지 수행하면 로컬의 woohaha 브랜치는 최초 main 브랜치로부터 기존 woohaha 브랜치에 수정한 커밋들이 차례대로 정렬된다.

아래쪽 노란색 사각형 안의 커밋들은 머지하기 위해서 remote 로 push 해 둔 woohaha 브랜치인데, 로컬의 woohaha 브랜치에 모든 커밋들이 정상적으로 정리되었으므로 삭제해도 된다. 아래 명령어를 실행시켜서 origin/woohaha 브랜치를 삭제한다.

git push origin --delete woohaha

 

이제 로컬의 woohaha 브랜치를 push 해서 merge request 를 수행할 수 있게 된다.

 

반응형