codememo

Git에서 HEAD, 작업 트리와 인덱스의 차이점은 무엇입니까?

tipmemo 2023. 4. 28. 20:36
반응형

Git에서 HEAD, 작업 트리와 인덱스의 차이점은 무엇입니까?

Git에서 HEAD, 워킹 트리와 인덱스의 차이점을 누가 알려줄 수 있나요?

제가 알기로는 모두 다른 지점의 이름들입니다.제 추측이 맞습니까?

다음을 찾았습니다.

단일 Git 저장소는 임의 개수의 분기를 추적할 수 있지만 작업 트리는 분기 중 하나("현재" 또는 "체크아웃된" 분기)에만 연결되고 HEAD는 해당 분기를 가리킵니다.

HEAD와 작업 트리가 항상 같다는 뜻입니까?

이러한 주제에 대한 몇 가지 다른 좋은 참고 자료:

워크플로우

저는 인덱스를 체크포인트로 사용합니다.

제가 잘못될 수 있는 변화를 시도하려고 할 때, 즉 개념적으로 까다로운 리팩터링이나 표현 유형 변경과 같이 어떤 방향으로 나아갈 수 있을지 확신할 수 없을 때, 저는 제 작업을 색인으로 체크포인트합니다.

마지막으로 약속한 이후 처음으로 변경한 사항이라면 로컬 저장소를 체크포인트로 사용할 수 있지만, 종종 작은 단계로 구현하는 개념적 변경 사항이 있습니다.
각 단계 후 체크포인트를 수행하고 코드를 테스트한 후 다시 작업할 때까지 커밋을 저장합니다.

주의:

  1. 작업영역은 보고 편집하는 (소스) 파일의 디렉터리 트리입니다.

  2. 인덱스는 단일 대형 이진 파일입니다.<baseOfRepo>/.git/index현재 분기의 모든 파일, sha1 체크섬, 타임스탬프 및 파일 이름을 나열합니다. 파일 복사본이 있는 다른 디렉토리가 아닙니다.

  3. 로컬 리포지토리는 숨겨진 디렉터리입니다(.git)를 objectsrepo에 있는 모든 파일의 모든 버전(로컬 분기 및 원격 분기의 복사본)을 압축된 "블롭" 파일로 포함하는 디렉터리.

위 이미지에 표시된 4개의 '디스크'를 repo 파일의 개별 복사본으로 생각하지 마십시오.

3개 주

기본적으로 Git 커밋에 대한 명명된 참조입니다.참조에는 태그와 헤드의 두 가지 주요 유형이 있습니다.

  • 태그는 v2.6.29와 같이 기록의 특정 지점을 표시하는 고정 참조입니다.
  • 반대로 프로젝트 개발의 현재 위치를 반영하기 위해 항상 헤드가 이동됩니다.

커밋

(참고: Timo Huovinen이 언급했듯이, 이러한 화살표는 커밋이 가리키는 것이 아니라 워크플로우 순서이며, 기본적으로 화살표는 다음과 같습니다.1 -> 2 -> 3 -> 41는 첫 이고 첫번약속고이입니다.4

이제 우리는 프로젝트에서 무슨 일이 일어나고 있는지 압니다.
하지만 바로 여기서 무슨 일이 일어나고 있는지 알기 위해 HEAD라는 특별한 참조가 있습니다.은 두 목적을 합니다: 가지주목수행다니합두을적요두다:▁it▁two니▁serves합수행▁major.

  • 체크아웃할 때 어떤 커밋에서 파일을 가져올지 Git에게 알려줍니다.
  • 당신이 커밋할 때 새로운 커밋을 어디에 두어야 하는지 Git에게 알려줍니다.

을 할 때git checkout ref그것은 가리키고 있습니다.HEAD사용자가 지정한 참조로 이동하여 파일을 추출합니다.을 할 때git commit개체를 새커 개체생현하됩개니다의 이 됩니다.HEAD에.보통.HEAD머리 중 하나를 가리키고 있어서 모든 것이 잘 해결됩니다.

체크아웃

HEAD(현재 분기 또는 현재 분기의 마지막으로 커밋된 상태), 인덱스(일명 스테이징 영역) 및 작업 트리(체크아웃 중인 파일의 상태)의 차이는 Scott Chacon(Creative Commons 라이센스)의 Pro Gitbook "1.3 Git Basics" 장의 "The Three States" 섹션에 설명되어 있습니다.

다음은 이 장의 이미지를 보여줍니다.

로컬 작업 - 작업 디렉토리 대 준비 영역(인덱스) 대 git 저장소(HEAD)

위 이미지 "작업 디렉토리"가 "작업 트리"와 동일한 경우, "준비 영역"은 git "index"의 대체 이름이며 HEAD는 "git 디렉토리(리포지토리)"에서 마지막 커밋을 가리키는 현재 체크아웃된 분기를 가리킵니다.

:git commit -a한 번에 변경 사항을 준비하고 커밋합니다.

작업 트리는 현재 작업 중인 파일에 실제로 있는 트리입니다.

HEAD 는 마지막으로 체크아웃한 분기 또는 커밋에 대한 포인터이며, 이 포인터는 새 커밋의 부모가 됩니다.예를 들어, 당신이 만약에master에 가지, 그다음HEAD을 가리킬 것입니다.master커밋을 할때, 그 커밋은 가 될 입니다.master 키고가고, 리리그.master새 커밋을 가리키도록 업데이트됩니다.

인덱스는 새 커밋이 준비되는 준비 영역입니다.기본적으로 인덱스의 내용은 새 커밋에 들어갈 내용입니다.git commit -a이렇게 하면 Git가 커밋하기 전에 인덱스에 Git가 알고 있는 파일의 모든 변경 사항이 자동으로 추가되므로 작업 트리의 현재 내용이 커밋됩니다.). git add작업 트리의 파일을 인덱스에 추가하거나 업데이트합니다.

작업 트리

작업 트리는 현재 작업 중인 파일입니다.

깃 인덱스

  • git "index"는 git 저장소에 커밋할 파일을 배치하는 위치입니다.

  • 인덱스는 캐시, 디렉터리 캐시, 현재 디렉터리 캐시, 준비 영역, 준비파일이라고도 합니다.

  • Git 저장소에 파일을 "커밋"(체크인)하기 전에 먼저 Git "인덱스"에 파일을 배치해야 합니다.

  • 인덱스가 작업 디렉터리가 아닙니다. 다음과 같은 명령을 입력할 수 있습니다.git status는 작업 인덱스에 를 들어, " " " " " git " " 를 하여 git " 을 확인할 수 있습니다).git add filename명령).

  • 인덱스가 git 저장소가 아닙니다. git 인덱스의 파일은 git commit 명령을 사용한 경우 git 저장소에 커밋할 파일입니다.

이것은 필연적으로 길지만 ProGit 책의 설명을 따르기 쉽습니다.

참고: 참고로 이 책의 7.7장 "Reset Demystified"를 읽을 수 있습니다.

Git as system은 정상적인 작동에서 세 개의 트리를 관리하고 조작합니다.

  • HEAD: 마지막 커밋 스냅샷, 다음 상위 항목
  • 인덱스: 제안된 다음 커밋 스냅샷
  • 작업 디렉터리: 샌드박스

헤드

HEAD는 현재 분기 참조에 대한 포인터이며, 이는 해당 분기에서 수행된 마지막 커밋에 대한 포인터입니다.즉, HEAD가 생성되는 다음 커밋의 상위 항목이 됩니다.HEAD는 일반적으로 해당 분기에 대한 마지막 커밋의 스냅샷이라고 생각하는 것이 가장 간단합니다.

무엇이 들어 있습니까?
스냅샷의 모양을 보려면 저장소의 루트 디렉터리에서 다음을 실행합니다.

                                 git ls-tree -r HEAD

다음과 같은 결과를 초래할 수 있습니다.

                       $ git ls-tree -r HEAD  
                       100644 blob a906cb2a4a904a152... README  
                       100644 blob 8f94139338f9404f2... Rakefile  
                       040000 tree 99f1a6d12cb4b6f19... lib  

색인

Git는 작업 디렉토리에 마지막으로 체크아웃된 모든 파일 내용 목록과 처음 체크아웃되었을 때의 파일 내용을 이 인덱스에 채웁니다.그런 다음 이러한 파일 중 일부를 새 버전의 파일로 바꾸고 git commit은 이 파일을 새 커밋의 트리로 변환합니다.

무엇이 들어 있습니까?
사용하다 git ls-files -s 은 다음과 같은 것을 볼 수 다음과 같은 내용이 표시됩니다.

                 100644 a906cb2a4a904a152e80877d4088654daad0c859 0 README   
                 100644 8f94139338f9404f26296befa88755fc2598c289 0 Rakefile  
                 100644 47c6340d6459e05787f644c2447d2595f5d3a54b 0 lib/simplegit.rb  

작업 디렉터리

파일이 있는 위치이며, 준비 영역(인덱스)에 변경을 커밋한 다음 기록에 변경을 시도할 수 있습니다.

시각화된 샘플

이 세 개의 트리(ProGit 책에서 언급한 대로)가 어떻게 함께 작동하는지 살펴보겠습니다.
Git의 일반적인 워크플로우는 이 세 가지 트리를 조작하여 프로젝트의 스냅샷을 연속적으로 더 나은 상태로 기록하는 것입니다.사진을 : 진사을보십오시이오▁take보.

여기에 이미지 설명 입력

시각화된 이해도를 높이기 위해 이 시나리오를 고려합니다.파일 하나가 들어 있는 새 디렉토리로 이동한다고 가정합니다.이 파일을 v1이라고 합니다.파란색으로 표시되어 있습니다. 중입니다.git init 않은 합니다. HEAD는 Git를 가리킵니다.

여기에 이미지 설명 입력

현재 작업 디렉토리 트리에만 내용이 있습니다.이 합니다. 그래서 우리는git add작업 디렉토리의 내용을 가져와 인덱스에 복사합니다.

여기에 이미지 설명 입력

그럼 도망치는 거지git commit인덱스의 내용을 가져와 영구 스냅샷으로 저장하고, 해당 스냅샷을 가리키는 커밋 개체를 만들고, 해당 커밋을 가리키도록 마스터를 업데이트합니다.

여기에 이미지 설명 입력

우리가 뛰면,git status의 트리가 모두 동일하기 때문변화가 없을 것입니다.

아름다운 점

git 상태는 다음과 같은 방식으로 이러한 트리 간의 차이를 보여줍니다.

  • Tree가 인덱스와 index를 사용합니다.git status커밋을 위해 준비되지 않은 일부 변경 사항이 표시됩니다.
  • 에는 작업트와인동덱일경다 HEAD를우만,git status결과에서 커밋할 변경 섹션 아래에 일부 파일이 표시됩니다.
  • 작업 트리가 인덱스와 다르고 인덱스가 HEAD와 다를 경우,git status에서는 결과에서 커밋 섹션에 대해 스테이징되지 않은 변경 내용 아래의 일부 파일과 커밋할 변경 내용 아래의 일부 다른 파일을 표시합니다.

더 궁금한 것은

에 대한 참고 사항git reset
바라건대, 방법을 아는 것이reset명령 작업은 이 세 개의 나무의 존재 이면에 있는 이유를 더욱 밝혀줄 것입니다.

resetTime Machine git입니다. 이를 통해 시간을 쉽게 되돌릴 수 있으며 작업할 오래된 스냅샷을 가져올 수 있습니다.이러한 방식으로 HEAD는 시간 여행을 할 수 있는 웜홀입니다.

서로 다른 색상과 버전 번호로 표시되는 단일 파일과 3개의 커밋이 있는 다음 저장소를 생각해 보십시오.

여기에 이미지 설명 입력

나무의 상태는 다음 그림과 같습니다.

여기에 이미지 설명 입력

1단계: 헤드 이동(--소프트):

첫 번째 재설정 작업은 HEAD가 가리키는 위치를 이동하는 것입니다.이는 HEAD 자체를 변경하는 것과는 다릅니다(체크아웃이 하는 일).reset을 선택하면 HEAD가 가리키는 분기가 이동합니다., reset 은 git reset 를 9e5e6a4.master point로 됩니다. 당신이 면시하화에 전화를 한다면,reset와 함께--soft을 변경하지 여기서합니다.index그리고.working directory이제 우리의 레포는 다음과 같습니다.
HEAD입니다. HEAD~HEAD~의 부모입니다.

여기에 이미지 설명 입력

이미지를 다시 보면 명령이 기본적으로 마지막 커밋을 수행하지 않았음을 알 수 있습니다.HEAD와 에, 작트와인리와덱동때 HEAD문에기,git status이제 변경 내용을 커밋할 준비가 된 녹색으로 표시합니다.

2단계: 인덱스 업데이트(--혼합):

이것은 명령의 기본 옵션입니다.

중입니다.reset와 함께--mixed옵션은 HEAD가 현재 가리키는 스냅샷의 내용으로 인덱스를 업데이트하여 작업 디렉터리를 그대로 유지합니다..git status에서는 변경 사항이 커밋을 위해 준비되지 않은 상태로 빨간색으로 표시됩니다.이 옵션은 또한 마지막 커밋을 실행 취소하고 모든 변경 사항을 스테이징 해제합니다.도 전화를 git add아직 명령하지 않았습니다.이제 우리의 레포는 다음과 같습니다.

여기에 이미지 설명 입력

3단계: 작업 디렉토리 업데이트(--hard)

당신이 면시하화에 전화를 한다면,reset와 함께--hardHEAD가 가리키는 스냅샷의 내용을 HEAD, 인덱스 및 Working Directory에 복사합니다.reset --hard 명령을 실행한 후에는 이전 시점으로 돌아가서 그 이후에는 아무것도 하지 않은 것처럼 됩니다. 아래 그림을 참조하십시오.

여기에 이미지 설명 입력

결론

이제 이러한 트리를 더 잘 이해하고 실수로 수행한 작업을 취소하거나 다시 실행할 수 있도록 저장소의 파일을 변경함으로써 이러한 트리가 가져올 수 있는 힘에 대해 잘 이해하기를 바랍니다.

언급URL : https://stackoverflow.com/questions/3689838/whats-the-difference-between-head-working-tree-and-index-in-git

반응형