Làm thế nào để tìm kiếm một kho lưu trữ Git bằng thông điệp cam kết?


828

Tôi đã kiểm tra một số mã nguồn vào GIT với thông báo cam kết "Build 0051".

Tuy nhiên, dường như tôi không thể tìm thấy mã nguồn đó nữa - làm cách nào để trích xuất nguồn này từ kho GIT, sử dụng dòng lệnh?

Cập nhật

  1. Đã kiểm tra các phiên bản 0043, 0044, 0045 và 0046 bằng SmartGIT.
  2. Đã kiểm tra 0043 và kiểm tra các phiên bản lên đến 0051 trên một nhánh khác.
  3. Đã kiểm tra 0043 một lần nữa.
  4. Bây giờ, 0051 đã biến mất.

Cập nhật

Mã nguồn chắc chắn là có, bây giờ vấn đề là kiểm tra nó:

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
Câu trả lời không thuộc về câu hỏi trên Stack Overflow. Bạn đã là một người đóng góp đủ lâu để bạn nên biết điều này. Nếu bạn muốn cung cấp câu trả lời cho câu hỏi của riêng bạn, bạn chắc chắn rất sẵn lòng làm . Ngoài ra, bạn có thể chỉnh sửa câu trả lời của Shelhamer để cải thiện / mở rộng nó.
Cody Grey

1
@Cody Tôi thỉnh thoảng nhắc đến bài này. Bạn không thể xóa ngẫu nhiên văn bản, đó không phải là dế. Nếu bạn muốn xóa nó, chắc chắn bạn có thể chuyển nó thành câu trả lời của riêng bạn (và thậm chí bạn có thể nhận được một số ưu đãi cho nó - bạn đã là người đóng góp đủ lâu để biết cách thức hoạt động của nó).
Contango

Câu trả lời:


1284

Để tìm kiếm nhật ký cam kết (trên tất cả các chi nhánh) cho văn bản đã cho:

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

Để tìm kiếm nội dung thực tế của các cam kết thông qua lịch sử của repo, hãy sử dụng:

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

để hiển thị tất cả các phiên bản của văn bản đã cho, tên tệp chứa và cam kết sha1.

Cuối cùng, như là phương sách cuối cùng trong trường hợp cam kết của bạn bị treo lủng lẳng và hoàn toàn không được kết nối với lịch sử, bạn có thể tìm kiếm bản reflog bằng -gcờ (viết tắt của --walk-reflogs:

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

EDIT: nếu bạn dường như đã mất lịch sử, hãy kiểm tra reflogmạng lưới an toàn của bạn. Tìm Build 0051 trong một trong những cam kết được liệt kê bởi

git reflog

Bạn có thể chỉ đơn giản là đặt HEADmột phần của lịch sử trong đó không thể hiển thị cam kết 'Build 0051' hoặc bạn có thể thực sự thổi bay nó đi. Các reflog git-ready bài viết có thể giúp đỡ.

Để khôi phục cam kết của bạn từ reflog : hãy kiểm tra git của cam kết bạn đã tìm thấy (và tùy ý tạo một nhánh hoặc thẻ mới của nó để tham khảo)

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
với git grep 'Build 0051' $ (git rev-list --all) Tôi nhận được sh.exe ": / bin / git: Số tập tin xấu có cách nào để thay đổi điều này có thể?
Jens Schauder

7
git log -i -grep
jhvaras

@JensSchauder Nếu bạn gặp lỗi với git grep 'search' $(git rev-list --all), hãy thửgit rev-list --all | xargs git grep 'search'
afilina

83

Tôi đặt cái này trong ~ / .gitconfig:

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

Sau đó, tôi có thể gõ "git find chuỗi" và tôi nhận được một danh sách tất cả các cam kết có chứa chuỗi đó trong tin nhắn. Ví dụ: để tìm tất cả các cam kết vé tham chiếu số 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
Đẹp, nhưng có lẽ thiếu một thiết lập lại màu sắc? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Ashley Coolman

4
Tôi thích in thông điệp git đầy đủ (grep có thể xảy ra ở đó, không phải trong tiêu đề), vì vậy tôi đã kết thúc với : find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Lưu ý --all%bký tự. Thx @AshleyCoolman cho tiền resetboa.
arcol

Cảm ơn. Tôi thấy bí danh rất hữu ích. Tôi không thích tô màu và thấy định dạng oneline hoàn hảo cho việc này. Ngoài ra, thêm -i để làm cho nó không phân biệt chữ hoa chữ thường là hữu ích. ví dụfind = log --oneline --name-status -i --grep
robbp

39

Mặc dù hơi muộn, nhưng :/đó là ký hiệu dành riêng để chỉ định một cam kết (hoặc sửa đổi) dựa trên thông điệp cam kết, chỉ cần tiền tố chuỗi tìm kiếm với :/, ví dụ:

git show :/message

Ở đây <message>có thể là một mẫu biểu thức chính phức tạp bao gồm các khoảng trắng, vì vậy vui lòng đảm bảo trích dẫn / thoát khi cần thiết, ví dụ:

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

Ngoài ra, một điểm bắt đầu có thể được chỉ định, để tìm cam kết gần nhất có thể tiếp cận từ một điểm cụ thể, ví dụ:

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

Xem: hướng dẫn sửa đổi git .


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"

nên làm mánh khóe


1
Phải sử dụng dấu ngoặc kép (") thay vì dấu ngoặc đơn (').
frage

9

Thử cái này!

git log | grep -b3 "Build 0051"

Cảm ơn - nhưng nó không tìm thấy nó. Làm thế nào để tôi tìm kiếm trên tất cả các chi nhánh có thể?
Contango

6
Bạn muốn sử dụng git grepthay vì grep bình thường và cung cấp --allcờ để tìm kiếm nhiều nhánh.
Shelhamer

Hmm - là những câu trả lời khác tìm thấy nó? Nếu không, bạn có thể có một vấn đề lớn hơn. Tôi sẽ thử git log --all --grep='Build 0051'(câu trả lời của @ Shelhamer)
Nic

Tôi đã thử "git log --all" và nó chỉ liệt kê các phiên bản thành 0046. Phiên bản 0051 nằm trên một nhánh khác. Tôi quay trở lại 0043 và 0051 biến mất.
Contango

3
@Gravitas, hãy thử ví dụ của tôi sử dụng reflog: cái có git log -g. Bạn có thể đã mất lịch sử trong một thiết lập lại, nhưng bạn vẫn có thể kiểm tra reflog nếu nó không được thu gom rác.
Shelhamer

4

lần đầu tiên sử dụng git log --onelineđể tìm SHA của cam kết (Tin nhắn), sau đó tôi đã sử dụng git log --stat 8zad24dvới SHA (ví dụ về cặp vợ chồng đầu tiên (8zad24d)) để tìm thông tin chính xác


1

Điều này:

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

hoặc này:

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

lệnh làm việc tốt nhất cho tôi.


1

Để tìm kiếm trên tất cả các chi nhánh

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

Một khi bạn biết cam kết nào bạn muốn nhận

git checkout <the commit hash>

1

Nếu thay đổi không quá cũ, bạn có thể làm,

git reflog

và sau đó kiểm tra id xác nhận

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.