커밋 메시지로 Git 저장소를 검색하는 방법은 무엇입니까?


828

커밋 메시지 "Build 0051"을 사용하여 소스 코드를 GIT에 체크인했습니다.

그러나 소스 코드를 더 이상 찾을 수없는 것 같습니다. 명령 줄을 사용하여 GIT 저장소 에서이 소스를 어떻게 추출합니까?

최신 정보

  1. SmartGIT를 사용하여 버전 0043, 0044, 0045 및 0046에서 확인되었습니다.
  2. 0043을 체크 아웃하고 다른 지점에서 0051까지의 버전을 체크인했습니다.
  3. 0043을 다시 확인했습니다.
  4. 이제 0051이 사라졌습니다.

최신 정보

소스 코드는 분명히 존재하지만 이제는 체크 아웃해야합니다.

C:\Source>git log -g --grep="0052"
commit 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
Reflog: HEAD@{10} (unknown <Mike@.(none)>)
Reflog message: commit: 20110819 - 1724 - GL: Intermediate version. File version:  v0.5.0 build 0052.
Author: unknown <Mike@.(none)>
Date:   Fri Aug 19 17:24:51 2011 +0100

    20110819 - 1724 - GL: Intermediate version. File version: v0.5.0 build 0052.

C:\Source>




2
답변은 스택 오버플로의 질문에 속하지 않습니다. 당신은 이것을 알아야 할만큼 오랫동안 기고가였습니다. 자신의 질문에 대한 답변을 제공하고 싶은 경우에는 언제든지 환영합니다 . 또는 shelhamer의 답변을 편집하여 개선 / 확장 할 수 있습니다.
— 코디 그레이

1
@Cody 가끔이 게시물을 참조합니다. 텍스트를 무작위로 삭제할 수는 없습니다. 귀뚜라미가 아닙니다. 삭제하고 싶다면 자신의 답변으로 바꾸는 것이 좋습니다 (그리고 당신은 그것에 대한 약간의 공감대를 얻을 수도 있습니다-당신은 이것이 어떻게 작동하는지 알 수있을만큼 오랫동안 기여자였습니다).
— Contango

답변:


1281

주어진 텍스트에 대한 커밋 로그 (모든 브랜치에서)를 검색하려면 :

git log --all --grep='Build 0051'

저장소의 히스토리를 통해 커밋의 실제 내용을 검색하려면 다음을 사용하십시오.

git grep 'Build 0051' $(git rev-list --all)

주어진 텍스트, 포함하는 파일 이름 및 커밋 sha1의 모든 인스턴스를 표시합니다.

마지막으로 커밋이 매달려 있고 히스토리에 전혀 연결되지 않은 경우 최후의 수단으로 -g플래그를 사용 하여 reflog 자체를 검색 할 수 있습니다 --walk-reflogs.

git log -g --grep='Build 0051'

편집 : 당신이 역사를 잃어버린 것 같으면 reflog안전망으로 확인하십시오 . 에 의해 나열된 커밋 중 하나에서 빌드 0051을 찾으십시오.

git reflog

HEAD'Build 0051'커밋이 보이지 않는 실제 히스토리의 일부로 설정했을 수도 있고 실제로 날려 버렸을 수도 있습니다. 자식 준비 reflog의 기사는 도움이 될 수 있습니다.

reflog에서 커밋을 복구하려면 : 찾은 커밋의 git checkout을 수행하십시오 (선택적으로 참조를 위해 새로운 분기 또는 태그를 작성하십시오)

git checkout 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
# alternative, using reflog (see git-ready link provided)
# git checkout HEAD@{10}
git checkout -b build_0051 # make a new branch with the build_0051 as the tip

2
git grep으로 'Build 0051'$ (git rev-list --all) sh.exe를 얻습니다 ": / bin / git : 잘못된 파일 번호로 변경이 가능합니까?
— Jens Schauder

7
git log -i -grep
— jhvaras

당신이 오류가 발생하면 @JensSchauder git grep 'search' $(git rev-list --all), 시도git rev-list --all | xargs git grep 'search'
— afilina

83

~ / .gitconfig에 넣었습니다.

[alias]
    find = log --pretty=\"format:%Cgreen%H %Cblue%s\" --name-status --grep

그런 다음 "git find string"을 입력하면 메시지에 해당 문자열을 포함하는 모든 커밋 목록이 나타납니다. 예를 들어, 티켓 # 33을 참조하는 모든 커밋을 찾으려면 다음을 수행하십시오.

029a641667d6d92e16deccae7ebdeef792d8336b Added isAttachmentEditable() and isAttachmentViewable() methods. (references #33)
M       library/Dbs/Db/Row/Login.php

a1bccdcd29ed29573d2fb799e2a564b5419af2e2 Add permissions checks for attachments of custom strategies. (references #33).
M       application/controllers/AttachmentController.php

38c8db557e5ec0963a7292aef0220ad1088f518d Fix permissions. (references #33)
M       application/views/scripts/attachment/_row.phtml

041db110859e7259caeffd3fed7a3d7b18a3d564 Fix permissions. (references #33)
M       application/views/scripts/attachment/index.phtml

388df3b4faae50f8a8d8beb85750dd0aa67736ed Added getStrategy() method. (references #33)
M       library/Dbs/Db/Row/Attachment.php

1
멋지지만 컬러 재설정이 누락 되었습니까? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
— Ashley Coolman

4
나는 전체 자식 메시지를 인쇄하는 것을 선호한다 find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. --all및 %b문자를 참고하십시오 . reset팁 은 @AshleyCoolman입니다 .
— arcol

감사. 별칭이 매우 유용하다는 것을 알았습니다. 나는 채색이 마음에 들지 않았고 oneline 형식이 이것에 완벽하다는 것을 알았습니다. 또한 대소 문자를 구분하지 않도록 -i를 추가하면 도움이되었습니다. 예 :find = log --oneline --name-status -i --grep
— robbp

39

조금 늦었지만 :/커밋 메시지를 기반으로 커밋 (또는 개정)을 지정하는 전용 표기법이 있습니다 :/.

git show :/message

다음 <message>은 공백으로 구성된 복잡한 정규식 패턴 일 수 있으므로 필요한 경우 인용 / 탈출해야합니다. 예 :

git log -1 -p ":/a few words"

또는 특정 지점에서 도달 할 수있는 가장 가까운 커밋을 찾기 위해 시작 지점을 지정할 수 있습니다. 예 :

git show 'HEAD^{/fix nasty bug}'

git editions manual 참조하십시오 .


23
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).

19
git log --grep="Build 0051"

트릭을해야합니다


1
작은 따옴표 ( ') 대신 큰 따옴표 ( ")를 사용해야합니다.
— frage

9

이 시도!

git log | grep -b3 "Build 0051"

고마워-하지만 그것을 찾지 못했습니다. 가능한 모든 지점을 어떻게 검색합니까?
— Contango

6
git grep일반 grep 대신 사용하고 --all여러 분기를 검색 하기위한 플래그를 제공 하려고합니다 .
— shelhamer

흠-다른 답변 중 하나를 찾는가? 그렇지 않은 경우 더 큰 문제가있을 수 있습니다. 나는 시도 git log --all --grep='Build 0051'(@shelhamer의 답변)
— Nic

"git log --all"을 시도했는데 0046 버전 만 나열됩니다. 0051 버전은 다른 지점에있었습니다. 0043으로 롤백하고 0051이 사라졌습니다.
— Contango

3
@Gravitas, reflog를 사용하는 예제를 사용해보십시오 git log -g. 재설정시 히스토리가 유실되었을 수 있지만 가비지 수집되지 않은 경우 여전히 reflog를 확인할 수 있습니다.
— shelhamer

4

먼저 git log --oneline커밋 (메시지)의 SHA를 찾는 데 사용 git log --stat 8zad24d한 다음 SHA (첫 번째 커플 sha char 예제 (8zad24d))와 함께 올바른 정보를 찾습니다.


1

이:

git log --oneline --grep='Searched phrase'

아니면 이거:

git log --oneline --name-status --grep='Searched phrase'

명령이 가장 잘 작동합니다.


1

모든 지점을 검색하려면

git log --all --grep='Build 0051'

어느 커밋을 원하는지 알고 나면

git checkout <the commit hash>

1

변경 사항이 너무 오래된 것이 아니라면

git reflog

그런 다음 커밋 ID를 체크 아웃하십시오.

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