git reflog와 log의 차이점은 무엇입니까? 매뉴얼 페이지에 log는 커밋 로그를 보여주고 reflog는

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



답변

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

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

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

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


답변

  • 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.


답변

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}.


답변

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

  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


답변

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

비공개 대 공개

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

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

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

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

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

‘안전망’아이디어로 돌아 가기

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


답변

실제로 reflog는

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

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