Git: วิธีการอัปเดต / ชำระเงินไฟล์เดียวจากต้นแบบต้นกำเนิดระยะไกล?


362

สถานการณ์:

  1. ฉันจะทำให้การเปลี่ยนแปลงบางอย่างในไฟล์เดียวในประเทศและทำงานgit add, git commitและgit push
  2. ไฟล์ถูกส่งไปยังที่เก็บต้นแบบต้นทางรีโมต
  3. ฉันมีที่เก็บข้อมูลในเครื่องอื่นที่ปรับใช้ผ่าน Capistrano ด้วยวิธี "remote_cache" จากที่เก็บระยะไกลนั้น
  4. ตอนนี้ฉันไม่ต้องการปรับใช้แอปพลิเคชันทั้งหมด แต่เพียงอัปเดต / เช็คเอาต์ไฟล์เดียว

เป็นไปได้ด้วย git หรือไม่ ฉันไม่สามารถหาสิ่งที่จะทำงานหรือฉันไม่สามารถคิดออก ด้วย SVN ฉันทำsvn up fileและ voila


19
คุณอาจต้องการพิจารณาเปลี่ยนคำตอบที่ยอมรับเป็นคำตอบที่ตอบคำถามของคุณ ;)
ขั้นตอน

6
หลังจากนานกว่า 6 ปีฉันเชื่อว่าเราสามารถสรุปได้อย่างปลอดภัยว่า @steps นี้จะไม่เกิดขึ้น ...
Félix Gagnon-Grenier

ด้วย Git 2.23 (สิงหาคม 2019) git restore -s origin/master -- path/to/fileมันเป็น ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


914

เป็นไปได้ที่จะทำ (ในพื้นที่เก็บข้อมูลที่ปรับใช้)

git fetch
git checkout origin/master -- path/to/file

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

เช็คเอาต์จะอัปเดตแผนผังการทำงานพร้อมไฟล์เฉพาะจากการเปลี่ยนแปลงที่ดาวน์โหลด ( origin/master)

อย่างน้อยมันก็ใช้ได้กับฉันสำหรับการพิมพ์ผิดเล็ก ๆ น้อย ๆ เหล่านั้นซึ่งมันรู้สึกแปลกที่จะสร้างสาขา ฯลฯ เพียงแค่เปลี่ยนคำเดียวในไฟล์


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

6
นี่คือคำตอบที่ฉันต้องการ
javadba

20
@Mymozaaa เครื่องหมายขีดกลางคู่กำหนดว่าสิ่งที่ตามมาคือชื่อไฟล์ เพื่อป้องกันไม่ให้คอมไพล์แปลชื่อไฟล์ของคุณเป็นสาขาในกรณีที่โชคร้ายคุณมีสองชื่อที่มีชื่อเดียวกัน
Joel Mellon

ปัญหาคือคุณยังคงดึงข้อมูลและหากเป็นธุรกรรมซื้อคืนขนาดใหญ่นั่นจะเป็นการดำเนินการที่มีราคาแพง ฉันกลัวว่าทางเลือกเดียวที่จะติดตั้ง gitweb บนรีโมทแล้วเข้าใช้เพื่อดึงไฟล์หรือเช่นนั้น
Christian Goetze

คำถามเล็ก ๆ หลังจากทำอย่างนั้นฉันจะไปที่เครื่องอื่นแล้วฉันจะทำสิ่งที่คุณได้กล่าวไว้ข้างต้น แต่ในเมื่อgit statusฉันเห็นพวกเขาในฐานะChanges to be committed:- ความหมายฉันต้องยอมรับพวกเขาอีกครั้ง? (เพิ่งสังเกตว่าฉันต้องการรีเฟรชไฟล์เดียวแตะต้อง แต่ repo ตัวเองถูกสัมผัสในเครื่องที่แตกต่างกัน)
Ricky Levi


19
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip

1
นี่เป็นทางออกที่ดีสำหรับ repos ที่โคลนมากกว่า ssh แต่ดูเหมือนว่านี่จะไม่รองรับ https: git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x ให้ข้อความผิดพลาด:fatal: Operation not supported by protocol.
Alderath

1
รวมกันได้ดีกับtar: s --to-stdout,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Puggan Se

18

ด้วย Git 2.23 (สิงหาคม 2019) และคำสั่งใหม่ (ยังอยู่ในช่วงทดลอง) ที่git restoreเห็นใน " วิธีการรีเซ็ตไฟล์ทั้งหมดจากไดเรกทอรีทำงาน แต่ไม่ใช่จากพื้นที่จัดเตรียม? " นั่นคือ:

git fetch
git restore -s origin/master -- path/to/file

ความคิดคือ: git restoreข้อเสนอเฉพาะกับไฟล์ไม่ได้ไฟล์และสาขาgit checkoutไม่
ดู " สับสนgit checkout ": นั่นคือที่git switchมา)


codersamเพิ่มในความคิดเห็น :

ในกรณีของฉันฉันต้องการรับข้อมูลจากต้นน้ำของฉัน (ซึ่งฉันแยกจากกัน)
ดังนั้นเพิ่งเปลี่ยนเป็น:

git restore -s upstream/master -- path/to/file

2
ในที่สุดสิ่งที่บรรเทาคำสั่งนี้ก็มีอยู่ ... ผู้คนที่ทำอะไรไม่เข้าใจก่อนหน้านี้ ฉันกำลังกู้คืนสิ่งทั้งหมดและคัดลอกแต่ละไฟล์ที่ฉันต้องการ แต่มันเจ็บปวด
Mike Wise

สิ่งนี้ใช้ได้สำหรับฉัน แต่ในกรณีของฉันฉันต้องการรับข้อมูลจากต้นน้ำของฉัน (ซึ่งฉันแยกจากกัน) ดังนั้นเพิ่งเปลี่ยนเป็นgit restore -s upstream/master -- path/to/file
coderSam

@CoderSam กว่าคุณสำหรับข้อเสนอแนะนี้ ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้มองเห็นได้ชัดเจนขึ้น
VonC

8

สิ่งที่คุณสามารถทำได้คือ:

  1. อัพเดท repo git ในพื้นที่ของคุณ:

    git fetch

  2. สร้างสาขาท้องถิ่นและชำระเงินที่:

    git branch pouet && git checkout pouet

  3. ใช้ความมุ่งมั่นที่คุณต้องการในสาขานี้:

    git cherry-pick abcdefabcdef

    (abcdefabcdef คือ sha1 ของการส่งที่คุณต้องการใช้)


4
git checkout -b pouetเช่นกันขั้นตอนที่สองของคุณยังสามารถทำได้ในหนึ่งคำสั่งเป็น
เกร็กฮิวกิล

4
'pouet' เป็นชื่อสาขาที่ดีที่สุดสำหรับตัวอย่างนี้
Hussard

2

หรือ git stash (ถ้าคุณมีการเปลี่ยนแปลง) ที่สาขาที่คุณอยู่, master checkout, pull สำหรับการเปลี่ยนแปลงล่าสุด, คว้าไฟล์นั้นไปที่เดสก์ทอปของคุณ (หรือทั้งแอป) ชำระเงินสาขาที่คุณอยู่ ที่เก็บ Git จะนำกลับไปใช้กับสถานะที่คุณอยู่จากนั้นแก้ไขการเปลี่ยนแปลงด้วยตนเองหรือลากมาแทนที่ไฟล์

วิธีนี้ไม่เจ๋งนัก แต่มันก็ใช้ได้ผลถ้าคุณคิดไม่ออก


-10

ฉันคิดว่าฉันพบแฮ็คที่แสนง่าย

ลบไฟล์ที่คุณมีบนที่เก็บโลคัล (ไฟล์ที่คุณต้องการอัพเดตจากการคอมมิทล่าสุดในเซิร์ฟเวอร์ระยะไกล)

และจากนั้นทำ git pull

เนื่องจากไฟล์ถูกลบจึงไม่มีข้อขัดแย้ง


ซึ่งจะลบการเปลี่ยนแปลงในที่สุดทั้งหมดที่เกิดขึ้นกับไฟล์นั้นในเครื่องและดึงไฟล์อื่น ๆ ทั้งหมดซึ่งเป็นสิ่งที่ OP ต้องการโดยเฉพาะ
legrojan

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