ฉันจะดึงไฟล์จากระยะไกลโดยไม่เขียนทับไฟล์ในเครื่องได้อย่างไร


113

ฉันกำลังพยายามตั้งค่า git repo ใหม่ให้กับ remote repo ที่มีอยู่แล้ว

ฉันต้องการให้ไฟล์ในเครื่องเขียนทับ repo ระยะไกล แต่ git บอกว่าก่อนอื่นฉันต้องดึงไฟล์ระยะไกลเหล่านั้นเข้ามาและรวมเข้าด้วยกัน

มีวิธีใดบ้างในการดึง แต่ตรวจสอบให้แน่ใจว่าไฟล์ในเครื่องไม่ได้ถูกเขียนทับด้วยรีโมท?

คำตอบ:


182

ใช่และไม่ใช่ ...

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

ที่กล่าวว่ามันง่ายมากที่จะทำ "สิ่งที่ถูกต้อง ... "

ขั้นตอนที่ 1:

git stash

ใน repo ในพื้นที่ของคุณ ซึ่งจะช่วยบันทึกการอัปเดตในเครื่องของคุณลงในที่ซ่อนจากนั้นเปลี่ยนไฟล์ที่แก้ไขของคุณกลับสู่สถานะก่อนการแก้ไข

ขั้นตอนที่ 2:

git pull

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

ขั้นตอนที่ 3:

git stash pop

นั่นจะรวมเวอร์ชันแก้ไขของคุณที่คุณเก็บไว้ในขั้นตอนที่ 1 กับเวอร์ชันที่คุณเพิ่งดึงมาในขั้นตอนที่ 2 หากทุกอย่างราบรื่นคุณก็พร้อม!

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

สิ่งต่างๆจะดีขึ้นมากด้วยวิธีนี้ - มันอาจจะรักษาการเปลี่ยนแปลงของคุณโดยไม่ต้องทำงานจริงในส่วนของคุณในขณะที่แจ้งเตือนคุณถึงปัญหาร้ายแรงและร้ายแรง


5
ทำไมไม่เพียงแค่git commitการเปลี่ยนแปลงในท้องถิ่นที่เกิดขึ้นgit pull?
Don Cheadle

10
บางครั้งฉันอยู่ในตำแหน่งที่ฉันไม่ต้องการผูกมัดรหัส แต่ฉันต้องการเก็บไว้ในเครื่องของฉันชุดคำสั่งเหล่านี้มีประโยชน์มากสำหรับสิ่งนี้
Vargan

3
สิ่งนี้ไม่มีประโยชน์หากคุณมีหลายไฟล์บางไฟล์ที่คุณต้องการเขียนทับและบางไฟล์ที่คุณไม่ต้องการเขียนทับ ไม่มีวิธีใดที่จะบอกให้ GIT ละเว้นไฟล์เมื่อดึง? เหตุใด. gitignore จึงใช้งานได้เฉพาะกับการผลักดันฉันไม่เข้าใจการตัดสินใจออกแบบเลย ...
Bobak Hashemi

"คุณเพิกเฉยต่อการเปลี่ยนแปลงของพวกเขา" เป็นการสังเกตที่ไม่เป็นธรรมฉันประสบปัญหานี้กับ Visual Studio ซึ่งสร้าง "csproj" เฉพาะที่ออกแบบมาสำหรับเวิร์กสเตชันท้องถิ่นโดยขึ้นอยู่กับการอ้างอิงไลบรารี และฉันไม่ต้องการพุชการเปลี่ยนแปลงเหล่านั้นไปยังเซิร์ฟเวอร์ด้วย
snesgx

25

คุณสามารถซ่อนการเปลี่ยนแปลงในท้องถิ่นของคุณก่อนจากนั้นดึงจากนั้นเปิดที่ซ่อน

git stash
git pull origin master
git stash pop

สิ่งใดก็ตามที่ลบล้างการเปลี่ยนแปลงจากระยะไกลจะมีความขัดแย้งซึ่งคุณจะต้องแก้ไขด้วยตนเอง


4
ฉันได้ทำการเปลี่ยนแปลงเหล่านี้ในเครื่องแล้วดังนั้นจึงบอกว่า "ไม่มีการเปลี่ยนแปลงในท้องถิ่นที่จะบันทึก"
Joe Isaacson

ฉันคิดว่านี่เป็นกลยุทธ์ที่ดีที่สุด
Jimmy Obonyo Abor

13

ดังนั้นคุณได้ทำการเปลี่ยนแปลงในพื้นที่ของคุณกับที่เก็บในเครื่องของคุณ git fetchจากนั้นเพื่อให้ได้รับการเปลี่ยนแปลงจากระยะไกลเพื่อเก็บข้อมูลในพื้นที่ของคุณโดยไม่มีการเปลี่ยนแปลงไปยังไฟล์ในท้องถิ่นของคุณคุณสามารถใช้ จริงๆแล้วgit pullเป็นการดำเนินการสองขั้นตอน: การไม่ทำลายgit fetchตามด้วยไฟล์git merge. ดูอะไรคือความแตกต่างระหว่าง 'git pull' และ 'git fetch' สำหรับการสนทนาเพิ่มเติม

ตัวอย่างโดยละเอียด:

สมมติว่าที่เก็บของคุณเป็นแบบนี้ (คุณได้ทำการเปลี่ยนแปลงtest2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

และที่originเก็บเป็นเช่นนี้ (มีคนอื่นให้คำมั่นtest1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

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

$ git fetch

ที่เก็บในเครื่องผลลัพธ์ของคุณจะเป็นดังนี้:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

ตอนนี้คุณมีการเปลี่ยนแปลงระยะไกลในสาขาอื่นและคุณเก็บไฟล์ในเครื่องของคุณไว้เหมือนเดิม

แล้วอะไรต่อไป? คุณสามารถทำ a git mergeซึ่งจะเป็นเอฟเฟกต์เดียวกับgit pull(เมื่อรวมกับก่อนหน้าgit fetch) หรือตามที่ฉันต้องการคือทำgit rebase origin/masterเพื่อใช้การเปลี่ยนแปลงของคุณด้านบนorigin/masterซึ่งจะช่วยให้คุณมีประวัติที่สะอาดยิ่งขึ้น


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