yamoo9 / likelion-FEQA

질문/답변 — 프론트엔드 스쿨, 멋사
29 stars 9 forks source link

[LAB-4] Git에서 폴더명을 변경했더니 발생한 오류에 대해 질문있습니다. #304

Closed SeoMiYoung closed 1 year ago

SeoMiYoung commented 1 year ago

질문 작성자

서미영

문제 상황

안녕하세요. 제가 폴더명에 대한 컨벤션을 잘 지키지 않았어서(앞으로 잘 지키도록 하겠습니다ㅠㅠ), 폴더명을 수정하려고 했습니다.

pages/Home/Mainmodal => pages/Home/MainModal

이렇게 바꿔야 하는데요,

우선 처음에는 단순히 Rename으로 (마우스 클릭으로) 이름 변경을 시도하고 PR하였으나, 이상하게 PULL을 받으면 다시 원래의 이름으로 돌아오는 현상이 발생했습니다.

그래서 이상하다 싶어서, 검색을 해보니,

Git은 기본적으로 파일 및 폴더명의 대소문자를 구분하지 않는다. 그래서 cat이라는 파일을 Cat으로 변경해도, Git은 감지하지 못한다. 

git config core.ignorecase false
=> git config에 등록해주면, git은 대소문자를 구분할 수 있게 된다.

는 글을 보게 되었고, 명령어를 입력해주었습니다.

또한, cd를 통해서 폴더명을 바꾸려고 시도도 해봤고, 어떤 글들은 캐시를 비우라고 해서, 캐시를 비운 후 commit하기도 해봤고, 또 찾아보니 추적하고 있지 않은 파일들을 지우라고 해서, git clean -fd --dry-run를 입력해보기도 했습니다.

어찌저찌하다보니, 로컬에 있는 Mainmodal을 모두 MainModal로 수정했고, orgin과 upstream에 모두 push와 PR을 통해 MainModal인 상태로 변경시켜놨습니다.

(1) 다음 사진은 origin 상황입니다. (https://github.com/SeoMiYoung/project-repo/tree/feat/%23212/src/pages/Home/MainModal) image

(2) 다음 사진은 upstream의 develop 브랜치 상황입니다. (https://github.com/LikeLion-FE-React-Project04/project-repo/tree/develop/src/pages/Home/MainModal) image

둘다 모두 Mainmodal이 아닌, MainModal인 걸 확인할 수 있었습니다.

그래서 저는 로컬에서 현재 feat/#212 브랜치에서 작업중이었는데, develop브랜치로 이동을 하려고 git checkout develop 을 입력했습니다.

그러나, 자꾸 이동하는데 실패하고, 다음과 같은 문구가 뜹니다. 그래서 현재 develop으로 이동을 못하고 있는 상황입니다... image

로컬, origin, upstream에 폴더명이 모두 잘 바뀐 것 같은데 에러문구가 왜 뜨는 것일까요?

도움이 필요합니다...

프로젝트 저장소 URL

origin: https://github.com/SeoMiYoung/project-repo branch: feat/#212

환경 정보

yamoo9 commented 1 year ago

https://github.com/yamoo9/likelion-FEQA/issues/290#issuecomment-1502776108 에서 답변한 것처럼 컨벤션을 지키지 않아 발생한 Git 이슈인지라 해당 문제 해결을 위해 오류 메시지가 안내하는 방법을 먼저 수행해보세요.

error: The following untracked working tree files would be overwritten by checkout: src/pages/Home/Mainmodal/@recoil/Mainmodalstate.is src/pages/Home/Mainmodal/Mainmodal.jsx src/pages/Home/Mainmodal/Mainmodal.module.scss src/pages/Home/Mainmodal/Mainmodal.stories.is src/pages/Home/Mainmodal/MainmodalLayout.jsx src/pages/Home/Mainmodal/MainmodalLavout.module.scss src/pages/Home/Mainmodal/useGetCookieEvent.js Please move or remove them before you switch branches.

오류 메시지

아래 나열된 워킹 트리의 추적되지 않은 파일은 체크아웃 과정에서 덮어써지게 됩니다. The following untracked working tree files would be overwritten by checkout:

해결 방법

체크아웃으로 브랜치를 전환하기 전에 문제의 추적되지 않은 파일을 제거하거나, 이동 시킵니다. Please move or remove them before you switch branches.

출력된 문제 파일의 이름을 모두 아래 방법으로 변경합니다. Git mv 명령을 사용해 이름을 변경하면 체크아웃 시 오류가 발생하지 않습니다. (참고)

git mv src/pages/Home/Mainmodal/@recoil/Mainmodalstate.is temporary-name
git mv temporary-name src/pages/Home/MainModal/@recoil/MainModalState.js

다른 방법은 문제 파일을 모두 삭제하고, 커밋 한 후 다시 하나 하나 생성하는 것입니다. 이러한 경험을 통해 컨벤션을 지키는 것이 얼마나 중요한 지 깨닫는 시간이 되길 바랍니다. 🤔

SeoMiYoung commented 1 year ago

컨벤션을 지키는 것을 명심하겠습니다 ㅠㅠ!!

야무쌤께서 mv를 통해 파일명을 변경하는 방식의 예시를 보여주신건, src/pages/Home/MainModal/@recoil/MainModalState.js 이런식으로 경로를 쭉 서술했는데, 만약에 git 명령어인 cd를 통해서, 해당 파일명의 위치까지 이동을 한 뒤에 mv를 쓴다면, 굳이 경로를 일일히 써 줄 필요는 없는거죠??

yamoo9 commented 1 year ago

컨벤션을 지키는 것을 명심하겠습니다 ㅠㅠ!!

야무쌤께서 mv를 통해 파일명을 변경하는 방식의 예시를 보여주신건, src/pages/Home/MainModal/@recoil/MainModalState.js 이런식으로 경로를 쭉 서술했는데, 만약에 git 명령어인 cd를 통해서, 해당 파일명의 위치까지 이동을 한 뒤에 mv를 쓴다면, 굳이 경로를 일일히 써 줄 필요는 없는거죠??

네 미영님 🙂 git 파일이나 폴더 이름 변경 (git rename file or folder) 문서를 참고해서 진행해보세요.

SeoMiYoung commented 1 year ago

야무쌤 답변 감사합니다.

안내해주신 방법들과 링크를 참고해서 mv를 사용하려고 여러번 시도했으나, image 뭐가 문제되고 있는건지 제대로 이뤄지지 않는 것 같습니다.

그래서 결국 문제파일/폴더를 하나하나 다 삭제 => 다시 커밋 => 다시 생성 => 커밋 이 방법을 사용할까 합니다..

yamoo9 commented 1 year ago

@SeoMiYoung 님 브랜치에서 추적 중인 폴더/파일명을 아래와 같이 rename 할 수 있고 커밋 후에 checout 해볼 수 있을 것 같습니다. 🤔

https://user-images.githubusercontent.com/1850554/231709605-e92709fa-ad57-4e07-83c9-8be4448d0462.mp4

SeoMiYoung commented 1 year ago

확인해주셔서 감사합니다. 그러나, 야무쌤이 보내주신 영상안에는 맨 처음에 Mainmodal 이런상태로 다 되어있지만, 제 로컬에는 이미 대문자로 바뀐 상태 입니다. image image

그래서 그런지
image 이렇게 Mainmodal자체를 찾을 수 없는 것 처럼 보입니다..

yamoo9 commented 1 year ago

답변에서 시연한 mainmodal 디렉토리 파일 이름 변경은 이전 Commit 시점(✨ [feat] 비밀글로 설정하기에 포커스 가능하게 하기)으로 복구(git reset --hard) 한 후 촬영한 것인데요. 이후 작업한 내용에 큰 문제가 없다면 "✨ [feat] 장바구니 상품 삭제를 경고창 연결시키기" 부분 코드를 백업한 후, 이전 시점으로 복구한 다음 다시 시도해볼 수 있을 것 같습니다. (⚠️ 백업 주의)

SeoMiYoung commented 1 year ago

지금 야무쌤께서 바로 위에 올려주신 사진중에서 Merge pull request LikeLion-FE-React-Project04#230 from SeoMiYoung/feat/ ... 의 커밋번호로 git reset --hard 커밋번호 로 돌아간 상태입니다.

제가 방금 한 일들을 설명하자면, [1] git reset --hard 돌아가고자 하는 커밋번호입력 그래서 다음 사진 상태처럼 돌아갔습니다. image

[2] Mainmodal.jsx => MainModal.jsx 로 코드 수정 후, 다음 명령어 입력, 그러나 에러가 발생 image

2) 이상한 점 발견 MainModal 폴더가 블러처리가 되어있는 점 image

yamoo9 commented 1 year ago

아래 오류 문구로 보아 이름 변경(rename) 대상이 존재한다고 알려 줍니다.

fatal: destination exists

제가 테스트한 환경은 git clone 명령을 사용해 project-repo#212를 복사한 것이므로 미영님의 개발 환경에서는 중간에 존재하지 않는 다른 이름으로 변경한 후 다시 변경해야 할 듯 합니다.

⚠️ Git mv 문서를 보면 -f 옵션을 사용해 대상이 존재하더라도 강제로 이름을 변경할 수 있다고 안내 하긴 합니다. 아래 과정에 번거롭다면 강제(force) 이름 변경 옵션을 시도해볼 수도 있을 것 같습니다.

아래 내용은 이전 답변에서 기술 되었던 부분을 재구성한 것입니다. 직접 테스트 할 수 없다보니 유추된 상황으로 답변을 달고 있습니다. 여러 방면의 가능성을 열어두고 문제를 풀어봅시다. 🤔

Git 설정을 아래와 같이 변경해 대소문자를 구분하도록 설정합니다.

git config core.ignorecase false

Git 커밋 과정에서 캐시 오류를 출력하는 경우 아래 명령을 입력 실행합니다.

git rm -r --cached .
git add . && git commit -m "Git 캐시 삭제"

문제 파일의 이름을 변경합니다. Git mv 명령을 사용해 이름을 변경하면 배포 과정에서 오류가 발생하지 않습니다.

# 문제 이름 → 임시 이름으로 변경
git mv src/pages/Home/Mainmodal/Mainmodal.jsx src/pages/Home/MainModal/MainModal.temp.jsx
# 임시 이름 → 컨벤션 이름으로 변경
git mv src/pages/Home/MainModal/MainModal.temp.jsx src/pages/Home/MainModal/MainModal.jsx

Git 커밋 이력을 추가합니다.

git add . && git commit -m "Mainmodal → MainModal 이름 변경"

Git 체크아웃 명령을 시도 해봅니다.

yamoo9 commented 1 year ago

Git mv case sensitivity 문서를 읽어보면 다음과 같이 안내하는데 참고가 되셨으면 좋겠습니다. 🤔

Git mv case sensitivity

Git mv 명령의 멋진 기능 중 하나는 대소문자로 특정 파일 이름을 바꾸는 기능입니다. 카멜케이스(camelCase)와 같은 네이밍 컨벤션을 사용하는 사용자에게는 대소문자 기본 설정에 맞게 프로젝트 디렉토리의 파일을 정리하는 데 유용할 수 있습니다.

One more cool feature of Git's mv command is the ability to rename files with specific casing. For those of us who tend to stick with specific naming conventions such as camelCase, this can come in handy for cleaning up files in a project directory to suit your casing preference.

simplefile2.ext를 카멜케이스로 변경하고 어떤 일이 발생하는지 살펴보겠습니다.

Let’s try changing simplefile2.ext to camel case and see what happens:

git mv simplefile2.ext simpleFile2.ext 

git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    renamed:    simplefile2.ext -> simpleFile2.ext

나이스! 케이스 변경이 잠겨 있고 로드되어 git 커밋을 할 준비가 되었습니다. mv 명령 과 비교하면 git mv 명령이 더 간편합니다. mv 명령으로 처리하기 번거로운 부분을 git mv 명령이 수월하게 만들어줍니다.

Nice! Our case change is locked and loaded and ready for a git commit. Compared with an mv command, this is excellent. The mv by itself not only lacks the ability to stage our changes, it’s also unwilling to entertain our casing quirks. The git mv is certainly the way to go.