2012-03-01 2 views
3

git status이 로컬 폴더에 변경 사항이 있는지 확인하면 정확히 어떻게됩니까?"git status"뒤에있는 Git의 기술과 논리

내가 아는 한, 모든 파일은 해시 코드 (정확히는 sha1)를 통해 "등록"되어 있으며 git status "단순히"계산 된 즉시 해시로 일치하는 등록 된 해시를 찾습니다. 다른 상태 변화로 간주됩니다. 나는이 점에 대해 솔직히 확신하지 못한다. 내가 잘못하면 나는 바로 잡고 싶다. 어쨌든 몇 가지 질문이 생깁니다 :

  1. 어디에서 해시를 찾을 수 있습니까? Repo 특정 항목에는 많은 해시가 있지만 각 파일의 등록 된 해시가 정확히 어디에 있습니까? 다음 명령 중 하나가 실행되는 경우 이러한 해시와 어떻게됩니까
  2. : git add, git commit -am, git gc

답변

5

이것을 이해하려면 먼저 SHA1 해시로 식별되는 모든 저장소 인 git 저장소를 이해해야합니다. 그것들은 커밋, 나무 및 얼룩입니다.

커밋은 커밋 메시지, 커미터, 날짜, 상위 커밋의 SHA1과 트리의 SHA1 (일부 추가 정보 포함)을 포함합니다.

트리는 디렉토리를 나타냅니다. 여기에는 포함 된 파일 및 디렉토리의 이름 (및 기타 메타 데이터)이 들어 있습니다. 각 파일에는 해당 blob의 SHA1도 포함되어 있으며 각 트리에는 다른 트리의 SHA1이 들어 있습니다.

Blob은 이름이나 기타 메타 데이터없이 파일의 내용을 나타냅니다. (일반적으로 최신 현재 지점에 커밋 HEAD) 커밋 현재에 속하는

  1. 한 :

    지금, git status 세 가지 나무를 비교합니다.

  2. 스테이징 영역에있는 하나. 여기서 파일은 git add 뒤에 있으며 실제로 커밋하기 전에 커밋을 준비하는 데 사용됩니다.
  3. 작업 트리. 이 디렉토리가 현재 디스크에서 어떻게 보이는지.

이 당신이 파일 (예를 들어, a.txt이), git add를 편집하는 경우, 당신이 얻을 좀 더 편집하고 git status를 사용하는 이유는이 같은 출력 : 이제

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: a.txt 
# 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: a.txt 
# 

실제 질문 :

어디에서 해시를 찾을 수 있습니까? Repo 특정 항목에는 많은 해시가 있지만 각 파일의 등록 된 해시가 정확히 어디에 있습니까?

이들은 트리 개체에 저장됩니다.예를 커밋 (HEAD를) 현재의 트리 객체를 참조하려면, git ls-tree HEAD를 사용

$ git ls-tree HEAD 
100644 blob 9c59e24b8393179a5d712de4f990178df5734d99 a.txt 

당신은 REPO의 루트 디렉토리가 9c59e24b8393179a5d712de4f990178df5734d99의 SHA1으로해서 a.txt라는 하나 개의 파일 (blob)이 포함되어 있음을 볼 수있다 .

동일한 명령을 사용하여 해당 하위 디렉토리의 하위 디렉토리 및 파일의 SHA1을 볼 수 있습니다. 자세한 내용은 명령의 설명서를 참조하십시오.

디스크의 일부 파일의 SHA1을 계산하려면 git hash-object을 사용할 수 있습니다. 다음 명령 중 하나가

당신은 SHA1s이 객체의 내용을 기반으로 있음을 유의을 실행할 경우 이러한 해시와 어떻게됩니까

. 그리고 각 객체는 완전히 변경 불가능하므로 일부 객체의 SHA1은 절대로 변경되지 않습니다. 그러나 많은 연산은 새로운 객체를 생성 할 수 있으며, 예를 들어 어떤 분기 점이 어떤 객체로 변경 될 수 있습니다.

  • git add 스테이징 영역 트리 걸리는 명령의 파라미터에 따라 일부 파일을 추가하거나 변경하여 수정하고 다시 스테이징 영역에 변성 트리를 저장한다.
  • git commit은 준비 영역에서 트리를 가져와 해당 트리를 가리키는 커밋을 만듭니다. 새로운 커밋에는 현재 날짜가 있고, 커미터로, 현재 커밋이 부모로 있습니다. 그런 다음 명령은 현재 분기를 새로운 커밋을 가리 키도록 변경합니다.
  • git commit -agit add에 대한 바로 가기이고 그 뒤에는 git commit이옵니다.
  • git gc은 저장소에있는 모든 개체를보고 연결할 수없는 개체를 삭제합니다. Reachable 객체는 모든 브랜치의 팁, 태그 또는 현재 커밋뿐만 아니라 반복적으로 참조하는 모든 객체입니다. 최근에 사용 된 커밋 (및 커밋 된 객체)은 reflog를 통해 접근 할 수 있기 때문에 삭제되지 않습니다.
2

이동은 progit 전자 책의 chapter 9.2를 참조하십시오.

전체 전자 책은 읽을만한 가치가 있습니다.

관련 문제