เป็นไปได้หรือไม่ที่จะดึงไฟล์หนึ่งไฟล์ใน Git?


177

ฉันกำลังทำงานในสาขา Git ที่มีการทดสอบที่ไม่สมบูรณ์และฉันต้องการดึง (รวมการเปลี่ยนแปลงไม่ใช่แค่เขียนทับ) การทดสอบเหล่านี้จากสาขาอื่นที่พวกเขาได้รับการแก้ไขแล้ว

ฉันรู้ว่าฉันสามารถทำ

git pull origin that_other_branch

แต่สิ่งนี้จะพยายามรวมไฟล์อื่น ๆ จำนวนมากเนื่องจากฉันยังไม่พร้อม

เป็นไปได้ที่จะดึงและรวมเฉพาะไฟล์ที่ระบุ (ไม่ใช่ทุกอย่าง) จากสาขาอื่นหรือไม่?

นี่ไม่ใช่การดึงคำขอ Git ที่ซ้ำกันเพียงไฟล์เดียวเนื่องจากคำตอบทั้งหมดสำหรับคำถามนั้นเป็นวิธีการแปลงไฟล์ที่ถูกเปลี่ยนภายในเครื่องกลับไปเป็นเวอร์ชันที่เก็บข้อมูลโดยไม่ต้องเปลี่ยนสาขาใด ๆ


7
ฉันเชื่อว่าไม่มีรายการใดในหน้านี้ให้คำตอบสำหรับคำถาม คำถามหมายถึงการดึงไฟล์เพียงไฟล์เดียวจากเซิร์ฟเวอร์ระยะไกลไม่ใช่การดึงไฟล์ทั้งหมดและตรวจสอบเฉพาะไฟล์ ดังนั้นคำถามควรจะทำซ้ำหรือคำตอบที่เลือกไม่ได้ทำเครื่องหมายว่าเป็นวิธีแก้ปัญหาของคำถาม
mljrg

คำตอบ:


153

คุณสามารถดึงข้อมูลและตรวจสอบไฟล์เพียงไฟล์เดียวด้วยวิธีนี้:

git fetch
git checkout -m <revision> <yourfilepath>
git add <yourfilepath>
git commit

เกี่ยวกับgit checkoutคำสั่ง: <revision> - ชื่อสาขาคือorigin/master <yourfilepath>ไม่รวมชื่อพื้นที่เก็บข้อมูล (ที่คุณสามารถได้รับจากการคลิกcopy pathปุ่มบนหน้าไฟล์ใน GitHub) เช่นREADME.md


23
รหัสแฮชที่ต้องการโดยสวิตช์ -m สามารถพิมพ์ด้วย git branch -v ! น่ากลัว
Audrius Meskauskas

2
ยอดเยี่ยม สิ่งนี้ช่วยฉันได้มากกว่าหนึ่งครั้ง ในการชี้แจงแฟล็ก -m ดูเหมือนจะมีความสุขกับแฮชการคอมมิชชันที่คุณต้องการดึงไฟล์เดี่ยวของคุณ
rd108

1
สิ่งนี้ใช้ได้สำหรับฉันเช่นกัน แม้ว่าฉันวิ่งเข้าสู่ระบบคอมไพล์ในสาขาที่ห่างไกลของฉันเพื่อหาสิ่งที่พลิกกลับ: เช่น $ คอมไพล์ล็อกรีโมท / กำเนิด / Master
แดน

6
เป็นไปได้หรือไม่ที่จะดึงไฟล์เฉพาะโดยไม่ดึงไฟล์อื่น?
รู้สึกดีและเขียนโปรแกรม

3
@aleroot <revision> หมายถึงอะไร
Wakan Tanka

240

นี่เป็นวิธีที่ง่ายขึ้นเล็กน้อยที่ฉันเพิ่งได้รับเมื่อทำการวิจัยนี้:

git fetch {remote}
git checkout FETCH_HEAD -- {file}

4
ร้ายแรง: การอ้างอิงที่ไม่ถูกต้อง: FETCH_HEAD
Antony D'Andrea

4
คำตอบนี้อาจไม่มีตัวอย่างการทำงาน มันไม่ชัดเจนว่าใครจะต้องทำอะไรต่อไป
Dr_Zaszuś

@Chris เราจำเป็นต้องใช้ {remote} หรือไม่หากเราอยู่ในสาขาแล้ว ถ้าใช่ทำไม
Cloud Cho

2
ไม่เหมือนกับ pull ซึ่งจะพยายามผสานซึ่งเป็นสาเหตุที่เราต้องการใช้ pull
JosephK

22
git checkout master -- myplugin.js

master = ชื่อสาขา

myplugin.js = ชื่อไฟล์


และมีวิธีการย้อนกลับ?
liyuan

1
อย่าลืม 'ดึงคอมไพล์' มาก่อน;)
matson kepson

16

@ คำตอบของ Mawardy ทำงานได้สำหรับฉัน แต่การเปลี่ยนแปลงของฉันอยู่บนรีโมทดังนั้นฉันต้องระบุที่มา

git checkout origin/master -- {filename}

2

ใช่นี่คือกระบวนการ:

# Navigate to a directory and initiate a local repository
git init        

# Add remote repository to be tracked for changes:   
git remote add origin https://github.com/username/repository_name.git

# Track all changes made on above remote repository
# This will show files on remote repository not available on local repository
git fetch

# Add file present in staging area for checkout
git check origin/master -m /path/to/file
# NOTE: /path/to/file is a relative path from repository_name
git add /path/to/file

# Verify track of file(s) being committed to local repository
git status

# Commit to local repository
git commit -m "commit message"

# You may perform a final check of the staging area again with git status
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.