답변:
git log
현재 헤드와 조상을 보여줍니다. 즉, 확약 HEAD 포인트를 인쇄 한 다음 상위, 상위 등을 인쇄합니다. 각 커밋의 부모를 재귀 적으로 찾아서 repo의 조상을 통과합니다.
실제로 일부 커밋에는 부모가 둘 이상 있습니다.보다 대표적인 로그를 보려면와 같은 명령을 사용하십시오 git log --oneline --graph --decorate
.
git reflog
HEAD의 조상을 전혀 횡단하지 않습니다. reflog는 HEAD가 지적한 커밋의 순서 목록입니다. 리포지토리에 대한 실행 취소 기록입니다. reflog는 저장소 자체의 일부가 아니며 (커밋 자체에 별도로 저장 됨) 푸시, 가져 오기 또는 복제에 포함되지 않습니다. 순전히 로컬입니다.
따로 : reflog를 이해하면 커밋 된 리포지토리에서 데이터를 잃을 수 없습니다. 실수로 이전 커밋으로 재설정하거나 잘못 리베이스하거나 커밋을 시각적으로 "제거"하는 다른 작업을 수행 한 경우 reflog를 사용 git reset --hard
하여 이전 상태로 되돌아 간 위치를 확인하여 이전 상태를 복원 할 수 있습니다. 심판은 커밋뿐만 아니라 그 뒤에있는 모든 역사를 암시합니다.
.git/logs/refs/<branch>
항목의 형식은입니다 <old_rev> <new_rev> [...] <timestamp> [...]
. 타임 스탬프별로 연결 및 정렬을 시도 할 수 있습니다. 그러나 일부 라인 new_rev
은 다음 라인 과 일치하지 않을 수 있습니다 old_rev
.이 경우 reflog가 유효하지 않은 것으로 보입니다. 그런 다음 시퀀스를 "수정"하기 위해 가짜 항목을 삽입하려고 시도 할 수 있지만 너무 번거 롭습니다.
git log
심판 (머리, 태그, 리모컨)에서 액세스 할 수있는 커밋 로그를 보여줍니다git reflog
언제든 리포지토리에서 참조되었거나 참조 된 모든 커밋에 대한 기록 입니다.그 이유 git reflog
(A 지역 은 (지점 삭제 등)에 "파괴적인"작업을 수행 할 때 기본적으로 90 일 후에 제거됩니다 녹음)을 사용하는 그 지점에서 참조 된 SHA1을 다시 얻기 위해서이다.
참조 git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
expire는이 시간보다 오래된 reflog 항목을 제거합니다. 기본값은 90 일입니다. 중간에
"<pattern>
"(예 : "refs/stash
")가 있으면 설정이에 일치하는 참조에만 적용됩니다<pattern>
.
git reflog
종종 " 안전망 "이라고합니다
문제가 발생하면 git log가 찾고있는 것을 보여주지 않을 때의 일반적인 조언은 다음과 같습니다.
다시 한 번, reflog는 SHA1의 로컬 레코딩입니다.
반대로 git log
: 리포지토리를 업스트림 리포지토리 로 푸시 하면 동일 git log
하지만 반드시 같은 것은 아닙니다 git reflog
.
Pro Git 책에 대한 설명은reflog
다음과 같습니다 .
Git이 퇴근하는 동안 백그라운드에서 수행하는 작업 중 하나는 지난 몇 개월 동안 HEAD 및 지점 참조가 있었던 위치에 대한 기록을 유지하는 것입니다.
다음을 사용하여 Reflog를 볼 수 있습니다
git reflog
.$ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... HEAD@{2}: commit: added some blame and merge stuff 1c36188... HEAD@{3}: rebase -i (squash): updating HEAD 95df984... HEAD@{4}: commit: # This is a combination of two commits. 1c36188... HEAD@{5}: rebase -i (squash): updating HEAD 7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD
어떤 이유로 든 브랜치 팁을 업데이트 할 때마다 Git은이 정보를이 임시 히스토리에 저장합니다. 이 데이터로 이전 커밋을 지정할 수도 있습니다.
reflog
명령은 또한 너무 나이가있는 reflog에서 항목을 항목을 삭제하거나 만료하는 데 사용할 수 있습니다. 로부터 공식 리눅스 커널 힘내 문서reflog
:
부속 명령
expire
은 이전 reflog 항목을 제거하는 데 사용됩니다.reflog에서 단일 항목을 삭제하려면 부속 명령
delete
을 사용하고 정확한 항목을 지정하십시오 (예 :)git reflog delete master@{2}
.
git log
동일한 정보를 제공 하지 않습니까? 그것이 분명해 보인다면 미안하지만, 나는 GIT를 처음 접했고 첫 OMG 직전에 몇 가지 기본 사항을 얻고 싶습니다.
HEAD
포인터) 및 이들이 가리키는 커밋에 대한 레코드입니다 . 말이 돼? 참고로 log
reflog 정보를 표시 할 수도 있지만, 특별한 옵션 플래그를 인수로 전달해야합니다 --walk-reflogs
.
나는 이것에 대해서도 호기심이 많았고 조금 정교하고 요약하고 싶습니다.
git log
현재 지점에 대한 모든 커밋 내역을 보여줍니다. 다른 지점을 확인하면 다른 커밋 기록이 표시됩니다. 모든 지점에 대한 기록을 커밋하려면을 입력하십시오 git log --all
.
git reflog
Cupcake가 말한 참조 기록을 보여줍니다. 커밋 또는 체크 아웃 할 때마다 항목이 있습니다. 사용하여 앞뒤로 두 가지 사이에 몇 번 전환 시도 git checkout
하고 실행 git reflog
각 체크 아웃 후. 매번 상단 항목이 "체크 아웃"항목으로 업데이트되는 것을 볼 수 있습니다. 에 이러한 유형의 항목이 표시되지 않습니다 git log
.
참고 문헌 : http://www.lornajane.net/posts/2014/git-log-all-branches
git log와 reflog의 차이점을 개인 레코드와 공개 레코드의 차이점으로 생각하고 싶습니다.
git reflog를 사용하면 로컬에서 수행 한 모든 것을 추적합니다. 커밋 했습니까? Reflog가 추적합니다. 하드 리셋을 했습니까? Reflog가 추적합니다. 커밋 을 수정 했습니까 ? Reflog가 추적합니다. 로컬에서 수행 한 모든 작업은 참조 기록에 해당 항목이 있습니다.
이것은 로그에 해당되지 않습니다. 커밋을 수정하면 로그에 새 커밋 만 표시됩니다. 재설정을 수행하고 히스토리에서 커밋 몇 개를 건너 뛰면 건너 뛴 커밋이 로그에 표시되지 않습니다. 변경 사항을 다른 개발자 또는 GitHub 또는 이와 유사한 것으로 푸시 하면 로그에서 추적 된 내용 만 나타납니다. 다른 개발자에게는 재설정이 발생하지 않았거나 수정 사항이 발생하지 않은 것처럼 보입니다.
그래, 나는 '비공개 대 공개'유추를 좋아한다. 또는 더 나은 로그 대 reflog 유추는 '광택 대 lapidary'입니다. reflog는 모든 시행 착오를 보여줍니다. 로그에는 작업 기록의 깨끗하고 세련된 버전이 표시됩니다.
요점을 강조하기 위해이 이미지를보십시오. 저장소가 초기화 된 이후 많은 수정 및 재설정이 발생했습니다. reflog에 모든 내용이 표시됩니다. 그러나 log 명령은 저장소에 대해 단 하나의 커밋이있는 것처럼 보입니다.
또한 reflog는 수정 한 사항을 추적하고 reset을 커밋하므로 커밋 ID를 제공하므로 커밋을 다시 찾아서 찾을 수 있습니다. 리포지토리가 이전 커밋을 제거하지 않았다고 가정하면 더 이상 로그에 표시되지 않는 항목을 부활시킬 수 있습니다. 그것이 reflog가 때때로 실수로 잃어 버렸다고 생각한 것을 되 찾아야 할 때 누군가의 피부를 절약하는 방법입니다.
실제로 reflog는
git log -g --abbrev-commit --pretty=oneline
답은 다음과 같아야합니다. 특정한 경우입니다.
git log
, -g
에 대한 짧은 형태이다 --walk-reflogs
. 그래서 그것은 아무것도 설명하지 않습니다.