질문 : 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 status
와 git commit --dry-run -a
사이에 이러한 차이점이 보이는 이유를 정확히 말할 수는 없지만 여기에 Linus의 힌트가 있습니다 .
git은 내부적으로 전체 "이름 변경 감지"에 대해 신경 쓰지 않으며 이름 변경으로 수행 한 커밋은 이름 변경 을 표시하는 데 사용하는 휴리스틱과는 완전히 독립적입니다.
dry-run
잠시, 실제 이름 바꾸기 메커니즘을 사용하여 git status
아마하지 않습니다.
출처 : https://stackoverflow.com/questions/2641146/handling-file-renames-in-git
'개발관련 > Git' 카테고리의 다른 글
Git의 Sign Off 기능 (0) | 2021.07.20 |
---|---|
Git에서 이전 (마지막이 아님) 커밋에 변경된 파일을 추가하는 방법 (0) | 2021.07.19 |
두 개의 Git 저장소를 병합하는 방법 (0) | 2021.07.16 |
Git에서 원격으로 브랜치 이름 바꾸기 (0) | 2021.07.15 |
Git과 Dropbox를 함께 사용하는 방법 (0) | 2021.07.14 |