วิธีการกระจายไฟล์หนึ่งไฟล์ไปเป็นเวอร์ชันใด ๆ ใน Git


324

ฉันจะแตกไฟล์พูดpom.xmlจากสาขาหลักไปเป็นรุ่นเก่าโดยพลการใน Git ได้อย่างไร?

คำตอบ:


347

คุณทำได้:

git diff master~20:pom.xml pom.xml

... เพื่อเปรียบเทียบค่าปัจจุบันของคุณpom.xmlกับค่าที่masterแก้ไขจาก20 รายการที่ผ่านมากับรายการหลัก คุณสามารถเปลี่ยนmaster~20ของหลักสูตรที่มีชื่อวัตถุ (SHA1sum) ของการกระทำหรือใด ๆ ของวิธีการอื่น ๆ ของการระบุการแก้ไข

โปรดทราบว่านี่เป็นการเปรียบเทียบpom.xmlเวอร์ชั่นเก่ากับเวอร์ชันในแผนผังการทำงานของคุณไม่ใช่เวอร์ชันที่คอมmasterมิท หากคุณต้องการสิ่งนั้นคุณสามารถทำสิ่งต่อไปนี้แทน:

git diff master~20:pom.xml master:pom.xml

12
โปรดทราบว่าสิ่งนี้ไม่เพียงทำงานได้กับไฟล์เท่านั้น แต่ยังสามารถใช้ได้กับไดเรกทอรี (ย่อย) ด้วยเช่นgit diff <revision>:foo/ HEAD:foo/กัน

2
นอกจากนี้โปรดทราบว่าใน windows คุณต้องใช้เครื่องหมายทับซ้ายไปข้างหน้าสำหรับไดเรกทอรีหากคุณใช้ตัวระบุการแก้ไขหรือ git จะทำให้คุณมีข้อผิดพลาดเกี่ยวกับไฟล์ / ไดเรกทอรีที่ไม่มีอยู่ในการแก้ไขนั้น
Dylan Nissley

1
@DylanNissley หรือมันจะทำให้คุณไม่มีข้อผิดพลาดและไม่ต่าง นั่นคือสิ่งที่ฉันเห็น ในกรณีใด ๆ ขอขอบคุณสำหรับคำแนะนำเกี่ยวกับการใช้เครื่องหมายทับซ้ายไปข้างหน้าแทนเครื่องหมายแบ็กสแลช
Gary S.

ด้วยไฟล์ windows ฉันพบว่ามันง่ายกว่าที่จะเปลี่ยนไดเรกทอรีแล้วเรียก git diff master ~ 20: ./ pom.xml ./pom.xml
lloyd

คอมไพล์บางรุ่นต้องการ "-" ระหว่าง <revision> & <path>
Josh

140
git diff <revision> <path>

ตัวอย่างเช่น:

git diff b0d14a4 foobar.txt

ไม่ทำงานสำหรับรุ่น 1.7.11 หากไฟล์ไม่ได้อยู่ในไดเรกทอรีปัจจุบัน ตัวอย่าง: ข้อผิดพลาด 'git diff f76d078 การทดสอบ / การกำหนดค่า' ทำให้ไม่สามารถเข้าถึง 'test / f76d078' "
simpleuser

1
@ user1663987 git diff <revision> root/path/fileเพียงแค่ผ่านทางญาติที่เต็มไปด้วยรากโครงการ:

1
การทดสอบ / Config เป็นเมื่อเทียบกับราก (ในขณะที่การทดสอบเป็นไดเรกทอรีย่อยของราก) แต่แล้วรูต / พา ธ / ไฟล์ตัวอย่างของคุณดูเหมือนจะรวมถึงรูตหรือไม่
simpleuser

41

หากคุณต้องการเห็นความแตกต่างระหว่างการกระทำครั้งสุดท้ายของไฟล์เดียวคุณสามารถทำได้:

git log -p -1 filename

นี่จะให้ความแตกต่างของไฟล์เป็น git ไม่ใช่การเปรียบเทียบไฟล์โลคอลของคุณ


2
นี่ไม่ได้คืนสิ่งใดเลย
Andrei Cristian Prodan

@AndreiCristianProdan จากนั้นคุณไม่มีการเปลี่ยนแปลงที่นั่น คุณสามารถเพิ่มทีละ-1ขั้นตอนจนกว่าคุณจะได้รับการเปลี่ยนแปลง
ไกเซอร์

นี่เป็นสิ่งที่ดีมาก ฉันสร้างฟังก์ชั่นทุบตีที่อาจเป็นประโยชน์: gitlog () { git log -${3:-p} -${2:-1} $1; } ใช้แล้วชอบgitlog Rakefileหรือและgitlog Rakefile 5 gitlog Rakefile 10 sครั้งแรกที่แสดงหนึ่งแตกต่าง; ครั้งที่สองแสดงห้า diffs; --no-patchที่สามแสดงสิบ
auxbuss

18

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

git diff HEAD~1 path/to/file.

คุณสามารถเปลี่ยนจำนวน (~ 1) เป็นความมุ่งมั่นที่ n ที่คุณต้องการได้


คำตอบนี้เป็นเพียงกรณีเฉพาะของคำตอบทั่วไปที่HEAD~1มีการแทนที่<revision>ซึ่งทำให้คำตอบนี้ซ้ำกัน

1
มันไม่ทำงาน! ร้ายแรง: อาร์กิวเมนต์ที่คลุมเครือ 'HEAD ~ 1': การแก้ไขที่ไม่รู้จักหรือเส้นทางที่ไม่ได้อยู่ในแผนผังการทำงาน ใช้ '-' เพื่อแยกเส้นทางจากการแก้ไข
Andrei Cristian Prodan

คำตอบนี้ง่ายและใช้งานได้สำหรับฉัน
Douglas Frari

6

ไวยากรณ์ทั่วไป:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

สำหรับไฟล์ทั้งหมดที่ชื่อ "FileName.xml" ที่ใดก็ได้ใน repo ของคุณ

สังเกตเห็นช่องว่างระหว่าง "-" และ "**"

คำตอบสำหรับคำถามของคุณ:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

คุณสามารถใช้แท็ก / sha1 / "HEAD ^" เช่นเดียวกับ git

ทดสอบกับ git 1.9.1 บน Ubuntu


6

หากไม่ยอมรับว่า HEAD ของคุณการขยายตัวของ bash นั้นมีประโยชน์จริง ๆ โดยเฉพาะถ้าชื่อไฟล์ของคุณยาวตัวอย่างข้างบน:

git diff master~20:pom.xml master:pom.xml

จะกลายเป็น

git diff {master~20,master}:pom.xml

เพิ่มเติมเกี่ยวกับการขยายรั้งด้วยทุบตี


6

สำหรับการเปรียบเทียบกับ 5 กระทำกับค่าปัจจุบันทั้งบนmasterเพียงแค่ทำ:

git diff master~5:pom.xml master:pom.xml

นอกจากนี้คุณสามารถอ้างถึงหมายเลขแฮ็ชตัวอย่างเช่นถ้าหมายเลขแฮชx110bd64คุณสามารถทำสิ่งนี้เพื่อดูความแตกต่าง:

git diff x110bd64 pom.xml



2

หากคุณใช้เครื่องมือกราฟิก (หรือชอบมัน) คุณสามารถ:

gitk pom.xml

ใน gitk คุณสามารถคลิกกระทำใด ๆ (เพื่อ "เลือก" มัน) และคลิกขวาที่กระทำอื่น ๆ เพื่อเลือก "Diff this -> selected" หรือ "Diff select -> this" ในเมนูป๊อปอัพขึ้นอยู่กับลำดับที่คุณต้องการ



0

หากคุณต้องการกระจายไฟล์เดียวในที่เก็บตัวอย่างเช่นคุณสามารถทำได้

git diff stash@{0} -- path/to/file

-1

หากคุณกำลังมองหาส่วนต่างของการคอมมิทเฉพาะและคุณต้องการใช้ github UI แทนบรรทัดคำสั่ง (บอกว่าคุณต้องการลิงค์ไปยังคนอื่น ๆ ) คุณสามารถทำได้:

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

ตัวอย่างเช่น:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

หมายเหตุลิงก์ก่อนหน้าและถัดไปที่ด้านบนขวาที่อนุญาตให้คุณนำทางไฟล์ทั้งหมดในคอมมิท

สิ่งนี้ใช้ได้กับการกระทำที่เฉพาะเจาะจงเท่านั้นไม่ใช่สำหรับการเปรียบเทียบระหว่างเวอร์ชันสองเวอร์ชันใด ๆ

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