$ 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
$ git reflog
$ git log -g
HEAD@{숫자}
형태, 숫자는 작업을 수행한 해시 값을 가리킨다.$ git show HEAD@{0} // 커밋 정보
$ git show master@{yesterday}
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를 참조하여 작업이 이루어집니다.
replace
저장소를 효율적으로 유지 관리하기 위해 지원
가비지 : 동적인 언어에서 메모리를 관리하려고 생성한 개념. 깃은 이력을 추적할 때 객체의 생성과 변경을 반복하는데 여러번 처리 동작을 반복하면서 시간이 지남에 따라 연결 고리가 없는 고립된 객체들이 생겨 비효율적인 자원 상태가 된다. 대표적으로 리셋 또는 리베이스 등을 자주 할 때 발생한다.
gc
: 저수준 명령어, 내부적으로 가비지 정리가 필요하다고 생각할 때, 자동으로 실행한다.
$ git gc --auto
➰ 환경 설정
gc.reflogExpire
: reflog가 보존되는 기간을 설정한다. 기본값 90일gc.reflogExpireUnreachable
: 기본값 30일gc.aggressiveWindow
: 창의 크기를 정한다. 기본값 250gc.aggressiveDepth
: 압축에 사용되는 매개변수. 기본값 50gc.pruneExpire
: 저장소에 쓰는 다른 프로세스와 동시에 실행될 때 손상을 방지한다.gc.worktreePruneExpire
: 유예 기간을 설정할 수 있다.gc.auto
항목으로 자동 설정을 허용하지 않을 수도 있고, gc.autopacklimit
를 사용하여 최대 압축 숫자를 제어할 수도 있다.➰ 옵션
--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 // 오래된 브랜치 정리
-> 원격 저장소의 브랜치를 병합한 후 삭제한다. 삭제된 원격 저장소 브랜치는 더 이상 참조할 수 없다.
reuse recorded resolution의 약어로, 어떤 문제로 충돌이 발생할 때 이를 기록한다. rerere 기능을 활성화하면, 깃은 충돌을 해결할 때마다 해결한 문제의 유형을 기록한다. 기록한 유형의 문제와 비슷한 문제가 향후 다시 발생한다면, 미리 기록한 해결 정보를 바탕으로 자동으로 적용한다.
-> 병합과 리베이스로 잦은 충돌이 발생하여 이를 좀 더 손쉽게 해결하고 싶을때 유용
$ git config rerere.enabled true
$ git config --global rerere.enabled true // 로컬 전체 저장소에 모두 적용
$ git rerere status // 상태 확인
$ git rerere diff // 커밋 비교