잃어버린 것을 포함하여 모든 자식 커밋 목록을 가져옵니다.


139

다음과 같은 그래프가 있다고 가정 해 봅시다.

A---B---C---D (master)
     \
      \-E---F (HEAD)

그렇게하면 git log --all --oneline6 개의 커밋을 모두 얻게됩니다.

그러나 그래프가

A---B---C---D (master, HEAD)
     \
      \-E---F

나는 E와 F를 보지 않을 것입니다. git이 지명되지 않은 지점의 커밋을 포함하여 모든 커밋을 말해 줄 수 있습니까?

감사

답변:


63

특히 쉽게-분기의 끝 부분에 대한 포인터를 잃어버린 경우 건초 더미에서 바늘을 찾는 것과 같습니다. 더 이상 참조되지 않는 것으로 보이는 모든 커밋을 찾을 수 있습니다-당신을 위해 git fsck --unreachable이것을 할 것입니다-그러나 git commit --amend당신이 리베이스 한 브랜치에서 오래된 커밋 후에 버린 커밋을 포함합니다 . 한 번에 너무 많은 정보를 얻을 수 있습니다.

따라서 플립 판트 답변은 관심있는 항목을 잃어 버리지 않는 것입니다. 더 심각하게, reflogs는 기본적으로 지난 60 일 동안 사용한 모든 커밋에 대한 참조를 보유합니다. 더 중요한 것은 커밋 무엇인지에 대한 컨텍스트를 제공한다는 것 입니다.


7
1 : 의도적으로 고아가 커 L 사이에 전혀 차이가 없습니다 commit --amend또는 rebase하나의 실수로 분리 된 HEAD와 협력하여 고아는 말한다.
Cascabel

3
과연. 아마도 그 상황에서 회복하는 가장 쉬운 방법은 HEAD 자체에 대한 참조를 보는 것입니다.
araqnid

@ Jefromi : git commit --amend막 다른 길을 떠나서 커밋을 잃어 버리는 등의 좋은 지적 . 나는 약간의 rebasing과 아무것도하지 않았고 어떤 지점에서 도달 할 수없는 커밋으로 끝났고 repo에 남겨 두는 것이 더럽습니다. 이제 생각은 더 이상 불안해하지 않습니다. :)
Emil Lundberg

2
@araqnid 나는 원래 포스터와 같은 피클에 자신을 가지고 있었고, reflog를 보라는 당신의 제안은 할 일이었습니다.
Ignazio

7
나는이 답변에 동의하지만 고의적이든 우발적이든 고아를 포함하여 모든 커밋을 볼 필요가있는 경우이를 git fsck --unreachable제공하지 않습니다. 방금 시도했습니다. kenorb가 대답 한 것처럼 더 나은 방법은 --reflog옵션입니다 . 이것에 대해 특히 좋은 점은와 결합 하면 원래 질문에 설명 된 것과 같이 시각적 컨텍스트를 쉽게 파싱 할 수 있다는 것입니다. 예를 들어, 다음을 시도하십시오.git log--graphgit log --graph --all --oneline --reflog
Inigo

111

시험:

git log --reflog

여기에는 reflogs ( git reflog)로 언급 된 모든 객체 가 명령 줄에로 표시 되는 것처럼 가장하여 모든 git 커밋 이 나열됩니다 <commit>.


1
이것이 제가 찾던 것입니다 --reflog 인수의 기능.
Anomaly

3
Btw, gitk는 다음도 지원합니다 : gitk --reflog.
ald.li

50

이 문제를 해결할 때 다음 명령을 사용합니다.

git reflog |  awk '{ print $1 }' | xargs gitk

이를 통해 헤드가없는 최근 커밋을 시각화 할 수 있습니다.

이 스크립트 도우미에 싸여 ~/bin/git-reflog-gitk있습니다.


1
이것은 단지 큰 시간을 절약했습니다 ... 감사합니다!
Bret Royster

대단해! 감사합니다! 실제로 나무의 중요한 부분을 시각화합니다.
Mladen B.

팁 : 이것은 로컬 작업에 대한 참조 기록으로 만 작동합니다 when the tips of branches and other references were updated in the *local repository*. git log --reflog로컬이 아닌 참조 변경을 위해이 작업을 수행 하려는 경우 사용할 수 있습니다.
Krishna Gupta

29

내 생명을 구한 것은 다음 명령이었습니다.

git reflog

거기에 다음과 같이 git에 커밋 히스토리 커밋이있는 화면이 있습니다.

여기에 이미지 설명을 입력하십시오

이 시점에서 HEAD@{X}필요한 것을 찾아서 임시 브랜치를 생성하고 다음과 같이 이동하면됩니다.

git checkout -b temp_branch HEAD@{X}

그렇게하면 더 많은 git 저장소를 리베이스하거나 중단하지 않고 커밋이 손실 된 임시 브랜치를 갖게됩니다.

도움이 되었기를 바랍니다...


26

@Kieran의 답변과 같지만 콘솔의 경우 : git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')


마지막 부분을 포함해야합니까 : $ (git reflog | awk '{print $ 1}')? 이것은 무엇을 하는가? 솔루션을 시도한 후에는 마지막 부분이 없어도 동일한 출력을 생성하는 것처럼 보입니다.
5

분기 포인터를 이동하고 OP와 같은 참조가없는 커밋을 남겨두면 더 이상에 표시되지 않습니다 git log --all. 간단한 예 : git reset --hard @^HEAD @ {0} 커밋 후 참조 로그에만 포함되며 git reflog지원하지 않으므로 시각적 표현을 얻기 위해 --graph커밋을 전달해야합니다 git log --graph.
Florian Fida

5
--reflog대신 사용할 수 있습니다$(git reflog | awk '{print $1}')
Sild

나는 비교 git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')하기 위해 git log --oneline --all --graph --decorate --reflog, 그들은 --reflog는 WIP의 항목으로 세부 사항을 포함 제외하고는 거의 동일입니다.
Script Wolf

@FlorianFida 대신에 refloglog --reflog대신 사용 하지 않습니까?
Pacerier

9

이 문제를 어떻게 해결합니까? 사용 git fsck및 로깅!

먼저 손실 된 (연결 불가능한) 커밋 및 블롭이 포함 된 파일을 만듭니다. (참고 : 만약 당신이 같은 것을 git gc한다면 그것은 그들이 저지른 모든 것을 가비지하게 될 것이고 여기서 찾을 수 없을 것입니다!)

$git fsck --lost-found > lost_found.commits

그러면 다음과 같은 파일이 제공됩니다.

매달려 dec2c5e72a81ef06963397a49c4b068540fc0dc3 커밋
매달려 방울 f8c2579e6cbfe022f08345fa7553feb08d60a975
매다는 방울 0eb3e86dc112332ceadf9bc826c49bd371acc194
매다는 방울 11cbd8eba79e01f4fd7f496b1750953146a09502
매달려 커밋 18733e44097d2c7a800650cea442febc5344f9b3
매달려 방울 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05을

그런 다음 즐겨 사용하는 텍스트 편집기로이 파일을 열어 커밋 / 블로그 해시를 복사 할 수 있습니다. (* 기침 * 정력 매크로이 * 위대한 작품 기침 *)

이제이 커밋에서와 같은 것으로 다시 로그인 할 수 있습니다 git log --oneline <commit hash>. 또는 gitk, tig 또는 다른 git viewer가 작동해야합니다.

커밋 F에 대한 해시를 찾으면 로그에 다음과 같은 내용이 표시됩니다.

A---B---E---F

빠르고 쉬운! 이제 매달린 커밋의 모든 배경을 찾을 수 있습니다.

추신 : 네, 늦게 알고 있지만, 오, 누군가 여기에서 찾아서 유용하다고 생각할 수도 있습니다. (내가 이것을 다시 구글로했을 때 6 개월 안에 아마 나일 것이다)


5

에있는 reflog를 보면서 커밋을 복구하는 행운을 빕니다. .git/logs/HEAD

그런 다음 파일 끝까지 뭉개 야했고 방금 잃어버린 커밋을 발견했습니다.


이것은 내가 무언가를 망칠 때 방금 끝난 일입니다. 내가 마스터하려고 노력하고 Stash는 내가 밀 때 짖었다. --hard를 재설정 한 다음 실수를 깨달았습니다. 커밋은 reflog에 있었으므로 확인하고 분기를 만든 다음 푸시했습니다. 모든 것이 결국 끝났습니다.
David

5

git log 때때로 모든 커밋 세부 사항을 얻는 것이 좋지 않기 때문에 이것을 보려면 ...

Mac의 경우 : 프로젝트를 시작하고 다음을 입력하십시오.

$ nano .git/logs/HEAD

모든 커밋을 보거나

$ gedit .git/logs/HEAD

그 모든 커밋을 볼 수 있습니다.

즐겨 찾는 브라우저에서 편집 할 수 있습니다.


3

@bsimmons

git fsck --lost-found | grep commit

그런 다음 각 분기를 만듭니다.

$ git fsck --lost-found | grep commit
Checking object directories: 100% (256/256), done.
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4

$ git branch  branch_2806a3 2806a3
$ git branch  branch_6d0e49 6d0e49
$ git branch  branch_91ca9b 91ca9b

이제 많은 도구가 손실 된 커밋을 그래픽으로 보여줍니다.


2

Git Extensions GUI를 사용하는 경우 "보기-> 참조 로그 참조 표시"를 선택하면 매달려 커밋의 그래픽 시각화를 표시 할 수 있습니다. 이것은 참조 된 다른 모든 커밋과 마찬가지로 트리에 매달려있는 커밋을 보여줍니다. 이렇게하면 원하는 것을 쉽게 찾을 수 있습니다.

데모는 이 이미지 를 참조하십시오 . 이미지에서 커밋 C2, C3, C4 및 C5가 매달려 있지만 여전히 표시됩니다.


2
git log --reflog

나를 구했다! HEAD를 병합하는 동안 잃어 버렸고 늦은 커밋을 찾을 수 없었습니다! 소스 트리에 표시되지 않지만 git log --reflog이전에 모든 로컬 커밋을 표시

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.