FETCH_HEAD ใน Git หมายถึงอะไร


221

git pull --help พูดว่า:

ในโหมดเริ่มต้นของgit pullคือชวเลขตามมาด้วยgit fetchgit merge FETCH_HEAD

นี้คืออะไรFETCH_HEADและสิ่งที่ผสานระหว่างจริงgit pull?


3
หมายเหตุ: เนื่องจากคอมไพล์ 1.8.4 (สิงหาคม 2013), git fetch origin masterจริงจะอัปเดตไม่เพียงorigin/master FETCH_HEADดูstackoverflow.com/a/20967347/6309
VonC

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับgit merge FETCH_HEAD(ตั้งแต่ Git 2.5, ไตรมาสที่ 2 ปี 2558) ดูstackoverflow.com/a/30425991/6309
VonC

คำตอบ:


218

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

ผลลัพธ์คือสิ่งที่คุณคาดหวัง: การกระทำที่ปลายสุดของสาขาระยะไกลที่เหมาะสมจะถูกรวมเข้ากับการส่งที่ปลายสุดของสาขาปัจจุบันของคุณ

นี่เป็นเหมือนการทำgit fetchโดยไม่มีข้อโต้แย้ง (หรือgit remote update) อัปเดตสาขาระยะไกลทั้งหมดของคุณจากนั้นทำงานgit merge origin/<branch>แต่ใช้FETCH_HEADภายในแทนการอ้างถึงการอ้างอิงใด ๆ ก็ตามที่ดึงมาแทนที่จะต้องตั้งชื่อสิ่งต่าง ๆ


9
@Jefromi: ขอโทษผมคิดว่าคุณจะไม่ถูกต้อง: เท่าที่ผมเข้าใจgit fetchการปรับปรุง (ผสาน) ข้อมูลของวัตถุทั้งหมดจากการจัดเก็บข้อมูลระยะไกลไม่ได้เป็นเพียงบรันช์ ดังนั้นผมจึงไม่เข้าใจจากคำตอบของคุณวิธีการคอมไพล์ตัดสินใจที่จะเคล็ดลับของการที่สาขาไปยังจุด ฉันยังไม่พบในเอกสารระบบคอมไพล์ (คำจำกัดความไม่ใช่ตัวอย่าง) การดำรงอยู่ของรูปลักษณ์ที่ให้ฉันมากขึ้นเช่นการแก้ปัญหาเพื่อให้ทำงานอย่างใด FETCH_HEADFETCH_HEADFETCH_HEADgit pull
Alexey

14
Alexey: FETCH_HEADสอดคล้องกับส่วนปลายของรีโมตสาขาที่ระบุโดยbranch.<BRANCH>.mergeในคอนฟิกูเรชันที่เก็บโลคัล ดังนั้นในขณะที่fetchดึงข้อมูลวัตถุทั้งหมดจากที่จัดเก็บข้อมูลระยะไกลได้จริงFETCH_HEADจะใช้เพื่อระบุว่าที่สาขาระยะไกลที่ติดตามโดยสาขาในพื้นที่มีขั้นสูง ดังนั้นหากคุณอยู่ในmasterสาขาท้องถิ่นและทำงานgit fetchและbranch.master.mergeชี้ไปที่refs/heads/masterแล้วFETCH_HEADจะมีค่าเดียวกันorigin/masterทันทีหลังจากการดำเนินการดึงข้อมูล
larsks

4
@alexy FETCH_HEAD ได้อธิบายไว้ในย่อหน้าที่สองของคำอธิบายของ git fetch ใน man page ของมัน คำตอบของฉันถูกต้อง และการเรียก git โดยไม่มีข้อโต้แย้งจะอัปเดตสาขาระยะไกลทั้งหมดสำหรับรีโมตเริ่มต้น ... แต่นี่ไม่เหมือนกับการผสาน
Cascabel

4
จะเป็นFETCH_HEADอย่างไรถ้าคุณดึงสาขาจากระยะไกลทั้งหมดผ่านgit fetch -a?
stigi

2
@stigi คำแนะนำของสาขาการติดตามระยะไกลที่สาขาที่คุณชำระเงินแล้วซึ่งชี้ไปที่การกำหนดค่า git โปรดดูคำตอบของ larsks ในความคิดเห็นด้านบน
Ankur Agarwal

19

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

ดังนั้นถ้าฉันออก:

git fetch https://github.com/ryanmaxwell/Fragaria

FETCH_HEAD อาจมี

3cfda7cfdcf9fb78b44d991f8470df56723658d3        https://github.com/ryanmaxwell/Fragaria

หากฉันมี repo ระยะไกลที่กำหนดค่าเป็นสาขาการติดตามระยะไกลจากนั้นฉันสามารถติดตามการดึงข้อมูลของฉันด้วยการรวมสาขาการติดตาม ถ้าฉันทำไม่ได้ฉันสามารถรวมปลายของการดึงข้อมูลล่าสุดโดยตรงโดยใช้ FETCH_HEAD

git merge FETCH_HEAD

1
ในการเพิ่ม 5 เซนต์ของฉัน สิ่งที่ทำให้ฉันสับสนคือ FETCH_HEAD ของฉันอยู่หลังการกระทำล่าสุดแม้ว่าจะใช้การดึงข้อมูลใหม่ที่ส่งกลับมาว่า "ไม่มีการเปลี่ยนแปลง" (ในคราส) ฉันคิดว่าเหตุผลก็คือการเปลี่ยนแปลงทั้งหมดตั้งแต่การดึงข้อมูลครั้งล่าสุดของฉันมาจากตัวฉันเองและถูกผลักไปยังเซิร์ฟเวอร์โดยฉัน ดังนั้นการดึงข้อมูลครั้งต่อมาจึงไม่ทำอะไรเลยและไม่ได้อัพเดต FETCH_HEAD ฉันไม่แน่ใจว่านี่เป็นข้อบกพร่องของการใช้ GIT หรือ Eclipse Git หรือไม่
Torge

11

ดังที่ได้กล่าวไว้ในคำตอบของ Jonathan FETCH_HEAD นั้นสอดคล้องกับไฟล์.git/FETCH_HEADดังกล่าว โดยทั่วไปไฟล์จะมีลักษณะดังนี้:

71f026561ddb57063681109aadd0de5bac26ada9                        branch 'some-branch' of <remote URL>
669980e32769626587c5f3c45334fb81e5f44c34        not-for-merge   branch 'some-other-branch' of <remote URL>
b858c89278ab1469c71340eef8cf38cc4ef03fed        not-for-merge   branch 'yet-some-other-branch' of <remote URL>

สังเกตว่าทุกสาขามีการทำเครื่องหมายnot-for-mergeอย่างไร สิ่งที่แปลกคือสาขาที่เช็คเอาต์ก่อนดึงข้อมูล โดยสรุป: FETCH_HEAD เป็นหลักสอดคล้องกับรุ่นระยะไกลของสาขาที่เช็คเอาท์ในปัจจุบัน


9

FETCH_HEADฉันเพิ่งค้นพบและนำมาใช้ ฉันต้องการสำเนาซอฟต์แวร์ท้องถิ่นจากเซิร์ฟเวอร์และฉันก็ทำ

git fetch gitserver release_1

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

 git tag release_1 FETCH_HEAD 

เพื่อทำสำเนาของchain ที่ติดแท็กของ commits (release_1) จาก repository ระยะไกลถึง local การดึงข้อมูลพบแท็กระยะไกลคัดลอกการกระทำไปยังเครื่องท้องถิ่นของฉันไม่ได้สร้างแท็กท้องถิ่น แต่ตั้งค่าFETCH_HEADเป็นค่าการส่งข้อมูลเพื่อให้ฉันสามารถค้นหาและใช้งานได้ ฉันใช้FETCH_HEADเพื่อสร้างแท็กโลคัลซึ่งจับคู่กับแท็กบนรีโมต นี่เป็นภาพประกอบที่ใช้งานได้จริงของสิ่งที่FETCH_HEADเป็นและวิธีการใช้งานและอาจเป็นประโยชน์กับคนอื่นที่สงสัยว่าเหตุใดการดึงข้อมูลคอมไพล์ไม่ได้ทำในสิ่งที่คุณคาดหวังอย่างไร้เหตุผล

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

git fetch gitserver release_1:release_1

คือการเรียกใช้ release_1 และเรียกว่า release_1 ในพื้นที่ (เป็นแหล่งที่มา: ปลายทางดูhttps://git-scm.com/book/en/v2/Git-Internals-The-Refspecในกรณีที่คุณต้องการตั้งชื่ออื่น!)

คุณอาจต้องการใช้FETCH_HEADในบางครั้งแม้ว่า: -

git fetch gitserver bugfix1234
git cherry-pick FETCH_HEAD

อาจเป็นวิธีที่ดีในการใช้หมายเลขแก้ไขข้อบกพร่อง 1234 จากเซิร์ฟเวอร์ Git ของคุณและปล่อยให้การรวบรวมขยะของ Git เพื่อคัดลอกสำเนาจากเซิร์ฟเวอร์เมื่อการแก้ไขได้รับการหยิบเชอร์รี่ไปที่สาขาปัจจุบันของคุณ (ฉันสมมติว่ามีแท็ก clean ที่ดีที่คอมมิตซึ่งมีการแก้ไขบั๊กทั้งหมดบนเซิร์ฟเวอร์!)


ข้อเสนอแนะที่น่าสนใจ +1
VonC

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

3

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


3
@manjolds คุณหมายถึงอะไรโดย " หัวหน้ากระทำของสิ่งที่เรียก" Git ดึงข้อมูลทุกอย่างด้วยการดึงข้อมูล
Alexey

@Alexey จาก git manual: git-scm.com/docs/git-fetch : ชื่อ refs ที่ดึงมาพร้อมกับชื่อวัตถุที่ชี้ไปจะถูกเขียนไปยัง. git / FETCH_HEAD
PJ_Finnegan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.