커밋 메시지로 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.