ฉันจะ 'git fetch' และ 'git merge' จาก Remote Tracking Branch ได้อย่างไร (เช่น 'git pull')


111

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

ตัวอย่างเช่นสมมติว่าฉันมีสาขาระยะไกลชื่อ 'an-other-branch' ฉันตั้งค่าในเครื่องเป็นสาขาติดตามโดยใช้

git branch --track an-other-branch origin/an-other-branch

จนถึงตอนนี้ดีมาก แต่ถ้าสาขานั้นได้รับการอัปเดต (โดยปกติฉันจะย้ายเครื่องและรับจากเครื่องนั้น) และฉันต้องการอัปเดตบนเครื่องเดิมฉันกำลังประสบปัญหาในการดึง / ผสาน:

git fetch origin an-other-branch
git merge origin/an-other-branch

เมื่อใดก็ตามที่ฉันทำเช่นนี้ฉันจะได้รับข้อความ "เป็นข้อมูลล่าสุดแล้ว" และไม่มีการผสาน

อย่างไรก็ตามก

git pull origin an-other-branch

อัปเดตเสมออย่างที่คุณคาดหวัง

นอกจากนี้การเรียกใช้ git diff

git diff origin/an-other-branch

แสดงให้เห็นว่ามีความแตกต่างดังนั้นฉันคิดว่าฉันมีไวยากรณ์ผิด

ผมทำอะไรผิดหรือเปล่า?

แก้ไข [2010-04-09]:ฉันตรวจสอบสองสามครั้งแล้วและฉันไม่ได้อยู่สาขาอื่นแน่นอน 'git fetch' ของฉันควรตามด้วย 'git merge' (ตามที่แสดงด้านบน) ทำสิ่งเดียวกันกับ git pull หรือไม่? ฉันจะได้รับเวิร์กโฟลว์ที่แสดงผลลัพธ์ของสถานะคอมไพล์เป็นต้น

คำตอบ:


170

คุณไม่ได้เรียกสาขาคุณดึงข้อมูลจากระยะไกลทั้งหมด:

git fetch origin
git merge origin/an-other-branch

8
รายละเอียดเพิ่มเติม: git fetch origin an-other-branchเก็บเคล็ดลับที่ดึงเข้าFETCH_HEADมา แต่ไม่ใช่origin/an-other-branch(เช่น 'สาขาการติดตามระยะไกล' ตามปกติ) ดังนั้นใคร ๆ ก็ทำได้git fetch origin an-other-branch && git merge FETCH_HEADแต่ทำอย่างที่ @Gareth บอกจะดีกว่า (หรือแค่ใช้git pull )
Chris Johnsen

ดังนั้นหากต้นทางมี 1,000 สาขาคุณจะเป็นสาขาระยะไกลสำหรับพวกเขาทั้งหมดหรือไม่?
Gauthier

4
แน่ใจ ถ้าฉันได้เพิ่มพื้นที่เก็บข้อมูลระยะไกลที่มี 1,000 สาขาให้กับฉันและฉันถามว่าสาขาใดที่รีโมตมีมันจะดีกว่าที่จะให้ฉันทั้งหมด 1,000
Gareth

จะgit merge origin/an-other-branchรวมorigin/an-other-branchเป็นสาขาท้องถิ่นทั้งหมดที่ตั้งค่าให้ติดตามหรือไม่ ฉันจะรวมเป็นสาขาในพื้นที่เพียงสาขาเดียวได้อย่างไร
สัตว์ครึ่งบกครึ่งน้ำ

1
แล้วอะไรล่ะ git pull (โดยไม่มีข้อโต้แย้ง) ทำอะไร - มันรวมสาขาไหน? มันผสานสาขาการติดตามระยะไกลที่สอดคล้องกับสาขาปัจจุบันหรือไม่
The Red Pea

69

การเลือกเพียงสาขาเดียว: fetch/ merge เทียบกับ pull

ผู้คนมักแนะนำให้คุณแยก "การดึงข้อมูล" ออกจาก "การรวม" พวกเขาพูดแทนสิ่งนี้:

    git pull remoteR branchB

ทำเช่นนี้:

    git fetch remoteR
    git merge remoteR branchB

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

    git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
    git branch -a  # to verify
    git branch -t branchB remoteR/branchB

แน่นอนว่าเป็นเรื่องยากที่จะจำได้อย่างน่าขันดังนั้นหากคุณต้องการหลีกเลี่ยงการดึงข้อมูลทุกสาขาจริงๆควรปรับเปลี่ยน.git/configตามที่อธิบายไว้ใน ProGit

ฮะ?

คำอธิบายที่ดีที่สุดของทั้งหมดนี้อยู่ในบทที่ 9-5 ของ ProGit, Git Internals - The Refspec ( หรือผ่าน github ) ที่หายากอย่างน่าอัศจรรย์ผ่านทาง Google

ก่อนอื่นเราต้องล้างคำศัพท์บางคำ สำหรับการติดตามสาขาระยะไกลโดยทั่วไปมี 3 สาขาที่แตกต่างกันที่ต้องระวัง:

  1. สาขาบน repo ระยะไกล: refs/heads/branchBภายใน repo อื่น
  2. ของคุณ สาขาการติดตามระยะไกล : refs/remotes/remoteR/branchBในrepo ของคุณ
  3. สาขาของคุณเอง: refs/heads/branchBภายในrepo ของคุณ

สาขาการติดตามระยะไกล (ใน refs/remotes ) เป็นแบบอ่านอย่างเดียว คุณไม่ได้แก้ไขสิ่งเหล่านั้นโดยตรง คุณแก้ไขสาขาของคุณเองจากนั้นคุณกดไปยังสาขาที่เกี่ยวข้องที่ repo ระยะไกล ผลลัพธ์จะไม่แสดงในของคุณrefs/remotesจนกว่าจะมีการดึงหรือดึงข้อมูลที่เหมาะสม ที่แตกต่างเป็นเรื่องยากสำหรับผมที่จะเข้าใจจากคอมไพล์ที่มนุษย์หน้าส่วนใหญ่เป็นเพราะสาขาในประเทศ ( refs/heads/branchB) มีการกล่าวถึง "เพลง" สาขาระยะไกลติดตามเมื่อกำหนด.git/configbranch.branchB.remote = remoteR

คิดว่า 'refs' เป็นตัวชี้ C ++ ทางกายภาพพวกมันเป็นไฟล์ที่มี SHA-Digests แต่โดยพื้นฐานแล้วพวกมันเป็นเพียงตัวชี้เข้าไปในโครงสร้างคอมมิต git fetchจะเพิ่มโหนดจำนวนมากในโครงสร้างคอมมิตของคุณ แต่การที่คอมไพล์ตัดสินใจว่าจะย้ายพอยน์เตอร์อย่างไรนั้นค่อนข้างซับซ้อน

ดังที่กล่าวไว้ในคำตอบอื่นเช่นกัน

    git pull remoteR branchB

ไม่

    git fetch remoteR branchB

จะย้ายและหลังอย่างแน่นอนไม่สามารถเคลื่อนย้ายrefs/remotes/branches/branchB อย่างไรก็ตามทั้งสองย้ายrefs/heads/branchB FETCH_HEAD(คุณสามารถcatใด ๆ ของไฟล์เหล่านี้ภายใน.git/เพื่อดูว่าเมื่อพวกเขาเปลี่ยน.) และgit mergeจะอ้างถึงFETCH_HEADในขณะที่การตั้งค่าMERGE_ORIG, ฯลฯ


1
คุณทราบหรือไม่ว่าลิงก์ไปยัง Git Internals เป็นลิงก์ไปยังคำถามเดียวกันนี้
Shahbaz

9

คุณแน่ใจหรือไม่ว่าคุณอยู่ในพื้นที่an-other-branchเมื่อรวมเข้าด้วยกัน

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch

คำอธิบายอื่น ๆ :

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

หากคุณนำหน้า repo ระยะไกลทีละคอมมิตมันคือ repo ระยะไกลที่ล้าสมัยไม่ใช่คุณ

แต่ในกรณีของคุณถ้าได้git pullผลนั่นหมายความว่าคุณไม่ได้อยู่ในสาขาที่ถูกต้อง


3

Git pull เป็นเครื่องมือคำสั่งผสมโดยเรียกใช้ git fetch (รับการเปลี่ยนแปลง) และ git merge (รวมเข้ากับสำเนาปัจจุบันของคุณ)

แน่ใจหรือว่าอยู่ในสาขาที่ถูกต้อง


ฉันคิดว่า OP นั้นแตกต่างกัน สาขาเกิดขึ้นกับฉัน
Chaklader Asfak Arefe

1

นี่คือคำสั่ง:

git fetch origin
git merge origin/somebranch somebranch

หากคุณทำสิ่งนี้ในบรรทัดที่สอง:

git merge origin somebranch

มันจะพยายามรวมผู้เชี่ยวชาญท้องถิ่นเข้ากับสาขาปัจจุบันของคุณ

คำถามที่ผมได้เข้าใจว่ามันถูกเรียกคุณแล้วทั้งในประเทศและต้องการตอนนี้ผสานสาขาล่าสุดของเดียวกันสาขา

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