ฉันจะแสดงรายการการกระทำทั้งหมดที่เปลี่ยนแปลงไฟล์เฉพาะได้อย่างไร?


801

มีวิธีแสดงรายการการกระทำทั้งหมดที่เปลี่ยนแปลงไฟล์เฉพาะหรือไม่?


1
คุณกำลังมองหาการเปลี่ยนแปลงไฟล์ข้ามสาขาเดียวหรือไม่ ข้ามสาขาท้องถิ่นทั้งหมด ข้ามทุกสาขาในรีโมทเดียว หรือข้ามมันทั้งหมดหรือไม่ ฉันคิดว่ามันจะต้องใช้สคริปต์ทั้งหมด
benhorgen

คำตอบ:


1082

การ--followทำงานสำหรับไฟล์เฉพาะ

git log --follow -- filename

ความแตกต่างกับโซลูชั่นอื่น ๆ ที่ได้รับ

โปรดทราบว่าการแก้ปัญหาอื่น ๆ รวมถึงgit log path(ไม่มี--follow) วิธีการนั้นมีประโยชน์ถ้าคุณต้องการติดตามเช่นการเปลี่ยนแปลงในไดเรกทอรีแต่จะสะดุดเมื่อมีการเปลี่ยนชื่อไฟล์ (ใช้เช่นนั้น--follow filename)


32
--followบัญชี+1 สำหรับการเปลี่ยนชื่อดังนั้นสิ่งนี้จึงแข็งแกร่งกว่าgit log -- path
Gabe Moothart

42
โปรดทราบว่า--followยอมรับเส้นทางซึ่งอาจเป็นไฟล์ แต่ยังเป็นไดเรกทอรี ในกรณีหลังมันจะทำงานซ้ำและรายงานการเปลี่ยนแปลงไฟล์ทั้งหมดด้านล่างจุดนั้น (พฤติกรรมนี้ไม่ได้บันทึกไว้ใน manpage และอาจไม่ถาวร)
StvnW

5
ความแตกต่างระหว่างสิ่งนั้นกับเพิ่งจะเป็นอย่างไรgit log filename?
VaTo

8
@SaulOrtega git log filenameไม่ได้ติดตามการเปลี่ยนชื่อไฟล์นั่นคือจะแสดงข้อผูกพันทั้งหมดที่เกี่ยวข้องกับชื่อไฟล์นั้น(ไม่ใช่ไฟล์จริง) ถ้าคุณสร้างไฟล์XและYเปลี่ยนทั้งสองแล้วลบYและเปลี่ยนชื่อXไปYแล้วยังมีการเปลี่ยนแปลงมันและคุณเรียกgit log Yคุณจะได้รับข้อความสำหรับทั้งเก่า Yและใหม่อย่างใดอย่างหนึ่ง และตรงข้ามกับ--followที่คุณจะได้รับการกระทำเกี่ยวกับไฟล์ที่ว่าเมื่อมันเป็นชื่อX และYเมื่อมันถูกตั้งชื่อว่า
MarSoft

7
ใช้ "บันทึก git - ชื่อไฟล์ทั้งหมด" เพื่อดูความมุ่งมั่นทั้งหมดในทุกสาขา
Lebnik

122

git log pathควรทำสิ่งที่คุณต้องการ จากgit logคน :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.

11
ไม่ทำงานหากเส้นทางของไฟล์เปลี่ยนไป คำตอบของ jackrabbit ใช้งานได้สำหรับกรณีนี้
kwahn

1
ใช้งานได้หากคุณต้องการ จำกัด การบันทึกไปยังสาขาเฉพาะ
ams

63

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

นี่คือสิ่งที่ฉันได้มาด้วยโดย messing รอบกับตัวเลือกมุมมองแก้ไข gitk สิ่งนี้แสดงให้ฉันเห็นถึงความมุ่งมั่นทั้งหมดของไฟล์โดยไม่คำนึงถึงสาขา, โลคัล, reflog และระยะไกล

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

มันยังทำงานร่วมกับgit log:

git log --all --first-parent --remotes --reflog --author-date-order -- filename

11
นี่คือที่สมบูรณ์แบบสำหรับเมื่อมีคนทำการเปลี่ยนแปลง แต่พวกเขาลืมที่พวกเขากระทำการเปลี่ยนแปลง
earthmeLon

2
มีประโยชน์มาก. รวมถึงการกระทำที่ซ่อนไว้
Juan Antonio Tubío

นี่ควรเป็นคำตอบที่ต้องการ คำถามก็คือหาคำมั่นสัญญาทั้งหมด
carl verbiest

ประกาศที่--reflogรวมถึงการกระทำที่ถูกลด / แก้ไขหรือยกเลิกเป็นอย่างอื่น อาจจะเห็นได้ชัด แต่ฉันพยายามใช้สิ่งนี้ด้วยgit logและพยายามคิดว่าทำไมฉันถึงเห็นคอมมิชชันที่ซ้ำกัน!
Soren

43

ใช้คำสั่งด้านล่างเพื่อรับคอมมิทสำหรับไฟล์เฉพาะ:

git log -p filename

8
ฉันเข้าใจว่านี่ไม่ได้ตอบคำถามอย่างถูกต้องเพราะเขาต้องการรายการของการกระทำ แต่นี่เป็นทองคำและอยู่ในไฟล์ของฉัน
zkent

3
สิ่งนี้จะไม่ทำงานเลยหากไฟล์ไม่มีอยู่ในสาขาที่เช็คเอาท์ในปัจจุบัน คุณสามารถเพิ่มสาขาเช่นgit log -p mybranch -- filenameหรือใช้git log --all -- filenameเพื่อค้นหาในทุกสาขา
Soren

37

มันควรจะง่ายเหมือนgit log <somepath>; ตรวจสอบ manpage ( git-log(1))

ส่วนตัวฉันชอบที่จะใช้git log --stat <path>เพื่อให้ฉันสามารถเห็นผลกระทบของการกระทำแต่ละครั้งในไฟล์


9
หรือแม้ว่า-pคุณต้องการเห็นความแตกต่างเต็มรูปแบบไม่ใช่แค่ว่ามันมีการแก้ไขจำนวนบรรทัด
Cascabel

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

git log --stat --follow - * .html => รายการเอาต์พุตของคอมมิทที่มีไฟล์เดียวในแต่ละคอมมิท ดีมาก!
Sergio Belevskij

18

อีกทางเลือกหนึ่ง (ตั้งแต่ Git 1.8.4) ก็เป็นไปได้ที่จะได้รับการกระทำทั้งหมดที่มีการเปลี่ยนแปลงส่วนหนึ่งของไฟล์ คุณสามารถรับสิ่งนี้ได้โดยผ่านบรรทัดเริ่มต้นและหมายเลขบรรทัดสุดท้าย

ผลลัพธ์ที่ส่งคืนจะเป็นรายการข้อผูกพันที่แก้ไขส่วนนี้โดยเฉพาะ คำสั่งมีลักษณะดังนี้:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

ที่upperLimitเป็นstart_line_numberและlowerLimitเป็นending_line_number

ข้อมูลเพิ่มเติม - https://www.techpurohit.com/list-some-useful-git-commands


17

ตามที่ jackrabb1t ชี้ให้เห็น--followจะมีประสิทธิภาพมากกว่าเนื่องจากยังคงแสดงรายการประวัติที่นอกเหนือจากการเปลี่ยนชื่อ / การย้าย ดังนั้นหากคุณกำลังมองหาไฟล์ที่ไม่ได้อยู่ในเส้นทางเดียวกันหรือไฟล์ที่ถูกเปลี่ยนชื่อตลอดคอมมิชชันต่าง ๆ - ผู้ติดตามจะติดตามมัน

นี่อาจเป็นตัวเลือกที่ดีกว่าถ้าคุณต้องการเห็นภาพการเปลี่ยนแปลงชื่อ / เส้นทาง:

git log --follow --name-status -- <path>

แต่ถ้าคุณต้องการรายการขนาดกะทัดรัดยิ่งขึ้นเฉพาะสิ่งที่สำคัญ:

git log --follow --name-status --format='%H' -- <path>

หรือแม้กระทั่ง

git log --follow --name-only --format='%H' -- <path>

ข้อเสียคือ--followใช้งานได้กับไฟล์เดียวเท่านั้น


4
--followใช้งานได้กับพา ธเดียวซึ่งอาจเป็นไดเรกทอรี หากผ่านไดเรกทอรีมันจะทำงานซ้ำและรายงานการเปลี่ยนแปลงไฟล์ทั้งหมดที่อยู่ด้านล่าง
StvnW

10

หากคุณพยายามที่จะ - ติดตามไฟล์ที่ถูกลบในการใช้การกระทำก่อนหน้านี้

git log --follow -- filename

3
สำหรับgitมือใหม่: ใช้git log -p --follow -- filenameเพื่อแสดงการเปลี่ยนแปลงเช่นกัน หมายเหตุ: "ชื่อไฟล์" สามารถเป็นไฟล์ไดเรคทอรีหรือ submodule
Tino

8

หากคุณต้องการดูการกระทำทั้งหมดที่เปลี่ยนไฟล์ในทุกสาขาให้ใช้สิ่งนี้:

git log --follow --all <filepath>


6

หากคุณต้องการที่จะเห็นการเปลี่ยนแปลงทั้งหมดที่กระทำโดยยอมรับว่ามีการเปลี่ยนแปลงไฟล์ใดไฟล์หนึ่ง (แทนที่จะเป็นแค่การเปลี่ยนแปลงไฟล์เอง) คุณสามารถผ่าน--full-diff:

git log -p --full-diff [branch] -- <path>

หรือไม่[branch]
Anentropic

1
@Anentropic วงเล็บเหลี่ยมควรจะระบุว่าอาร์กิวเมนต์เป็นตัวเลือก
Cubic

มันคือทั้งหมดที่ฉันต้องการมันแสดงให้เห็นถึงการเปลี่ยนแปลงอย่างเต็มรูปแบบรวมถึงการเปลี่ยนแปลงบางอย่างจากการรวม
ThanhLD

5

ใช้git log --all <filename>เพื่อดูข้อผูกพันที่มีอิทธิพล<filename>ในทุกสาขา


4
gitk <path_to_filename>

สมมติว่าแพ็คเกจ "gitk" ได้รับการติดตั้งแล้ว

หากยังไม่ได้ติดตั้งให้ทำสิ่งนี้:

sudo apt-get install gitk

จากนั้นลองคำสั่งด้านบน มันมีไว้สำหรับ Linux ... มันอาจช่วยผู้ใช้งาน Linux ได้หากพวกเขาต้องการ GUI


สำหรับผู้ใช้ Windows โปรดทราบว่าgitkมาพร้อมกับ Git สำหรับ Windows
Soren Bjornstad

2

เพื่อให้ได้รับรายการการใช้แฮชการกระทำ git rev-list

 git rev-list HEAD <filename>

เอาท์พุท:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

ซึ่งหมายความว่า 5 การกระทำได้สัมผัสไฟล์นี้ เป็นลำดับย้อนกลับดังนั้นการส่งครั้งแรกในรายการb7c4f0d7จึงเป็นรายการล่าสุด


1

บน Linux คุณสามารถใช้ gitk สำหรับสิ่งนี้

สามารถติดตั้งได้โดยใช้ "sudo apt-get install git-gui gitk" มันสามารถใช้เพื่อดูการกระทำของไฟล์เฉพาะโดย "gitk <Filename>"


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