git reflog와 log의 차이점은 무엇입니까?


158

매뉴얼 페이지에 log는 커밋 로그를 보여주고 reflog는 reflog 정보를 관리한다고 말합니다. Reflog 정보 란 정확히 무엇이며 로그에없는 정보는 무엇입니까? 로그가 훨씬 더 자세한 것 같습니다.

답변:


221

git log현재 헤드와 조상을 보여줍니다. 즉, 확약 HEAD 포인트를 인쇄 한 다음 상위, 상위 등을 인쇄합니다. 각 커밋의 부모를 재귀 적으로 찾아서 repo의 조상을 통과합니다.

실제로 일부 커밋에는 부모가 둘 이상 있습니다.보다 대표적인 로그를 보려면와 같은 명령을 사용하십시오 git log --oneline --graph --decorate.

git reflogHEAD의 조상을 전혀 횡단하지 않습니다. reflog는 HEAD가 지적한 커밋의 순서 목록입니다. 리포지토리에 대한 실행 취소 기록입니다. reflog는 저장소 자체의 일부가 아니며 (커밋 자체에 별도로 저장 됨) 푸시, 가져 오기 또는 복제에 포함되지 않습니다. 순전히 로컬입니다.

따로 : reflog를 이해하면 커밋 된 리포지토리에서 데이터를 잃을 수 없습니다. 실수로 이전 커밋으로 재설정하거나 잘못 리베이스하거나 커밋을 시각적으로 "제거"하는 다른 작업을 수행 한 경우 reflog를 사용 git reset --hard하여 이전 상태로 되돌아 간 위치를 확인하여 이전 상태를 복원 할 수 있습니다. 심판은 커밋뿐만 아니라 그 뒤에있는 모든 역사를 암시합니다.


26
주의 사항 : 때로는 재귀 기록 항목이 영구적으로 유지되지 않기 때문에 데이터가 손실 될 수 있습니다. 특정 조건에서 제거됩니다. 이 답변git-refloggit-gc에 대한 문서를 참조하십시오 . 일반적으로 파괴적인 수술이 2 주 전에 이루어지지 않았다면 아마도 안전 할 것입니다.
mcmlxxxvi

@mcmlxxxvi 같은 리포지토리에 대해 두 개의 로컬 폴더가 있는데 두 폴더의 참조 로그를 병합 할 수 있습니까?
Tmx

@ Tmx, 귀하의 사례를 잘 이해하지 못합니다. 동일한 리포지토리에 대해 두 개의 로컬 폴더 가 무엇을 의미 합니까? 동일한 리포지토리의 최신 복제본이 두 개이고 편집 기록을 "병합"하려는 경우 .git/logs/refs/<branch>항목의 형식은입니다 <old_rev> <new_rev> [...] <timestamp> [...]. 타임 스탬프별로 연결 및 정렬을 시도 할 수 있습니다. 그러나 일부 라인 new_rev은 다음 라인 과 일치하지 않을 수 있습니다 old_rev.이 경우 reflog가 유효하지 않은 것으로 보입니다. 그런 다음 시퀀스를 "수정"하기 위해 가짜 항목을 삽입하려고 시도 할 수 있지만 너무 번거 롭습니다.
mcmlxxxvi

62
  • git log 심판 (머리, 태그, 리모컨)에서 액세스 할 수있는 커밋 로그를 보여줍니다
  • git reflog언제든 리포지토리에서 참조되었거나 참조 된 모든 커밋에 대한 기록 입니다.

그 이유 git reflog(A 지역 은 (지점 삭제 등)에 "파괴적인"작업을 수행 할 때 기본적으로 90 일 후에 제거됩니다 녹음)을 사용하는 그 지점에서 참조 된 SHA1을 다시 얻기 위해서이다.
참조 git config:

gc.reflogexpire
gc.<pattern>.reflogexpire

git reflogexpire는이 시간보다 오래된 reflog 항목을 제거합니다. 기본값은 90 일입니다. 중간에
" <pattern>"(예 : " refs/stash")가 있으면 설정이에 일치하는 참조에만 적용됩니다 <pattern>.

안전망

git reflog종종 " 안전망 "이라고합니다

문제가 발생하면 git log가 찾고있는 것을 보여주지 않을 때의 일반적인 조언은 다음과 같습니다.

" 침착하게 사용하십시오git reflog "

침착하게

다시 한 번, reflog는 SHA1의 로컬 레코딩입니다.
반대로 git log: 리포지토리를 업스트림 리포지토리 로 푸시 하면 동일 git log하지만 반드시 같은 것은 아닙니다 git reflog.


14

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 직전에 몇 가지 기본 사항을 얻고 싶습니다.
Noich

2
힘내 로그는 커밋 기록입니다 . Pro Git 서적에서 언급 한 바와 같이 reflog는 참조 (기본적으로 브랜치 포인터 및 HEAD포인터) 및 이들이 가리키는 커밋에 대한 레코드입니다 . 말이 돼? 참고로 logreflog 정보를 표시 할 수도 있지만, 특별한 옵션 플래그를 인수로 전달해야합니다 --walk-reflogs.

3
또한 Git 초보자이므로 Pro Git 책을 읽는 것이 좋습니다. Git에 대해 배운 내용을 대부분 배웠습니다. 1-3 장과 6-6.5 장을 추천합니다. 또한 대화식 및 비 대화식으로 리베이스하는 방법을 배우는 것이 좋습니다.

8

나는 이것에 대해서도 호기심이 많았고 조금 정교하고 요약하고 싶습니다.

  1. git log현재 지점에 대한 모든 커밋 내역을 보여줍니다. 다른 지점을 확인하면 다른 커밋 기록이 표시됩니다. 모든 지점에 대한 기록을 커밋하려면을 입력하십시오 git log --all.

  2. git reflogCupcake가 말한 참조 기록을 보여줍니다. 커밋 또는 체크 아웃 할 때마다 항목이 있습니다. 사용하여 앞뒤로 두 가지 사이에 몇 번 전환 시도 git checkout하고 실행 git reflog각 체크 아웃 후. 매번 상단 항목이 "체크 아웃"항목으로 업데이트되는 것을 볼 수 있습니다. 에 이러한 유형의 항목이 표시되지 않습니다 git log.

참고 문헌 : http://www.lornajane.net/posts/2014/git-log-all-branches


1

git log와 reflog의 차이점을 개인 레코드와 공개 레코드의 차이점으로 생각하고 싶습니다.

비공개 대 공개

git reflog를 사용하면 로컬에서 수행 한 모든 것을 추적합니다. 커밋 했습니까? Reflog가 추적합니다. 하드 리셋을 했습니까? Reflog가 추적합니다. 커밋수정 했습니까 ? Reflog가 추적합니다. 로컬에서 수행 한 모든 작업은 참조 기록에 해당 항목이 있습니다.

이것은 로그에 해당되지 않습니다. 커밋을 수정하면 로그에 새 커밋 만 표시됩니다. 재설정을 수행하고 히스토리에서 커밋 몇 개를 건너 뛰면 건너 뛴 커밋이 로그에 표시되지 않습니다. 변경 사항을 다른 개발자 또는 GitHub 또는 이와 유사한 것으로 푸시 하면 로그에서 추적 된 내용 만 나타납니다. 다른 개발자에게는 재설정이 발생하지 않았거나 수정 사항이 발생하지 않은 것처럼 보입니다.

로그가 연마됩니다. 거절은 lapidary입니다.

그래, 나는 '비공개 대 공개'유추를 좋아한다. 또는 더 나은 로그 대 reflog 유추는 '광택 대 lapidary'입니다. reflog는 모든 시행 착오를 보여줍니다. 로그에는 작업 기록의 깨끗하고 세련된 버전이 표시됩니다.

요점을 강조하기 위해이 이미지를보십시오. 저장소가 초기화 된 이후 많은 수정 및 재설정이 발생했습니다. reflog에 모든 내용이 표시됩니다. 그러나 log 명령은 저장소에 대해 단 하나의 커밋이있는 것처럼 보입니다.

로그가 연마됩니다.  Reflog는 lapidary입니다.

'안전망'아이디어로 돌아 가기

또한 reflog는 수정 한 사항을 추적하고 reset을 커밋하므로 커밋 ID를 제공하므로 커밋을 다시 찾아서 찾을 수 있습니다. 리포지토리가 이전 커밋을 제거하지 않았다고 가정하면 더 이상 로그에 표시되지 않는 항목을 부활시킬 수 있습니다. 그것이 reflog가 때때로 실수로 잃어 버렸다고 생각한 것을 되 찾아야 할 때 누군가의 피부를 절약하는 방법입니다.


-6

실제로 reflog는

 git log -g --abbrev-commit --pretty=oneline

답은 다음과 같아야합니다. 특정한 경우입니다.


9
이어 git log, -g에 대한 짧은 형태이다 --walk-reflogs. 그래서 그것은 아무것도 설명하지 않습니다.
Adrian W
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.