들어가기에 앞서
멋쟁이사자처럼 5기를 같이 참여하고 있는 분께서 Git 오류에 대해 도움을 요청해 주셨다.
예전에 경험해 봤던 문제이면서 Git의 동작 과정을 다시 한번 정리해 볼 수 있었기에 해결한 과정에 대해 기록해보고자 한다.
🚚 현재 레파지토리(Repository)에서 새로운 레파지토리로 파일 이동하기
현재 레파지토리에 있는 파일들을 다른 레파지토리와 합치고 싶다면 어떻게 해야 할까?
우선 나의 컴퓨터에 있는 폴더 즉, 로컬 환경에 있는 폴더와 연결된 remote
를 옮기고 싶은 새로운 레파지토리와 연결시켜주어야 한다.
💡 여기서 Git의 remote란 무엇일까?
쉽게 얘기하자면 내 컴퓨터에 있는 폴더와 원격 저장소를 연결시켜 주는 명령어이다.
많은 사람이 사용하고 있는 Github
는 Git을 기반으로 소스를 관리할 수 있는 원격 저장소이다.
Github에서는 내 폴더의 어떤 소스를 관리할지 알 수 없기 때문에 이 remote
명령어를 사용해서 리모트 저장소를 추가함으로써 내 파일을 너의 레파지토리에서 관리할 거야!라고 알려주는 것이다.
즉, remote를 어디에 연결하는지에 따라서 A 레파지토리에서는 알고리즘 문제 풀이 대한 소스 폴더(혹은 파일)를, B 레파지토리에서는 Todo 애플리케이션에 대한 소스 폴더를 관리할 수 있게 되는 것이다.
따라서 첫 번째로 해야 할 것은 현재 내 폴더와 연결되어 있는 remote를 변경시키는 것이다.
♻️ remote 변경하기
git remote remove origin
# 혹은 git remote rm origin
git remote add origin 새 레파지토리 주소
우리는 주로 origin
이라는 별명을 가진 remote 저장소를 추가한다.
따라서 새로운 리모트 저장소를 연결할 때 이전에 지정했던 origin
이라는 저장소를 삭제하고, 다시 새로운 리모트 저장소와 연결시켜 주는 작업이 필요하다.
만약 이전에 remote add
로 저장소를 추가할 때 origin
이 아닌 myorigin
으로 했다면 git remote remove myorigin
으로 remote 저장소를 삭제할 수 있다.
새 레파지토리의 주소는 해당 레파지토리 오른쪽에 보이는 <> Code
를 클릭 후, 복사 버튼을 눌러서 가져올 수 있다.
위 레파지토리를 예시로 들었을 때 리모트 저장소를 추가한다면 아래와 같이 터미널에 작성하면 된다.
git remote add origin https://github.com/mihyunLee/mihyunLee.git
📥 연결한 레파지토리의 기존 데이터 가져오기
git pull origin main --allow-unrelated-histories
연결이 끝났다면 git pull
명령어를 사용하여 연결된 레파지토리의 데이터를 가져와야 한다.
git pull
명령어는 연결된 레파지토리에 있는 데이터를 가져와서 현재 로컬 환경과 병합(Merge)해준다.
💡 그렇다면 뒤에 --allow-unrelated-histories
는 무엇일까?
기존의 레파지토리의 데이터와 새로 연결한 레파지토리의 데이터는 서로 다른 기록을 가지고 있다.
git에서는 기본적으로 공통적인 레파지토리를 가지고 있지 않다면 병합(Merge)을 거부한다.
따라서 git pull origin main
만 한다면 오류가 발생하게 된다.
--allow-unrelated-histories
옵션은 독립적으로 구성되어 관계가 없던 데이터 기록을 병합하는 것을 허락해 준다는 의미로
기존의 레파지토리의 데이터와 새로 연결한 레파지토리의 데이터 기록을 병합할 수 있다.
이때, 두 레파지토리에서 동일한 이름을 가진 파일이 존재한다면 병합 충돌(Merge Conflict)이 발생할 수 있다.
✅ 새로 연결된 레파지토리에 변경사항 업데이트하기
git push origin main
병합 충돌 없이 새로 연결된 레파지토리의 데이터와 기존의 데이터가 잘 병합되었다면 git push
명령어를 통해 원격 저장소에 데이터를 업데이트하면 된다.
만약 충돌이 생겼다면 해결한 후에 push 해주자!
🧹 정리하기
git remote remove origin # 기존에 연결된 원격 저장소 연결 해제
git remote add origin 새로운 레파지토리 주소 # 새로운 레파지토리와 연결
git pull origin main --allow-unrelated-histories # 새로운 레파지토리의 데이터를 가져와 기존 데이터 히스토리와 병합
git push origin main # 새로운 레파지토리에 변경된 데이터 업데이트 하기