Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 구현
- 토비의스프링
- 이진탐색
- 11723
- 쇠막대기 문제
- 가장먼노드
- 징검다리
- 전화번호 목록
- bitmasking
- 그래프
- 자바
- 스프링프로젝트 시작하기
- @Profile
- 이진검색
- Algorithm
- sope
- 플로이드와샬
- 알고리즘
- Singtone
- 스프링이란
- Java
- 백준
- BinarySearch
- 스프링
- Spring
- 프로그래머스
- 카카오인턴
- 카카오
- Spring이란
- 플로이드워셜
Archives
- Today
- Total
육감적 코딩
[Git 교과서]12장. 고급 기능 본문
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.2 reflog
- 깃은 참조된 모든 refs를 기록합니다.
- 내부적으로 작업한 모든 HEAD 와 브랜치 포인터를 기록합니다.
- 이때 사용된 포인터들의 기록을 reflog 라고 합니다.
12.2.1 참조 기록
- reflog 기록은 reflog 명령어를 사용하여 확인 합니다.
- reflog는 시스템에서 정의한 며칠 간의 기록만 보관합니다.
$ git reflog
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.4 옵션 활용
- 소스 코드의 용량이 크다면 -L 옵션을 사용하여 파일의 특정 영역만 지정할 수 있습니다.
$ git blame -L <시작줄>,<마지막 줄> <파일이름>
옵션
- -e : 사용자 이름 대신 이메일을 출력
- -w : 공백 문자를 무시합니다.
- -M : 같은 파일 내에서 복사나 이동을 감지합니다.
- -C : 다른 파일에서 이동이나 복사된 것을 감지 합니다.
12.4 replace
- replace는 기존 커밋을 다른 커밋인 것처럼 변경하는 기능입니다.
- 오랫동안 작업한 저장소는 수많은 커밋 기록이 쌓입니다.
- replace를 사용하면 커밋이 많은 오래된 저장소를 분리할 수 있습니다.
12.4.2 저장소 분리
- 커밋 5개를 생성.
- 3번째 커밋에 새로운 브랜치 생성
- 새로운 원격 저장소에 새 브랜치 push
12.4.3 저장소 분리
- 가상의 임시 객체 생성
$ echo <커밋메시지> | git commit-tree <대상해시값>^{tree}
- 가상의 임시 객체를 다른 커밋과 리베이스하여 병합.
$ git rebase --onto <생성된임시객체해시값> <대상해시값>
- 분리 작업한 로컬 저장소를 새로운 원격 저장소에 푸시.
12.4.4 저장소 연결
- 분리된 두 저장소를 저장소 하나로 연결해 보겠습니다.
- 나중에 작업한 원격 저장소를 clone 합니다
- 이후 합칠 저장소를 remote 명령어로 등록합니다.
- fatch로 remote 한 원격 저장소를 가져옵니다.
- replace 명령어로 합칩니다.
$ git replace <나중작업저장소> <이전작업저장소>
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 으로 삭제
- 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