Git은 파일 이름이 아닌 파일 내용을 추적합니다. 따라서 내용을 변경하지 않고 파일의 이름을 바꾸는 것은 git이 감지하기 쉽습니다. (힘내 추적하지 않고, 수행은 검출 , 사용 git mv또는 git rm과 git add. 효과적으로 동일)
파일이 저장소에 추가되면 파일 이름은 트리 개체에 있습니다. 실제 파일 콘텐츠는 저장소에 이진 대형 개체 ( blob ) 로 추가됩니다 . Git은 동일한 콘텐츠를 포함하는 추가 파일에 대해 다른 Blob을 추가하지 않습니다. 실제로 Git은 콘텐츠가 파일 시스템에 저장되기 때문에 해시의 처음 두 문자는 디렉토리 이름이고 나머지는 그 안에있는 파일 이름입니다. 따라서 이름 바꾸기를 감지하는 것은 해시를 비교하는 문제입니다.
이름이 변경된 파일의 작은 변경 사항을 감지하기 위해 Git은 특정 알고리즘과 임계 값 제한을 사용하여 이름이 변경되었는지 확인합니다. 예를 들어에 대한 -M플래그를 살펴보십시오 git diff. merge.renameLimit(병합 중에 이름 바꾸기 감지를 수행 할 때 고려할 파일 수) 와 같은 구성 값도 있습니다 .
git이 유사한 파일을 처리하는 방법 (즉, 이름 변경으로 간주되는 파일 변환) 을 이해하려면 위에서 언급 한대로 사용 가능한 구성 옵션과 플래그를 탐색하십시오. 방법을 고려할 필요는 없습니다. git이 실제로 이러한 작업을 수행하는 방법을 이해하려면 텍스트의 차이점을 찾는 알고리즘을 살펴보고 git 소스 코드를 읽어보십시오.
알고리즘은 diff, merge 및 log 목적으로 만 적용되며 git이 저장하는 방법에는 영향을주지 않습니다. 파일 내용이 조금만 변경되면 새 개체가 추가됩니다. 해당 수준에서 발생하는 델타 또는 차이가 없습니다. 물론 나중에 델타가 팩 파일에 저장되는 위치에 객체가 압축 될 수 있지만 이는 이름 변경 감지와 관련이 없습니다.