มีคำสั่งใน Git เพื่อดู (ไม่ว่าจะถูกดัมพ์ไปยัง stdout หรือใน$PAGERหรือ$EDITOR) ไฟล์เฉพาะรุ่นใดรุ่นหนึ่ง?
git checkout <sha1-of-the-commit-you-need>หลังจากนั้นทำอย่างนั้นgit checkout HEAD
มีคำสั่งใน Git เพื่อดู (ไม่ว่าจะถูกดัมพ์ไปยัง stdout หรือใน$PAGERหรือ$EDITOR) ไฟล์เฉพาะรุ่นใดรุ่นหนึ่ง?
git checkout <sha1-of-the-commit-you-need>หลังจากนั้นทำอย่างนั้นgit checkout HEAD
คำตอบ:
คุณสามารถใช้git showกับพา ธ จากรูทของที่เก็บ ( ./หรือ../สำหรับการจัดเส้นทางสัมพันธ์):
$ git show REVISION:path/to/file
แทนที่REVISIONด้วยการแก้ไขที่แท้จริงของคุณ (อาจเป็น Git การกระทำ SHA, ชื่อแท็ก, ชื่อสาขา, ชื่อการส่งญาติหรือวิธีอื่น ๆ ในการระบุการกระทำใน Git)
ตัวอย่างเช่นหากต้องการดูเวอร์ชันของไฟล์<repository-root>/src/main.cตั้งแต่ 4 คอมมิชชันให้ใช้:
$ git show HEAD~4:src/main.c
Git สำหรับ Windows ต้องการเครื่องหมายสแลชแม้ในเส้นทางที่สัมพันธ์กับไดเรกทอรีปัจจุบัน git-showสำหรับข้อมูลเพิ่มเติมโปรดดูที่หน้าคนสำหรับ
ทำสิ่งนี้ตามวันที่มีลักษณะเช่นนี้:
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt
โปรดทราบว่าHEAD@{2013-02-25}หมายถึง "ตำแหน่งที่ HEAD อยู่ใน 2013-02-25" ในที่เก็บนี้ (ใช้reflog ) ไม่ใช่ "การคอมมิทครั้งสุดท้ายก่อน 2013-02-25 ในสาขานี้ในประวัติศาสตร์"
masterแทนHEAD@{2013-02-25}ถ้าคุณอยู่ในสาขา
git log --since='2016-04-28 23:59:59 +0100'?
ถ้าคุณชอบ GUI คุณสามารถใช้ gitk:
เริ่มต้น gitk ด้วย:
gitk /path/to/file
เลือกการแก้ไขในส่วนด้านบนของหน้าจอเช่นตามคำอธิบายหรือวันที่ ตามค่าเริ่มต้นส่วนล่างของหน้าจอจะแสดง diff สำหรับการแก้ไขนั้น (ตรงกับปุ่มตัวเลือก "แพทช์")
หากต้องการดูไฟล์สำหรับการแก้ไขที่เลือก:
gitk REVISION /path/to/fileคุณยังสามารถใช้ทางลัดนี้: สิ่งนี้มีประโยชน์เมื่อคุณต้องการตรวจสอบกับบางเวอร์ชันเช่น
นอกจากนี้คุณยังสามารถระบุcommit hash(มักเรียกว่ายังcommit ID) กับคำสั่งgit show
git show <commitHash>:/path/to/file
git log /path/to/filecommit hashเช่นcommit 06c98...(06c98 ... เป็นแฮชการกระทำ)commit hashgit show <commitHash>:/path/to/fileโดยใช้commit hashขั้นตอนที่ 3 และpath/to/fileขั้นตอนที่ 1หมายเหตุ:การเพิ่มเมื่อระบุเส้นทางสัมพันธ์ดูเหมือนว่าสิ่งที่สำคัญคือ./git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html
git show <SHA1> --name-onlyเพื่อรับมัน
นอกจากคำตอบของJim Hunzikerแล้ว
คุณสามารถส่งออกไฟล์จากการแก้ไขเป็น
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
หวังว่าจะช่วย :)
วิธีดูความแตกต่างอย่างรวดเร็วด้วยการแก้ไขไฟล์แบบเก่า:
git show -1 filename.txt> เพื่อเปรียบเทียบกับการแก้ไขครั้งล่าสุดของไฟล์
git show -2 filename.txt> เพื่อเปรียบเทียบกับการแก้ไขล่าสุดครั้งที่ 2
git show -3 fielname.txt> เพื่อเปรียบเทียบกับการแก้ไขล่าสุดครั้งที่ 3
git log -pจะแสดงให้คุณเห็นไม่ใช่แค่บันทึกการกระทำ แต่ยังแสดงความแตกต่างของการส่งข้อมูลแต่ละข้อ (ยกเว้นการกระทำที่ผสาน) จากนั้นคุณสามารถกดใส่ชื่อไฟล์และกด/ enterกดnหรือpเพื่อไปยังเหตุการณ์ถัดไป / ก่อนหน้า วิธีนี้คุณจะไม่เพียง แต่เห็นการเปลี่ยนแปลงในไฟล์ แต่ยังรวมถึงข้อมูลการส่งมอบด้วย
git log -pmจะแสดงการรวมการกระทำ
git log -p -- filename.txtเพื่อยับยั้งประวัติเฉพาะไฟล์ที่ต้องการ
คุณสามารถใช้สคริปต์เช่นนี้เพื่อดัมพ์ไฟล์ทุกเวอร์ชันเพื่อแยกไฟล์:
เช่น
git_dump_all_versions_of_a_file.sh path/to/somefile.txt
รับสคริปต์ที่นี่เป็นคำตอบของคำถามที่คล้ายกันอีกข้อ
git_root, git_log_shortและgit_log_message_for_commitจะหายไป
วิธีที่ 1: (ฉันชอบวิธีนี้)
git refloggit diff-tree --no-commit-id --name-only -r <commitHash>ตัวอย่าง:
git diff-tree --no-commit-id --name-only -r d2f9ba4// "d2f9ba4" กำลังส่ง id จาก "1. "
git show <commitHash>:/path/to/file
ตัวอย่าง:
git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift// "Src / ... " คือพา ธ ไฟล์จาก "2. "
วิธีที่ 2:
git refloggit reset --hard %commit ID%รีเซ็ต git - ฮาร์ด c14809fa
ผู้ช่วยในการดึงไฟล์หลายไฟล์จากการแก้ไขที่กำหนด
เมื่อพยายามแก้ไขข้อขัดแย้งในการผสานผู้ช่วยนี้มีประโยชน์มาก:
#!/usr/bin/env python3
import argparse
import os
import subprocess
parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
file_relative = os.path.relpath(os.path.abspath(path), toplevel)
base, ext = os.path.splitext(path)
new_path = base + '.old' + ext
with open(new_path, 'w') as f:
subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)
GitHub ต้นน้ำ
การใช้งาน:
git-show-save other-branch file1.c path/to/file2.cpp
ผลลัพธ์: ข้อมูลต่อไปนี้มีไฟล์ทางเลือกอื่น:
file1.old.c
path/to/file2.old.cpp
ด้วยวิธีนี้คุณจะรักษานามสกุลไฟล์ไว้เพื่อให้ตัวแก้ไขของคุณไม่บ่นและสามารถค้นหาไฟล์เก่าที่อยู่ถัดจากที่ใหม่กว่าได้อย่างง่ายดาย