Git이 내 파일이 최신이라고 잘못 표시하는 이유는 무엇입니까?

Git이 내 파일이 최신이라고 잘못 표시하는 이유는 무엇입니까?

내 파일 디렉터리에는 동일한 Git 저장소에 연결되는 두 개의 폴더(A와 B)가 있습니다.

폴더 A에 이라는 파일을 만들었습니다 index.html. 그런 다음 폴더 B에도라는 다른 파일을 만듭니다. index.html그런 다음 폴더 B에 추가하고 index.html커밋하고 B의 내용을 푸시합니다.

폴더 A에서 파일을 가져오면 Git은 내 파일이 "이미 최신 상태"라고 주장합니다. 그러나 두 폴더에는 분명히 다른 index.html파일이 있습니다. 무슨 일이야?

답변1

git pull의 임무는 fetch새로운 커밋을 수행하고 merge현재 브랜치에 커밋하는 것입니다. 현재 분기가 끌어온 분기에 비해 오래되지 않은 경우 pull은 다음과 같이 말합니다.Already up-to-date. 작업 디렉터리에 로컬 변경 사항이 있는 경우에도. git pull작업 트리가 아닌 가지와 관련이 있습니다. 병합을 방해하는 변경 사항이 있는 경우에만 작업 트리에 대해 설명합니다.

귀하의 설명은 기존에 반대하지 않는 이유를 설명하기에는 충분하지 않지만 git이 변경 사항이 없다고 생각한다는 의미로 index.html받아들여서는 안됩니다 . Already up-to-date.대신 git status요약을 얻으려면 를 사용하십시오.

브랜치의 상태를 이해하거나 git branch -v(각 브랜치의 업스트림 브랜치에 대한 커밋 ID 및 관계 표시) gitk --all모든 커밋을 그래픽으로 보는 데 유용합니다.

답변2

올바르게 이해했다면 다음 스크립트로 문제를 재현해야 합니다.

mkdir 테스트
CD 테스트
git init --bare test.git
git clone test.git a
자식 클론 테스트.git b
에코 a > a/index.html
에코 b > b/index.html
CDB
자식 추가 index.html
git 커밋 -m 추가
git push 오리진 마스터
CD ../a
자식 당겨

마지막 git pull인쇄물:

원격: 개체 계산: 3, 완료되었습니다.
원격: 총 3(델타 0), 재사용 0(델타 0)
개체 포장 풀기: 100%(3/3), 완료되었습니다.
/home/cyrus/tmp/test/test에서
 * [새 브랜치] 마스터 -> 오리진/마스터

그리고 의 내용은 index.html자동으로 덮어쓰기되었습니다.

사이러스:~/tmp/test/a$ 고양이 index.html

답변3

한 가지만 기억하세요 git-파일이 아닌 콘텐츠를 추적합니다..

내부적으로 저장소가 보관하는 모든 콘텐츠는얼룩어딘가에. 파일로 간주되는 것은 gitBlob을 가리키는 이름으로 간주됩니다. 동일한 내용을 가진 두 개의 파일로 간주되는 것은 git동일한 Blob에 연결된 두 개의 이름으로 간주됩니다. 따라서 Blob이 변경되지 않았으므로 저장소도 변경되지 않았습니다.

git이 파일 시스템처럼(또는 대부분의 다른 버전 제어 시스템처럼) 작동할 것으로 기대하고 있습니다. git실제로는 이 점에서 공간 효율적입니다.그 책이 개념을 꽤 잘 설명합니다. 특히힘내 개체 모델.

답변4

다양한 폴더(또는 파일, 심지어는 알지 못함)가 다양한 개정판을 체크아웃할 수 있는 SVN에 익숙한 것 같습니다.

git에서는 불가능합니다. 커밋 또는 체크아웃(성공적인 끌어오기의 마지막 단계이기도 함)은 현재 있는 폴더와 관계없이 현재 있는 폴더와 관계없이 모든 작업 파일에 적용됩니다.

관련 정보