ดึง Git โดยไม่ต้องชำระเงิน?


133

ฉันคุ้นเคยกับการเรียกใช้ git pull และคำสั่งอื่น ๆ จากภายในสาขาที่ฉันกำลังทำงานอยู่ แต่ฉันได้ตั้งค่าเซิร์ฟเวอร์การพัฒนาที่มีหลายคนทำงานอยู่ดังนั้นฉันจึงไม่ต้องการที่จะเปลี่ยนสาขาเมื่อฉันทำ หากฉันต้องการอัปเดตสาขาที่มีอยู่บนเซิร์ฟเวอร์ dev จากที่เก็บ github ที่เราทุกคนใช้วิธีที่ถูกต้องจะทำอย่างไร? ถ้าฉันเรียกใช้คำสั่ง 'git pull github branchname' นั่นจะเป็นการดึง branch เข้าสู่ branch ปัจจุบันหรือไม่?

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


6
git fetchควรทำในสิ่งที่คุณต้องการ
Brad

12
git fetchจะอัปเดตสำเนาภายในของสาขาระยะไกล แต่ไม่ใช่สาขาในพื้นที่แม้ว่าจะมีการตั้งค่าเพื่อติดตามสาขาระยะไกลนั้นก็ตาม อาจเป็นหรือไม่ใช่สิ่งที่ต้องการ (แก้ไข: ตามค่าเริ่มต้นอย่างไรก็ตามเป็นไปได้ที่จะเรียกมันด้วยอาร์กิวเมนต์เพื่อให้มันทำงานแตกต่างกันไป แต่ในกรณีนี้อาร์กิวเมนต์ควรถูกชี้ให้เห็นจริงๆ)

2
ฉันไม่ค่อยเข้าใจ ... ทุกคนใช้ที่เก็บในเครื่องเดียวกันบนเซิร์ฟเวอร์ dev หรือไม่ นั่นเป็นเหตุผลที่คุณไม่ต้องการเปลี่ยนสาขาหรือไม่? ทำไมไม่เพียงให้ทุกคนสร้างโคลนส่วนตัวของตัวเองที่พวกเขาสามารถทำงานได้? ดูคอมไพล์: อัปเดตสาขาในพื้นที่โดยไม่ต้องตรวจสอบหรือไม่ .

คำตอบ:


222

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

โดยทั่วไป:

git fetch <remote> <srcBranch>:<destBranch>


มีวิธีใช้สาขาต้นน้ำแทนการระบุสาขาต้นทางหรือไม่?
cambunctious

เศร้า แต่pullมีพารามิเตอร์ที่fetchไม่ได้: -s <strategy>, -Xsubtree=...ซึ่งเป็นสิ่งสำคัญสำหรับฉันดังนั้นนี้ไม่ได้ทดแทนเทียบเท่า ฉันมีปัญหาที่อธิบายไว้ที่นี่: Congruityservice.com/blog/…แต่ในกรณีของฉันฉันไม่ต้องการชำระเงินเลย
Andry

2
git pull <remote> <srcBranch>:<destBranch>พิจารณาคำถามที่เกี่ยวกับการดึงดูเหมือนว่าคำตอบแทนควรจะเป็น
เจวู้ดชัค

หากคอมมิตอยู่ในที่เก็บในเครื่องของคุณแล้ว:git fetch . origin/master:master
Evan

74

ฉันมีปัญหาเดียวกันกับความจำเป็นในการยอมรับหรือซ่อนการเปลี่ยนแปลงคุณสมบัติปัจจุบันสาขาหลักเช็คเอาต์pullคำสั่ง do รับทุกอย่างจากระยะไกลไปยังmasterพื้นที่ทำงานในพื้นที่จากนั้นสลับอีกครั้งเป็นสาขาคุณลักษณะและดำเนินการrebaseเพื่อให้เป็นปัจจุบันด้วย เจ้านาย

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

git fetch origin master:master

git rebase master

และมันก็เป็นเคล็ดลับอย่างดี


19
นี่เป็นคำแนะนำที่ดี แต่แฝงไว้ด้วยคำตอบด้านล่างหากคุณเปิดอยู่featureและสิ่งที่คุณต้องการทำคืออัปเดตท้องถิ่นของคุณmasterให้สอดคล้องกับแหล่งกำเนิดโดยไม่ต้องสัมผัสfeatureเพียงแค่ทำgit fetch origin master:master... และเหมือนกับว่าคุณทำ ซ่อน-checkoutMaster ดึง checkoutFeature-stashPop!
btown

7
ในการรวมต้นแบบต้นทางเข้ากับสาขาในพื้นที่ของคุณคุณไม่จำเป็นต้องดึงเจ้าของท้องถิ่น คุณสามารถใช้ git merge origin/master
แดน

-1

หากคุณต้องการให้เคล็ดลับสาขาในพื้นที่กลับมาชี้อีกครั้งgit fetchคุณต้องมีขั้นตอนเพิ่มเติม

เพิ่มเติมรูปธรรมสมมติว่า repo GitHub มีสาขาD, B, Cและmaster(เหตุผลนี้แปลกสาขาชื่อชุดจะมีความชัดเจนในช่วงเวลา) คุณอยู่ในโฮสต์devhostและคุณอยู่ใน repo ที่originrepo github อยู่ที่ไหน คุณทำgit fetchซึ่งนำกว่าวัตถุทั้งหมดและการปรับปรุงorigin/D, origin/B, และorigin/C origin/masterจนถึงตอนนี้ดีมาก แต่ตอนนี้คุณบอกว่าคุณต้องการสิ่งที่จะเกิดขึ้นบนdevhostเพื่อท้องถิ่นสาขาD, B, Cและ / หรือmaster?

ฉันมีคำถามที่ชัดเจนเหล่านี้ (สำหรับฉันแล้ว):

  1. ทำไมคุณถึงอยากให้คำแนะนำของทุกสาขาอัพเดท?
  2. จะเป็นอย่างไรหากบางสาขา (เช่น B ) ยอมรับว่า repo ระยะไกล (github) ขาด? พวกเขาควรจะรวมกันใหม่หรือ ... ?
  3. จะเกิดอะไรขึ้นถ้าคุณอยู่ในบางสาขา (เช่นC) และไดเร็กทอรีงานและ / หรือดัชนีถูกแก้ไข แต่ไม่ได้รับการยืนยัน
  4. จะเกิดอะไรขึ้นถ้า repo ระยะไกลมีการเพิ่มสาขาใหม่ ( A) และ / หรือสาขาที่ถูกลบ ( D)?

ถ้าคำตอบของ (1) คือ "เพราะ devhostไม่ได้มีไว้สำหรับการพัฒนา แต่เป็นมิเรอร์เฉพาะที่เก็บสำเนา github repo ที่มีอยู่ในเครื่องเพื่อให้นักพัฒนาจริงทั้งหมดของเราอ่านได้อย่างรวดเร็วแทนที่จะอ่านช้าๆจาก github "แล้วคุณต้องการ" กระจก "มากกว่า repo" ปกติ " ไม่ควรมีไดเร็กทอรีงานและบางทีก็ไม่ควรยอมรับการพุชเช่นกันซึ่งในกรณีนี้คำถามที่เหลือก็หายไป

หากมีคำตอบอื่น (2-4) จะกลายเป็นปัญหา

ไม่ว่าในกรณีใดต่อไปนี้เป็นวิธีการจัดการกับการอัปเดตการอ้างอิงในเครื่องตามการอ้างอิงระยะไกล (หลังจากเรียกใช้git fetch -pเช่น):

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

สิ่งที่อยู่ใน... code here ...ส่วนนี้ขึ้นอยู่กับคำตอบของคำถาม (2-4)


-5

ใช้

git fetch

แทน. อัปเดตการอ้างอิงระยะไกลและวัตถุใน repo ของคุณ แต่จะปล่อยให้สาขาท้องถิ่น HEAD และ worktree เพียงอย่างเดียว


17
แต่นั่นไม่ได้อัปเดตสาขาท้องถิ่นของเซิร์ฟเวอร์การพัฒนาของเขา ... มันจะรีเฟรชสาขา "ต้นทาง" ในโฟลเดอร์ git เท่านั้นซึ่งตรงกับที่เก็บ github ของผู้ถาม
ANeves

1
หรือถ้าคุณต้องการรุ่นของปัญหา: ฉันต้องการรวมสาขาการทำงานของฉันกับ "master" ไม่ใช่กับ "origin / master of ssh: // bla bla bla" การดึงข้อมูลจะอัปเดตต้นทาง / ต้นแบบ แต่ไม่ใช่มาสเตอร์
ANeves

-6

แก้ไข: ใช้ 'git pull' ซึ่งจะดึงข้อมูลสาขาทั้งหมดจาก repo และอัปเดตเป็นล่าสุดหากสาขาออกจากระบบภายในสำหรับสาขาปัจจุบันเท่านั้น หมายเหตุ: git pull เทียบเท่ากับ fetch + merge ซึ่งดึงข้อมูลสาขาทั้งหมด แต่จะรวมเฉพาะสาขาปัจจุบัน


6
ดีกว่าที่จะพูด: pullดึงข้อมูล (ซึ่งใช่ดึงข้อมูลทุกอย่างจากรีโมท) แต่จะรวมเฉพาะสาขาปัจจุบัน
torek

ไม่มีความผิดใด ๆ ที่เกิดขึ้นกับการลงคะแนนของฉันฉันรู้ว่าสิ่งที่คุณพูดนั้นถูกต้องและเป็นข้อเท็จจริงและ OP ได้ขอคำยืนยันอย่างแน่นอนว่าการดึงทำอะไร (และคุณได้ให้คำอธิบายแก่เขาแล้ว) แต่มันไม่ได้กล่าวถึง ประเด็นสำคัญของสิ่งที่เขาได้รับ: มีวิธีอัปเดตสาขาในพื้นที่ของคุณให้เป็นคอมมิตล่าสุดในสาขาระยะไกลที่เกี่ยวข้องโดยไม่ต้องชำระเงินสาขาก่อนหรือไม่
Gurce
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.