ฉันจะค้นหาคอมไพล์ล่าสุดที่คอมมิทแก้ไขไฟล์ได้อย่างไร?


180

ฉันต้องการค้นหาการคอมมิชชันล่าสุดที่แก้ไขไฟล์ต้นฉบับ

ฉันสามารถใช้git blameเพื่อดูวันที่ทั้งหมดที่กระทำโดยแต่ละบรรทัด แต่มันยากที่จะเห็นว่าการกระทำใดที่เป็นคนสุดท้ายที่จะแตะไฟล์

ฉันจะหาการคอมมิชชันล่าสุดที่แตะไฟล์ที่กำหนดในที่เก็บ git ของฉันได้อย่างไร?

คำตอบ:


230

git log รองรับการดูประวัติของไฟล์ที่เฉพาะเจาะจง (และไดเรกทอรี) ดังนั้นคุณสามารถเรียกมันว่า:

git log my/file.c

จริงๆถ้าคุณต้องการรายการหนึ่งล่าสุดกระทำเช่นที่จะใช้ในสคริปต์ให้ใช้-n 1ตัวเลือก:

git log -n 1 --pretty=format:%H -- my/file.c

--pretty=format:%hบอกgit logให้แสดงเฉพาะแฮชการกระทำ ตัว--แยกหยุดชื่อไฟล์จากการตีความว่าเป็นชื่อกระทำในกรณีที่มันไม่ชัดเจน


12
หากคุณต้องการทราบครั้งล่าสุดที่ไฟล์ถูกแก้ไขไม่ว่าสาขาจะเป็นอย่างไรคุณสามารถพิจารณาทุกสาขาได้โดยการเพิ่ม--allตัวเลือก
KC

44

หากคุณเพียงแค่ต้องการค้นหาการกระทำล่าสุดแล้วคุณไม่ต้องการgit-logคุณจะต้องgit-rev-listแสดงรายการการส่งมอบวัตถุที่เปลี่ยนแปลงไฟล์นั้นในเส้นทางการส่งมอบเริ่มต้นด้วยการกระทำล่าสุด (ตามลำดับเวลา) ใส่เพียง:

git rev-list -1 <commit> <filename>

สำหรับgit-rev-listในกรณีของคุณคุณเพียงแค่จัดหา:

  • จำนวนการยอมรับที่จะรวมหรือ-1สำหรับล่าสุดเท่านั้น
  • สาขา (หรือกระทำ ID) ที่จะเริ่มต้นมองย้อนกลับไปจากหัวถ้าคุณมีอยู่แล้วในเรื่องนี้หรือ--allถ้าคุณต้องการกระทำที่รู้จักกันทั้งหมดและ
  • เส้นทางสัมพัทธ์กับไฟล์ของคุณ

นี่เป็นเพียงการส่งคืน ID การมอบหมายล่าสุดในสาขาปัจจุบันเพื่อแก้ไขไฟล์นั้นเช่น: 215095e2e338525be0baeeebdf66bfbb304e7270

สำหรับตัวอย่างที่ซับซ้อนมากขึ้นคุณสามารถใช้ชื่อแท็กและแม้กระทั่งการอ้างอิงระยะไกลและรวมชื่อพา ธ สัมพัทธ์กับไวด์การ์ดเช่น:

git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

... ซึ่งจะบอกคุณว่าการเปลี่ยนแปลงล่าสุดคือการจับคู่ไวด์การ์ดในประวัติศาสตร์ของสาขานั้น ตัวเลือกสำหรับ rev-list นั้นสุดขั้วมันเป็นหนึ่งในคำสั่งการวางท่อประปาที่สำคัญที่สุดดังนั้นคุณสามารถรวมหรือแยกโดยใช้เกณฑ์ใดก็ได้ที่คุณสามารถจินตนาการได้

แน่นอนดูที่คอมไพล์-REV รายการ (1) หน้าคู่มือการใช้งาน


คุณไม่ได้อธิบายว่าทำไมการใช้งานถึงgit-logด้อยกว่า
Piotr Dobrogost

7
ฉันจะไม่บอกว่าด้อยกว่าเพียงแค่ให้ข้อมูลที่ไม่เกี่ยวข้องตามค่าเริ่มต้น git-rev-list เพิ่งส่งคืน commit ID ซึ่งเป็นสิ่งที่คุณต้องการหากคุณต้องการฟีดการตอบสนองในสคริปต์หรือกระบวนการอัตโนมัติอื่น ๆ git-log ส่งคืนข้อมูลเกี่ยวกับคอมมิทที่เลือกไว้ก่อนโดยใช้ git-rev-list เพื่อรวบรวมรหัสการคอมมิท หากคุณเพิ่งจะกรองข้อมูลการกระทำและใช้รหัสคุณสามารถใช้ git-rev-list ได้ตั้งแต่แรก เนื่องจากบันทึกจะขึ้นอยู่กับ rev-list จึงต้องใช้พารามิเตอร์ตัวกรองส่วนใหญ่เหมือนกัน
Michael Erickson

3
git-logเป็นพอร์ซเลนgit-rev-listเป็นประปา
blitzen9872

27

หากคุณต้องการรับแฮชของคำสั่งล่าสุดเพื่อแก้ไขชุดไฟล์เฉพาะ (และต้องการหลีกเลี่ยงawk) คุณสามารถใช้:

git log -n 1 --pretty=format:%h -- <path>

git describeซึ่งจะเป็นประโยชน์สำหรับการกระทำแฮสำหรับต่อมาใช้กับ

ตัวอย่างเช่น (ในกรณีที่มีประโยชน์สำหรับทุกคน) ...

ฉันสร้าง id เวอร์ชันปัจจุบันโดยพิจารณาความมุ่งมั่นล่าสุดเพื่อเปลี่ยนไฟล์ต้นฉบับ (สมมติว่าคุณทำเครื่องหมายเวอร์ชันด้วยแท็กเช่นmycode-1.2.1):

COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
    git update-index -q --refresh
    test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
    VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
    continue
else
VN="mycode-unknown"
fi

สิ่งนี้จะสร้างรหัสเช่น:

  • mycode-1.2.1 - เมื่อสถานะปัจจุบันของไฟล์ต้นฉบับสอดคล้องกับเวอร์ชันที่ติดแท็ก
  • mycode-1.2.1-g3k7s2 - เมื่อสถานะปัจจุบันของไฟล์ต้นฉบับสอดคล้องกับการคอมมิตตามเวอร์ชันที่ติดแท็ก
  • mycode-1.2.1-g3k7s2-mod - เมื่อสถานะปัจจุบันของไฟล์ต้นฉบับได้รับการแก้ไขตั้งแต่การคอมมิชชันล่าสุดตามเวอร์ชันที่ติดแท็ก
  • mycode-unknown - เมื่อยังไม่ได้สร้างแท็กเวอร์ชัน

5
$VNดูเหมือนฝันร้ายบางอย่างที่มนุษย์ตาย SVN
ThorSummoner

10

ฉันไม่แน่ใจว่านี่คือสิ่งที่คุณต้องการ แต่ถ้าคุณทำgit log <thefile>เพื่อให้ได้คอมมิทที่เปลี่ยนแปลงไฟล์นั้น คุณสามารถเลือกสูงสุด ควรเป็นสิ่งที่คุณกำลังมองหา


4
ถ้าคุณใช้git log -n1 -- <thefile>(หรือhead -1
ไพพ์

4
จุดดี. ฉันคิดว่าคุณสามารถข้าม-nและใช้งาน-1ได้โดยตรง
Noufal Ibrahim


2

เมื่อคุณมีรหัส SHA ของการกระทำที่คุณต้องการดูการใช้git log FILENAMEคุณควรจะสามารถที่git show SHA_ID_HEREจะเห็นสิ่งที่คุณทำสำหรับการกระทำที่เฉพาะเจาะจง คุณไม่จำเป็นต้องป้อนรหัสทั้งหมด อักขระ 6 ตัวแรกควรเพียงพอ


4
มันเป็นมากกว่า OP ที่ขอ แต่ FYI คุณสามารถรวมมันเป็นหนึ่งซับ:git show $(git log -1 --pretty="%H" -- FILENAME)
Tobias Kienzler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.