클래스 명이나 패키지 명이 네이밍 컨벤션에 맞지 않아 변경해야 할 경우가 있다. 해당 이슈를 수행한 후 다음 이슈를 처리하러 feature -> develop 브랜치로 이동하고자 할 때 아래와 같은 에러를 접하게 된다.
error: The following untracked working tree files would be overwritten by checkout:
원래 master에 아래와 같은 class가 있었다고 가정해보자.
package com.example.test.testpackage;
public class testclass {
}
컨벤션을 지키지 않은 파일 및 패키지 명을 변경하는 이슈를 받고 master로부터 새 브랜치(new-branch)를 파서...
package com.example.test.testpackage;
public class TestClass {
}
이렇게 수정하고 push하고 PR까지 올렸다.
merge 승인받을 때까지 다른 이슈를 처리해야지! 하고 이제 다시 master로 switch해볼 것이다.
git switch master
그럼 이런 오류를 볼 수 있다. new-branch(현재 브랜치)에는 TestClass.java가 있지만 master 브랜치에는 testclass.java가 있기 때문에 브랜치 이동이 불가능한 상황이다.
참고 1
이것저것 하면서 local의 master를 삭제했기 때문에 원격의 master를 추적하는 로컬 master 브랜치를 생성하면서 switch하기 위해 위의 캡쳐본에서는
checkout
을 사용한 것이다. 로컬 기준 특정 파일명이 현재 브랜치와 이동할 브랜치 간 다르면 똑같은 에러를 볼 수 있을 것이다.
이럴 때는 HEAD의 위치를 조정하여 이동할 브랜치와 현재 브랜치의 파일명 대소문자를 맞춰줘야 한다.
현재 new-branch의 HEAD는 '컨벤션 지킨 클래스명' 에 있다. (new-branch와 origin/new-branch가 보이는데 로컬 기준으로 봐야하기 때문에 new-branch의 위치를 봐주면 된다.)
이제 HEAD의 위치를 master로 변경하여 현 브랜치와 이동할 브랜치를 맞춰줄 것이다.
git fetch --all
git reset --hard origin/master
브랜치 이동이 제대로 된 것을 확인할 수 있다.
참고 2
reset --hard의 대상은 원격 브랜치든 로컬 브랜치든 상관 없다. 이동하고 싶은 브랜치 기준으로 HEAD를 맞추는 데에 중점을 두면 될 것 같다.
참고 3
혹시 대소문자 변경 이슈를 처음 하는거라면...
git config core.ignorecase false
이 설정 한 번 해야 변경된 이름이 반영되는 것 같다.
git이 파일 혹은 폴더 이름을 🐶 무시할 때