개발관련/Git

Git에서 파일 이름 변경 처리

Rateye 2021. 7. 19. 10:07
728x90
반응형

 

질문 : Git에서 파일 이름 변경 처리

Git에서 파일 이름을 바꿀 때 변경 사항을 커밋하고 이름을 바꾼 다음 이름이 바뀐 파일을 준비해야한다고 읽었습니다. Git은 파일을 추적되지 않은 새로운 파일로 보지 않고 내용에서 파일을 인식하고 변경 내역을 유지합니다.

그러나 오늘 밤 이렇게하면 git mv 로 되돌아갔습니다.

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#

Finder의 스타일 시트 이름을 iphone.css 에서 mobile.css .

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    deleted:    css/iphone.css
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#    css/mobile.css

그래서 Git은 이제 하나의 CSS 파일을 삭제하고 새 파일을 추가했다고 생각합니다. 내가 원하는 것이 아닙니다. 이름 변경을 취소하고 Git이 작업을 수행하도록하겠습니다.

> $ git reset HEAD .
Unstaged changes after reset:
M    css/iphone.css
M    index.html

나는 내가 시작한 곳으로 돌아 왔습니다.

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#

대신 git mv 를 사용합시다.

> $ git mv css/iphone.css css/mobile.css
> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    renamed:    css/iphone.css -> css/mobile.css
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    modified:   index.html
#

우리가 좋은 것 같습니다. 그렇다면 왜 내가 Finder를 사용할 때 처음으로 이름 바꾸기를 Git에서 인식하지 못했을까요?

답변

git mv 경우 매뉴얼 페이지에

성공적으로 완료되면 색인이 업데이트됩니다. […]

따라서 처음에는 직접 색인을 업데이트해야합니다 ( git add mobile.css ). 그러나 git status 는 여전히 두 개의 다른 파일을 표시합니다.

$ git status
# On branch master
warning: LF will be replaced by CRLF in index.html
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   index.html
#       new file:   mobile.css
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    iphone.css
#

git commit --dry-run -a 를 실행하여 다른 출력을 얻을 수 있습니다.

Tanascius@H181 /d/temp/blo (master)
$ git commit --dry-run -a
# On branch master
warning: LF will be replaced by CRLF in index.html
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   index.html
#       renamed:    iphone.css -> mobile.css
#

git statusgit commit --dry-run -a 사이에 이러한 차이점이 보이는 이유를 정확히 말할 수는 없지만 여기에 Linus의 힌트가 있습니다 .

git은 내부적으로 전체 "이름 변경 감지"에 대해 신경 쓰지 않으며 이름 변경으로 수행 한 커밋은 이름 변경 을 표시하는 데 사용하는 휴리스틱과는 완전히 독립적입니다.

dry-run 잠시, 실제 이름 바꾸기 메커니즘을 사용하여 git status 아마하지 않습니다.

출처 : https://stackoverflow.com/questions/2641146/handling-file-renames-in-git
728x90
반응형