การเลือกเพียงสาขาเดียว: 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/config
branch.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 )