git-checkout การแก้ไขที่เก่ากว่าของไฟล์ภายใต้ชื่อใหม่


264

ฉันเปิดไฟล์main.cppในเครื่องมือแก้ไข" "

ฉันต้องการเห็นการแก้ไขก่อนหน้าของ " main.cpp" ในตัวแก้ไขด้วย

วิธีที่ฉันทำตอนนี้เป็นเช่นนี้

close "main.cpp" in the editor

prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>

open "main.cpp" and "old_main.cpp" in the editor

สามารถทำให้เป็นเรื่องง่ายขึ้นได้หรือไม่ดังนั้นฉันไม่ต้องปิด "main.cpp" ในเครื่องมือแก้ไข

สิ่งที่ฉันหวังคือตัวแปรgit-checkoutที่สามารถทำได้


อัปเดต: ฉันใช้ git บน mac osx 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

UPDATE2: คำตอบของ Jakub Narębskiคือ:

prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>

UPDATE3: คำตอบของ Karmi สำหรับการแก้ไขเฉพาะ:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 

คุณใช้โปรแกรมแก้ไขอะไร บางทีมันอาจมีปลั๊กอิน / addon / โมดูลเพิ่มการสนับสนุนสำหรับ Git?
Jakub Narębski

ฉันใช้ข้อความ มีการสนับสนุนคอมไพล์ฉันไม่ได้ตรวจสอบว่ามันสามารถทำได้
neoneye

Textmate มีชุดคอมไพล์: github.com/timcharper/git-tmbundle (คุณควรตรวจสอบหน้า InterfacesFrontendsAndTools บน git wiki: git.or.cz/gitwiki )
Jakub Narębski

อย่างไรก็ตามอินเตอร์เฟซ VC ใน Emacs (ซึ่ง Git ยังรองรับในรูปแบบของ vc-git.el) ก็มีคำสั่ง 'Show Other Version' หาก TexMate Git Bundle (git-tmbundle) ไม่มีอยู่บางทีก็น่าจะเพิ่มได้
Jakub Narębski

ฉันใช้ symlink เพื่อติดตามโครงการของฉันใน TextMate ให้ดีขึ้น 25 dirs, 300 ไฟล์ สิ่งนี้จะช่วยซ่อน builddirs และ dirs ที่ไม่เกี่ยวข้องอื่น ๆ อย่างไรก็ตาม git / TextMate ไม่พอใจกับ
symlink

คำตอบ:


312

คุณสามารถใช้ "git show" เพื่อ:

prompt> git show HEAD^:main.cpp > old_main.cpp

(โปรดทราบว่ามีเครื่องหมายโคลอน [ :] อักขระระหว่างHEAD^และmain.cpp.) <revision>:<path>ไวยากรณ์ถูกอธิบายในgit rev-parse manpage ถัดจากจุดสุดท้ายในส่วน "การระบุการแก้ไข":

  • <rev>: <path> เช่น HEAD: README,: README, master: ./ README

    คำต่อท้าย:ตามด้วยชื่อเส้นทางหยดหรือต้นไม้ที่เส้นทางที่กำหนดในวัตถุต้นไม้ - ish ชื่อโดยส่วนหนึ่งก่อนที่ลำไส้ใหญ่ :path(ด้วยส่วนที่ว่างเปล่าหน้าโคลอน) เป็นกรณีพิเศษของไวยากรณ์ที่อธิบายไว้ถัดไป: เนื้อหาที่บันทึกในดัชนีที่เส้นทางที่กำหนด

    เส้นทางที่ขึ้นต้นด้วย./หรือ../สัมพันธ์กับไดเรกทอรีทำงานปัจจุบัน เส้นทางที่กำหนดจะถูกแปลงให้สัมพันธ์กับไดเรกทอรีรากของต้นไม้ทำงาน สิ่งนี้มีประโยชน์มากที่สุดในการจัดการกับหยดหรือต้นไม้จากการกระทำหรือต้นไม้ที่มีโครงสร้างของต้นไม้เหมือนกับต้นไม้ทำงาน

โปรดทราบว่า<path>นี่คือเส้นทางแบบเต็มเมื่อเทียบกับไดเรกทอรีด้านบนของโครงการของคุณเช่นไดเรกทอรีที่มี.git/ไดเรกทอรี (หรือจะแม่นยำยิ่งขึ้นกับ " <revision> " (ซึ่งโดยทั่วไปสามารถเป็น<tree-ish>ใด ๆเช่นสิ่งที่แสดงถึงต้นไม้))

หากคุณต้องการใช้พา ธ ที่สัมพันธ์กับไดเรกทอรีปัจจุบันคุณต้องใช้./<path>ไวยากรณ์ (หรือ../pathขึ้นไปจากไดเรกทอรีปัจจุบัน)

แก้ไข 2015-01-15:เพิ่มข้อมูลเกี่ยวกับไวยากรณ์พา ธ สัมพัทธ์


ในกรณีส่วนใหญ่เอาต์พุตเดียวกันโดยใช้git cat-fileคำสั่งระดับต่ำ (ระบบประปา) :

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp

3
ฉันสนใจในสำเนาเต็มรูปแบบ แต่ git-show แสดงให้ฉันเห็นถึงความแตกต่างเท่านั้น .. ฉันได้ลองเล่นกับตัวเลือก --pretty .. พร้อมรับคำ> git show --pretty = fuller HEAD ^ main.cpp แต่ไม่ได้ทำ แก้ปัญหาไม่ได้
neoneye

7
"git show HEAD ^ main.cpp" (ที่มีช่องว่างระหว่าง HEAD ^ และ main.cpp) แตกต่างจาก "git show HEAD ^: main.cpp" (พร้อมโคลอน ':' ระหว่าง HEAD ^ และ main.cpp)
Jakub Narębski

หืมกับลำไส้ใหญ่ฉันเห็นข้อผิดพลาดนี้ดังนั้นฉันจึงคิดว่าลำไส้ใหญ่เป็นความผิดพลาด ใช่ดูเหมือนว่าลำไส้ใหญ่เป็นวิธีที่จะไป แต่ฉันจะแก้ไขได้อย่างไร พรอมต์> git show HEAD ^: main.cpp ร้ายแรง: อาร์กิวเมนต์ที่ไม่ชัดเจน 'HEAD ^: main.cpp': การแก้ไขที่ไม่รู้จักหรือเส้นทางที่ไม่ได้อยู่ในแผนผังการทำงาน ใช้ '-' เพื่อแยกเส้นทางจากพรอมต์การแก้ไข>
neoneye

2
นั่นอาจหมายความว่าคุณให้ชื่อ PATH ผิด (น่าเสียดายเพราะเวทย์มนตร์ "git show" ไม่สามารถให้ข้อความแสดงข้อผิดพลาดได้ดีขึ้น) มันควรจะเป็นชื่อพา ธ เต็มรูปแบบที่เกี่ยวข้องกับไดเรกทอรีด้านบนของโครงการของคุณ: $ (git ls-tree -r - ชื่อ - เฉพาะ HEAD ^ | grep main.cpp)
Jakub Narębski

3
แทนที่จะเป็นเส้นทางแบบเต็มจากเอกสาร: "เส้นทางที่ขึ้นต้นด้วย. / หรือ .. / จะสัมพันธ์กับไดเรกทอรีการทำงานปัจจุบัน" ใช้งานได้กับรุ่น 1.8.5 ของฉัน
LVB

24

เพียงเพิ่มไปยังคำตอบของ Jakub: คุณไม่จำเป็นต้องเปลี่ยนเส้นทางไปยังไฟล์ด้วย>หากคุณสนใจที่จะข้ามเนื้อหาไฟล์ในเทอร์มินัล คุณสามารถวิ่ง$ git show 58a3db6:path/to/your/file.txtได้

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