Git 11. 고급 기능

한미현·2022년 2월 17일
0

Git

목록 보기
11/12
post-thumbnail

1. refs

  • 해시 값 확인
$ git show 해시값
  • 역조회 : 브랜치는 커밋 해시 값을 가리키는 포인터이기 때문에 브랜치 이름을 사용하여 참조하는 해시 값을 조회할 수 있다.
$ git rev-parse 브랜치이름
  • 참조 목록 : 깃에서는 생성된 해시 값을 쉽게 참조할 수 있도록 refs 목록을 생성한다.
$ ls .git/refs -all // 저장소 refs 파일 목록

$ git branch feature // 브랜치 생성
$ ls ./git/refs/heads -all // 저장소 refs 정보
total 2
drwxr-xr-x 1 infoh 197609  0 8월 19 9:40 .
drwxr-xr-x 1 infoh 197609  0 8월 19 9:32 ..
-rw-r--r-- 1 infoh 197609 41 8월 19 9:40 feature // 브랜치의 HEAD 포인트
-rw-r--r-- 1 infoh 197609 41 8월 19 9:34 master

2. reflog

  • 참조 기록 : 깃은 안정적인 작업을 유지하기 위해 참조된 모든 refs를 기록한다. 그리고 내부적으로 작업한 모든 HEAD와 브랜치 포인터를 기록하는데, 이때 사용된 포인터들의 기록을 reflog라고 한다. 시스템에서 정의한 며칠 간의 기록만 보관하고 그 이전의 작업들은 모두 삭제한다.
$ git reflog
$ git log -g
  • 기록 확인 : HEAD@{숫자} 형태, 숫자는 작업을 수행한 해시 값을 가리킨다.
$ git show HEAD@{0} // 커밋 정보
  • 기간 확인
$ git show master@{yesterday}

3. 파일 애너테이션

  • blame : 깃은 잘못된 내용을 쉽게 찾을 수 있게 수정 이력을 분석한다. 그리고 blame 기능은 커밋의 메타 정보를 코드 라인별로 같이 결합하여 출력한다. 코드를 수정한 사람이 누구인지, 언제 수정한지를 쉽게 판별할 수 있으며, 메타 정보를 바탕으로 문제를 좀 더 쉽게 파악할 수 있다.

옵션

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

// 예시
$ git blame index.html // 메타 정보 출력
034df34 (hanmihyeon 2020-08-19 09:12:12 +0900 1) <h1>hello world</h1>
232ll21 (hanmihyeon 2020-08-19 09:13:12 +0900 2) 깃을 이용하여 코드 이력을 관리할 수 있습니다.
232ll21 (hanmihyeon 2020-08-19 09:13:24 +0900 3) 깃은 ref를 참조하여 작업이 이루어집니다.

$ git blame -L 시작줄, 마지막줄 파일이름

// 예시
$ git blame -L 2,3 index.html // 메타 정보 필터링
232ll21 (hanmihyeon 2020-08-19 09:13:12 +0900 2) 깃을 이용하여 코드 이력을 관리할 수 있습니다.
232ll21 (hanmihyeon 2020-08-19 09:13:24 +0900 3) 깃은 ref를 참조하여 작업이 이루어집니다.

4. replace

  • 기존 커밋을 다른 커밋인 것처럼 변경하는 기능, 커밋이 많은 오래된 저장소를 분리할 수 있다.

5. 가비지 콜렉트

저장소를 효율적으로 유지 관리하기 위해 지원

  • 가비지 : 동적인 언어에서 메모리를 관리하려고 생성한 개념. 깃은 이력을 추적할 때 객체의 생성과 변경을 반복하는데 여러번 처리 동작을 반복하면서 시간이 지남에 따라 연결 고리가 없는 고립된 객체들이 생겨 비효율적인 자원 상태가 된다. 대표적으로 리셋 또는 리베이스 등을 자주 할 때 발생한다.

  • gc : 저수준 명령어, 내부적으로 가비지 정리가 필요하다고 생각할 때, 자동으로 실행한다.

$ git gc --auto

환경 설정

  • gc.reflogExpire: reflog가 보존되는 기간을 설정한다. 기본값 90일
  • gc.reflogExpireUnreachable: 기본값 30일
  • gc.aggressiveWindow: 창의 크기를 정한다. 기본값 250
  • gc.aggressiveDepth: 압축에 사용되는 매개변수. 기본값 50
  • gc.pruneExpire: 저장소에 쓰는 다른 프로세스와 동시에 실행될 때 손상을 방지한다.
  • gc.worktreePruneExpire: 유예 기간을 설정할 수 있다.
    -> gc.auto 항목으로 자동 설정을 허용하지 않을 수도 있고, gc.autopacklimit를 사용하여 최대 압축 숫자를 제어할 수도 있다.

6. prune

  • 고립된 객체를 정리하는 내부 유틸리티

옵션

  • --dry-run : 실행하지 않고 작업할 내역만 출력
  • --verbose : 작업한 결과를 출력
$ git prune --dry-run --verbose // 고립된 객체 삭제
$ git reflog expire --expire=now --expire-unreachable=now --all // reflog 삭제
// 현재를 기준으로 그보다 오래된 모든 reflog는 만료

$ git prune --dry-run --verbose // 객체 삭제 (작업 결과만 미리 보여줌)
$ git prune --expire now -v // 객체 삭제 실행

고립한다는 것은 어떤 명령어로도 해당 객체에 접근할 수 없어야 한다. 깃은 참조된 모든 객체의 연결 고리를 reflog에 이중으로 기록하기 때문에 리셋 명령만으로는 객체와 연결한 모든 고리를 완벽하게 제거할 수 없어 reflog에 기록된 연결 고리 링크도 같이 제거했다. (원래 reflog는 일정 기간이 지나면 자동을 없어지지만, 실습을 위해 제거)

- 원격 작업

$ git remote prune
$ git fetch --prune // 오래된 브랜치 정리

-> 원격 저장소의 브랜치를 병합한 후 삭제한다. 삭제된 원격 저장소 브랜치는 더 이상 참조할 수 없다.

7. rerere

reuse recorded resolution의 약어로, 어떤 문제로 충돌이 발생할 때 이를 기록한다. rerere 기능을 활성화하면, 깃은 충돌을 해결할 때마다 해결한 문제의 유형을 기록한다. 기록한 유형의 문제와 비슷한 문제가 향후 다시 발생한다면, 미리 기록한 해결 정보를 바탕으로 자동으로 적용한다.
-> 병합과 리베이스로 잦은 충돌이 발생하여 이를 좀 더 손쉽게 해결하고 싶을때 유용

  • 활성화
$ git config rerere.enabled true
$ git config --global rerere.enabled true // 로컬 전체 저장소에 모두 적용
  • 충돌 상태 확인
$ git rerere status // 상태 확인
$ git rerere diff // 커밋 비교
  • 자동 해결 : 기존에 기록한 rerere 정보를 참조하여 코드를 자동으로 수정
profile
FE Developer

0개의 댓글