2015-01-28 9 views
4

git checkout을 실행하면 이전 HEAD과 새로운 HEAD의 병합베이스가 임의로 멀리 떨어져있을 수 있습니다. 순진한 구현은 각 diff를 선형 적으로 적용하는 것이지만 작업은 즉시 실행됩니다.git checkout은 어떻게 구현 되나요?

나는 중간 diff 캐싱을 위해 어떤 종류의 skiplisty로 구현 될지도 모르는 직감을 가지고있다. 그러나 그것은 단지 추측이다.

구현 방법을 아는 사람이 있습니까? 감사! :)

+4

[당신은 Github에 가서 Git의 소스 코드를 볼 수 있습니다.] (https://github.com/git/git/search?l=bash&q=checkout) – Makoto

+0

git is magic, 간단하게 :) –

+1

커밋은 델타를 저장하지 않으며, 나무를 저장합니다. diff를 적용 할 필요가 없습니다. checkout은 파일 만 추출합니다. (팩 파일에 저장된 객체는 일부 델타 압축 풀기가 필요하지만 다른 이야기입니다.) – torek

답변

4

javascript implementation of Git (as an exercise) GitletMary Rose Cook에 체크 아웃이 (원칙적으로) 구현 된 방법에 대한 좋은 예입니다.

  • checkout()ref의 내용을 반영하기 위해 복사 및 HEAD 작업, 인덱스를 변경합니다

    이 단계는하는 체크 아웃 위해 annotated source code

    를 참조하십시오.
    ref은 분기 이름 또는 커밋 해시 일 수 있습니다.

  • 체크 아웃 할 커밋의 해시를 가져옵니다.
  • ref을 찾을 수없는 경우 중단합니다.
  • 체크 아웃 할 해시가 커밋이 아닌 개체를 가리키는 경우 중단합니다.
  • ref가 현재 체크 아웃 된 분기의 이름 인 경우 중단합니다. 머리가 분리되면 중단합니다. ref은 커밋 해시이고 HEAD은 해당 해시를 가리 킵니다.
  • 작업 복사본에서 변경된 파일 목록을 가져옵니다.
    헤드 커밋과 체크 아웃에서 다른 파일 목록을 가져옵니다.
    파일이 두 목록에 모두 나타나면 중단하십시오.
  • 그렇지 않으면 체크 아웃을 수행하십시오.
  • ref이 오브젝트 디렉토리에있는 경우 해시이어야하며이 체크 아웃으로 인해 헤드가 분리됩니다.
  • 현재 커밋과 체크 아웃 커밋 간의 차이점 목록을 가져옵니다. 작업 사본에 기록하십시오.
  • 체크 아웃되고있는 커밋을 HEAD으로 작성하십시오.
    헤드가 분리되면 커밋 해시는 HEAD 파일에 직접 기록됩니다.
    헤드가 분리되지 않으면 체크 아웃되는 분기는 HEAD에 기록됩니다.
  • 체크 아웃중인 커밋의 내용을 인덱스로 설정하십시오.
  • 계산 결과를보고하십시오.

는 다시, (실제 망할 놈의 코드에 비해) 단순화이지만, 체크 아웃이 작동하도록되어 방법에 대한 좋은 아이디어를 제공합니다.

더 많은 경우, GitMinutes #31: Mary Rose Cook on Gitlet 팟 캐스트 에피소드 (Thomas Ferris Nicolaisen)를들을 수 있습니다.