Bagaimana cara mencari repositori Git melalui pesan komit?

828

Saya memeriksa beberapa kode sumber ke GIT dengan pesan komit "Build 0051".

Namun, saya sepertinya tidak dapat menemukan kode sumber itu lagi - bagaimana cara mengekstrak sumber ini dari repositori GIT, menggunakan baris perintah?

Memperbarui

  1. Diperiksa dalam versi 0043, 0044, 0045 dan 0046 menggunakan SmartGIT.
  2. Memeriksa 0043, dan memeriksa versi hingga 0051 pada cabang yang berbeda.
  3. Memeriksa 0043 lagi.
  4. Sekarang, 0051 telah menghilang.

Memperbarui

Kode sumber pasti ada di sana, sekarang tinggal periksa saja:

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>
Contango
sumber
2
Jawaban tidak termasuk dalam pertanyaan tentang Stack Overflow. Anda telah menjadi kontributor cukup lama sehingga Anda harus tahu ini. Jika Anda ingin memberikan jawaban untuk pertanyaan Anda sendiri, Anda tentu dapat melakukannya . Atau, Anda dapat mengedit jawaban shelhamer untuk meningkatkan / memperluasnya.
Cody Gray
1
@Cody Saya merujuk posting ini sesekali. Anda tidak bisa hanya menghapus teks secara acak, itu bukan kriket. Jika Anda ingin menghapusnya, Anda tentu dapat mengubahnya menjadi jawaban Anda sendiri (dan Anda bahkan mungkin mendapatkan beberapa upvotes untuk itu - Anda telah menjadi kontributor cukup lama untuk mengetahui cara kerjanya).
Contango

Jawaban:

1284

Untuk mencari log komit (di seluruh cabang) untuk teks yang diberikan:

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

Untuk mencari konten aktual dari komit melalui riwayat repo, gunakan:

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

untuk menampilkan semua instance dari teks yang diberikan, nama file yang berisi, dan komit sha1.

Akhirnya, sebagai upaya terakhir jika komit Anda menggantung dan tidak terhubung sama sekali ke sejarah, Anda dapat mencari reflog itu sendiri dengan -gbendera (kependekan dari --walk-reflogs:

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

EDIT: jika Anda tampaknya telah kehilangan riwayat, periksa reflogsebagai jaring pengaman Anda. Cari Build 0051 di salah satu komit yang terdaftar oleh

git reflog

Anda mungkin hanya mengatur Anda HEADke bagian sejarah di mana komit 'Bangun 0051' tidak terlihat, atau Anda mungkin benar-benar telah menghancurkannya. The reflog git-siap artikel mungkin bisa membantu.

Untuk memulihkan komit dari reflog : lakukan checkout git dari komit yang Anda temukan (dan secara opsional buat cabang atau tag baru untuk referensi)

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
shelhamer
sumber
2
dengan git grep 'Build 0051' $ (git rev-list --all) Saya mendapatkan sh.exe ": / bin / git: Nomor file yang buruk dapat mengubah hal ini mungkin?
Jens Schauder
7
git log -i -grep
jhvaras
@JensSchauder Jika Anda mengalami kesalahan dengan git grep 'search' $(git rev-list --all), cobagit rev-list --all | xargs git grep 'search'
afilina
83

Saya memasukkan ini ke ~ / .gitconfig:

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

Lalu saya bisa mengetikkan "git find string" dan saya mendapatkan daftar semua commit yang berisi string itu di dalam pesan. Misalnya, untuk menemukan semua komit yang mereferensikan tiket # 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
Alex Howansky
sumber
1
Bagus, tapi mungkin tidak ada pengaturan ulang warna? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Ashley Coolman
4
Saya lebih suka untuk mencetak pesan git penuh (grep dapat terjadi di sana, tidak dalam judul), jadi saya berakhir dengan: find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Perhatikan --alldan %bkarakter. Thx @AshleyCoolman untuk resettipnya.
arcol
Terima kasih. Saya menemukan alias sangat berguna. Saya tidak suka pewarnaan dan menemukan format oneline sempurna untuk ini. Juga menambahkan -i untuk membuatnya case-insensitive sangat membantu. mis.find = log --oneline --name-status -i --grep
robbp
39

Meskipun agak terlambat, ada :/notasi khusus untuk menentukan komit (atau revisi) berdasarkan pesan komit, hanya awali string pencarian dengan :/, misalnya:

git show :/message

Ini <message>bisa menjadi pola regex kompleks yang terdiri dari spasi putih, jadi harap pastikan untuk mengutip / melarikan diri jika perlu, misalnya:

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

Atau, titik awal dapat ditentukan, untuk menemukan komit terdekat yang dapat dijangkau dari titik tertentu, misalnya:

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

Lihat: manual revisi git .

Ryenus
sumber
23
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).
Josh Lee
sumber
19
git log --grep="Build 0051"

harus melakukan trik

Noufal Ibrahim
sumber
1
Harus menggunakan tanda kutip ganda (") alih-alih tanda kutip tunggal (').
frage
9

Coba ini!

git log | grep -b3 "Build 0051"
Nic
sumber
Terima kasih - tetapi tidak menemukannya. Bagaimana cara mencari di semua cabang yang mungkin?
Contango
6
Anda ingin menggunakan git grepbukan grep normal, dan memberikan --allbendera untuk mencari beberapa cabang.
shelhamer
Hmm - apakah jawaban lain juga menemukannya? Jika tidak, Anda mungkin memiliki masalah yang lebih besar. Saya akan mencoba git log --all --grep='Build 0051'(@ jawaban Shelhamer)
Nic
Saya mencoba "git log --all", dan hanya mencantumkan versi ke 0046. Versi 0051 ada di cabang yang berbeda. Saya kembali ke 0043, dan 0051 menghilang.
Contango
3
@ Gravitas, coba contoh saya yang menggunakan reflog: yang dengan git log -g. Anda mungkin kehilangan riwayat dalam pengaturan ulang, tetapi Anda masih dapat memeriksa reflog jika belum dikumpulkan.
shelhamer
4

pertama digunakan git log --onelineuntuk menemukan SHA dari commit (Pesan), kemudian saya gunakan git log --stat 8zad24ddengan SHA (pasangan pertama contoh sha char (8zad24d)) untuk menemukan info yang tepat

Ridha Rezzag
sumber
1

Ini:

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

atau ini:

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

perintah bekerja paling baik untuk saya.

simhumileco
sumber
1

Untuk mencari di semua cabang

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

Setelah Anda tahu komit yang ingin Anda tuju

git checkout <the commit hash>
Samarth S
sumber
1

Jika perubahannya tidak terlalu lama, Anda bisa,

git reflog

dan kemudian checkout id komit

Joseph
sumber