육감적 코딩

[Git 교과서]12장. 고급 기능 본문

카테고리 없음

[Git 교과서]12장. 고급 기능

감감감감감감 2021. 12. 28. 17:45

12.1 refs

  • 커밋은 고유의 SHA1 해시 값을 가지고있습니다.
  • 깃은 참조하는 해시 값을 refs 목록으로 가지고있습니다.

12.1.2 해시

  • 깃의 동작에있어 해시값은 중요합니다.
  • 생성된 모든 해시값은 show 명령어로 상세 정보를 확인할 수 있습니다.
$ git show <해시값>

12.1.3 역조회

  • 브랜치 이름을 사용하여 참조하는 해시 값을 조회할 수 있습니다.
  • rev-pars 명령어
$ git rev-parse <브랜치이름>

12.1.4 참조 목록

  • 깃에서는 생성된 해시 값을 쉽게 참조할 수 있도록 refs 목록을 생성합니다.
  • 깃의 모든 refs 목록은 저장소의 .git/refs 폴더 안에 저장됩니다.
  • 해시 값의 별칭도 .git/refs 폴더 안에서 생성 및 관리할 수 있습니다.

12-1

12.2 reflog

  • 깃은 참조된 모든 refs를 기록합니다.
  • 내부적으로 작업한 모든 HEAD 와 브랜치 포인터를 기록합니다.
  • 이때 사용된 포인터들의 기록을 reflog 라고 합니다.

12.2.1 참조 기록

  • reflog 기록은 reflog 명령어를 사용하여 확인 합니다.
  • reflog는 시스템에서 정의한 며칠 간의 기록만 보관합니다.
$ git reflog

12-2

12.2.2 기록 확인

  • reflog 기록들은 HEAD@{숫자} 형태입니다.
  • 각 숫자는 수행한 해시 값을 가리킵니다.
  • HEAD@{숫자} 포인터를 이용하여 커밋정보를 확인할 수 있습니다.

12.2.3 기간 확인

  • 커밋의 로그 기록이 많은 경우 필터링할 수 있습니다.
  • 특정 날짜, 시간 등 기준을 적용할 수 있습니다.
  • refs의 로그는 refslog 명령어 또는 git log -g 옵션을 사용하여 확인할 수 있습니다.

12.2.4 기록 유지

  • refs는 현재 로컬 저장소에서 작업한 모든 로그의 참조 기록입니다.
  • 로컬 저장소에만 기록하므로 원격 저장소나 복제, 복사 등으로는 refs 기록을 옮길 수 없습니다.

12.3 파일 애너테이션

  • 잘못된 코드를 찾는 것은 어렵습니다.

12.3.1 blame

  • 잘못된 코드가 어디서부터 시작되었는지 찾기는 어렵습니다.
  • 깃은 이러한 코드를 쉽게 찾을 수 있게 파일의 수정 이력을 분석합니다.
  • blame의 기능은 커밋의 메타정보를 라인별로 출력합니다.
  • 코드를 수정한 사람이 누구인지, 언제 수정한지를 쉽게 판별할 수 있습니다.

12.3.3 blame 명령어

  • blame 명령어는 개별 파일에서만 동작합니다
  • 커밋 해시 값, 작성자, 코드 등을 확인할 수 있습니다.
$ git blame <파일이름>

12-3

12.3.4 옵션 활용

  • 소스 코드의 용량이 크다면 -L 옵션을 사용하여 파일의 특정 영역만 지정할 수 있습니다.
$ git blame -L <시작줄>,<마지막 줄> <파일이름>

옵션

  • -e : 사용자 이름 대신 이메일을 출력
  • -w : 공백 문자를 무시합니다.
  • -M : 같은 파일 내에서 복사나 이동을 감지합니다.
  • -C : 다른 파일에서 이동이나 복사된 것을 감지 합니다.

12.4 replace

  • replace는 기존 커밋을 다른 커밋인 것처럼 변경하는 기능입니다.
  • 오랫동안 작업한 저장소는 수많은 커밋 기록이 쌓입니다.
  • replace를 사용하면 커밋이 많은 오래된 저장소를 분리할 수 있습니다.

12.4.2 저장소 분리

  • 커밋 5개를 생성.
  • 3번째 커밋에 새로운 브랜치 생성
  • 새로운 원격 저장소에 새 브랜치 push

12-4

12.4.3 저장소 분리

  • 가상의 임시 객체 생성
$ echo <커밋메시지> | git commit-tree <대상해시값>^{tree}
  • 가상의 임시 객체를 다른 커밋과 리베이스하여 병합.
$ git rebase --onto <생성된임시객체해시값> <대상해시값>

12-5

  • 분리 작업한 로컬 저장소를 새로운 원격 저장소에 푸시.

12-6

12.4.4 저장소 연결

  • 분리된 두 저장소를 저장소 하나로 연결해 보겠습니다.
  • 나중에 작업한 원격 저장소를 clone 합니다
  • 이후 합칠 저장소를 remote 명령어로 등록합니다.
  • fatch로 remote 한 원격 저장소를 가져옵니다.
  • replace 명령어로 합칩니다.
$ git replace <나중작업저장소> <이전작업저장소>

12-712-8

12.5 가비지 콜렉트

12.5.1 가비지

  • 가비지(garbage)는 동적인 언어에서 메모리를 관리하려고 생성한 개념
  • 깃 이력을 추적할때 객체 생성과 변경을 반복하여 연결고리가 없는 고립된 객체들이 생김
  • 고립된 객체들은 대표적으로 리셋, 리베이스 등을 할 때 발생

12.5.2 압축 관리

  • 파일 변경, 트리 구조, 커밋 등 대부분의 내부 작업은 객체를 생성하고 연결하는 동작
  • 이러한 내부 동작으로 연결고리가 없는 객체가 수없이 생성
  • 이러한 객체를 줄이려고 생성된 객체를 압축
  • 즉, 연결 고리가 없는 객체들은 pack 파일 형태로 압축하여 저장

12.5.3 실행

  • 깃은 내부적으로 가비지 정리가 필요하다고 생각할 때, gc 명령어를 자동으로 실행.
  • gc 명령어는 오래된 객체들은 삭제하고 저장소 용량도 정리
  • 직접 gc 명령어를 실행할 수 있음
$ git gc --auto

12.5.4 refs 압축

  • gc 명령어는 객체의 압축과 refs를 같이 처리
  • refs를 같이 압축하면 압축하기 전의 파일들은 삭제하고 새로운 .git/packed-refs 파일 생성
  • 이후 refs가 추가로 변경되면 압축한 packed-refs 값을 수정하지않고 새로운 refs 파일을 생성
  • 즉, 압축 이후에는 refs 파일이 2개가 되며, refs 파일이 여러 개 있으면 기본적으로 refs 안에 있는 파일을 먼저 검색.

12.5.5 환경 설정

  • gc.reflogExpire : reflog 가 보존되는 기간을 설정. 기본값은 90일
  • gc.reflogExpireUnreachable: 기본값은 30일
  • gc.aggressiveWindow : 창의 크기를 정함. 기본값은 250
  • gc.aggressiveDepth : 압축에 사용되는 매개변수. 기본값은 50
  • gc.pruneExpire : 저장소에 쓰는 다른 프로세스와 동시에 실행될 때 손상을 방지
  • gc.worktreePrunExpire : 유예 기간을 설정

12.6 prune

  • 깃의 gc 명령어는 몇 가지 명령어와 함께 사용함.
  • 그 중 prune 명령어는 고립된 객체를 정리하는 내부 유틸리티

12.6.1 고립된 객체

  • 새로운 변경과 커밋이 있을 때, 기존 객체를 다른객체로 연결.
  • 어떤 객체를 새로운 커밋으로 재설정하면 참조 링크가 해제되는데, 이것은 해당 객체가 더 이상 필요하지 않다는 것.
  • 고립된 객체는 연결 고리가 끊겨 명령어를 사용해도 해당 객체에 접근할 수 없는 객체를 의미
  • 깃 자체적으로 완벽하게 정리하기 어려우므로 수동으로 정리

12.6.3 객체 삭제

  • 두 개의 커밋이후 마지막 커밋을 reset 으로 삭제

12-9

  • log 에도 출력되지 않음.
  • 하지만 커밋을 --hard 옵션을 사용하여 리셋하더라고 내부적으로 생성한 객체를 물리적으로 삭제하지 않음.
  • 삭제한 객체의 해시 값으로 checkout 할 수 있음.
  • 리셋은 단지 객체 연결 고리를 해제하여 끊긴 상태로 처리하며, 이 커밋은 깃 내부 저장소에 고립된 객체로 남아 있음.

12.6.4 객체 정리

  • --dry-run : 실행하지 않고 작업할 내역만 출력
  • --verbose : 작업한 결과를 출력
$ git prune --dry-run --verbose
  • 완전한 삭제
$ git prune --expire now -v

12.6.5 원격 작업

  • 고립된 객체는 원격 저장소에도 있을 수 있음
  • 원격 저장소의 브랜치를 병합 후 삭제.
$ git remote prune 
  • 오래된 브랜치를 정리
  • 원격 저장소에 연결한 후 제거하기 전에 최신 상태를 가져옴
$ git fetch --prune

12.7 rerere

  • 불특정 다수와 협업하다보면 여러가지 문제 발생
  • 깃은 협업 작업을 할 때 발생한 문제들을 충돌이라는 형태로 알려 줌.

12.7.1 동일한 충돌

  • rerere 기능을 활성화하면, 깃은 충돌을 해결할 때마다 해결한 무제의 유형을 기록
  • 기록한 유형의 문제와 비슷한 문제가 향후 다시 발생하면, 미리 기록한 해결 정보를 바탕으로 자동으로 적용.

12.7.2 활성화

  • rerere 기능 활성화
$ git config rerere.enable true
  • 로컬 전체 저장소에 모두 적용하고자 한다면 --global 옵션을 같이 사용.
Comments