วิธีค้นหาที่เก็บ Git ด้วยการส่งข้อความ


828

ฉันตรวจสอบซอร์สโค้ดบางส่วนลงใน GIT ด้วยข้อความส่งมอบ "Build 0051"

อย่างไรก็ตามฉันไม่สามารถหาซอร์สโค้ดนั้นได้อีกฉันจะแยกซอร์สนี้ออกจากที่เก็บ GIT โดยใช้บรรทัดคำสั่งได้อย่างไร

ปรับปรุง

  1. เช็คอินในรุ่น 0043, 0044, 0045 และ 0046 โดยใช้ SmartGIT
  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>


1
ดูเพิ่มเติมที่stackoverflow.com/questions/18122628/…
ripper234


2
คำตอบไม่ได้อยู่ในคำถามใน Stack Overflow คุณเป็นผู้สนับสนุนมานานพอที่คุณจะรู้เรื่องนี้ หากคุณต้องการที่จะให้คำตอบกับคำถามของคุณเองคุณจะยินดีที่จะทำอย่างแน่นอน อีกวิธีหนึ่งคุณสามารถแก้ไขคำตอบของผู้พักอาศัยเพื่อปรับปรุง / ขยาย
Cody Gray

1
@Cody ฉันอ้างถึงโพสต์นี้เป็นครั้งคราว คุณไม่สามารถลบข้อความแบบสุ่มได้นั่นไม่ใช่แค่จิ้งหรีด หากคุณต้องการลบคุณยินดีที่จะเปลี่ยนมันเป็นคำตอบของคุณเอง (และคุณอาจได้รับ upvotes บางอย่าง - คุณเป็นผู้สนับสนุนนานพอที่จะรู้ว่ามันทำงานอย่างไร)
Contango

คำตอบ:


1281

วิธีค้นหาบันทึกการกระทำ (ในทุกสาขา) สำหรับข้อความที่กำหนด

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

ในการค้นหาเนื้อหาจริงของการกระทำผ่านประวัติของ repo ให้ใช้:

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

เพื่อแสดงอินสแตนซ์ทั้งหมดของข้อความที่กำหนดชื่อไฟล์ที่มีและการกระทำ sha1

สุดท้ายเป็นทางเลือกสุดท้ายในกรณีที่ความมุ่งมั่นของคุณห้อยอยู่และไม่ได้เชื่อมต่อกับประวัติศาสตร์เลยคุณสามารถค้นหา reflog ด้วยตัวเองได้-g(ย่อมาจาก--walk-reflogs:

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

แก้ไข: หากคุณดูเหมือนจะสูญเสียประวัติของคุณตรวจสอบreflogเป็นตาข่ายความปลอดภัยของคุณ ค้นหา Build 0051 ในหนึ่งในการคอมมิทที่ระบุโดย

git reflog

คุณอาจตั้งค่าHEADให้เป็นส่วนหนึ่งของประวัติศาสตร์ที่ไม่สามารถมองเห็นการกระทำ 'Build 0051' ได้หรือคุณอาจปลิวไปเลย reflog คอมไพล์พร้อม บทความอาจจะมีการช่วยเหลือ

ในการกู้คืนการกระทำของคุณจากการอ้างอิง : ทำการตรวจสอบการคอมมิทของคอมมิชชันที่คุณพบ (และเลือกที่จะสร้างสาขาหรือแท็กใหม่เพื่ออ้างอิง)

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
กับคอมไพล์ grep 'Build 0051' $ (คอมไพล์รอบรายการ --all) ฉันได้รับ sh.exe ": / bin / คอมไพล์: จำนวนไฟล์ที่ไม่ดีมีวิธีการทำเช่นนี้อาจจะมีการเปลี่ยนแปลง?
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
ฉันชอบที่จะพิมพ์ข้อความคอมไพล์เต็ม (grep อาจจะเกิดขึ้นนั้นไม่ได้อยู่ในชื่อ) find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grepดังนั้นผมจึงจบลงด้วย: หมายเหตุ--allและ%bตัวอักษร ขอบคุณ @AshleyCoolman สำหรับคำresetแนะนำ
arcol

ขอบคุณ ฉันพบว่านามแฝงมีประโยชน์มาก ฉันไม่ชอบสีและพบว่ารูปแบบออนไลน์สมบูรณ์แบบสำหรับสิ่งนี้ การเพิ่ม -i เพื่อทำให้ case-insensitive เป็นประโยชน์ เช่นfind = log --oneline --name-status -i --grep
robbp

39

แม้ว่าจะช้าไปสักหน่อย แต่ก็มี:/ข้อสังเกตุที่เฉพาะเจาะจงในการระบุการคอมมิท (หรือการแก้ไข) ตามข้อความคอมมิทเพียงนำหน้าสตริงการค้นหาด้วย:/เช่น:

git show :/message

ที่นี่<message>อาจเป็นรูปแบบ regex ที่ซับซ้อนซึ่งประกอบด้วยช่องว่างดังนั้นโปรดตรวจสอบให้แน่ใจว่าได้พูด / หลบหนีเมื่อจำเป็นเช่น:

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

อีกทางหนึ่งสามารถระบุจุดเริ่มต้นเพื่อค้นหาการกระทำที่ใกล้เคียงที่สุดที่สามารถเข้าถึงได้จากจุดเฉพาะเช่น:

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

ดู: การแก้ไข Git คู่มือ



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หนึ่งเดียวกับ คุณอาจสูญเสียประวัติในการรีเซ็ต แต่คุณยังสามารถตรวจสอบการอ้างอิงได้หากยังไม่ได้เก็บขยะ
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

จากนั้นตรวจสอบรหัสยืนยัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.