การเลือกเพียงสาขาเดียว: 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 สาขาที่แตกต่างกันที่ต้องระวัง:
- สาขาบน repo ระยะไกล:
refs/heads/branchBภายใน repo อื่น
- ของคุณ สาขาการติดตามระยะไกล :
refs/remotes/remoteR/branchBในrepo ของคุณ
- สาขาของคุณเอง:
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, ฯลฯ
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 )