git: ความแตกต่างระหว่าง "รำชื่อ" และ "อ้างอิง / หัว / รำมะนาด"


97

ตัวอย่างที่ดีที่สุดที่จะอธิบาย: ฉันอยู่ในสาขา 0.58 ของที่เก็บและนี่คือวิธีที่ฉันดึง:

git pull origin 0.58

เมื่อฉันเรียก "git pull" ฉันจะได้รับ:

ip238:openlierox az$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.0.58.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.0.58.remote = <nickname>
    branch.0.58.merge = <remote-ref>
    remote.<nickname>.url = <url>
    remote.<nickname>.fetch = <refspec>

See git-config(1) for details.

ดูเหมือนว่าฉันอาจจะลืมตัวเลือกบางอย่าง (--track?) เมื่อฉันตรวจสอบสาขานั้น อย่างไรก็ตามฉันได้ตั้งค่านี้แล้ว:

git config branch.0.58.merge 0.58
git config branch.0.58.remote origin

และดูเหมือนว่าจะได้ผล จากนั้นเพียงเพราะความสนใจฉันจึงดูสาขาอื่นเกี่ยวกับการตั้งค่าเหล่านี้:

ip238:openlierox az$ git config branch.0.57.merge
refs/heads/0.57
ip238:openlierox az$ git config branch.0.57.remote
origin

ฉันสงสัยว่าตอนนี้มีความแตกต่างระหว่าง "0.58" หรือฉันควรระบุ "refs / head / 0.58"?

ความแตกต่างคืออะไร?


1
เพียงเพื่อที่อยู่ typo ในชื่อเรื่อง(ไม่ล้อเล่นกับชื่อเก่าโดยการปรับเปลี่ยนได้ในขณะนี้)ก็ควรอ่าน"refs / หัว / BRANCHNAME" , headsกับ "S"
RomainValeri

คำตอบ:


129

A refคืออะไรก็ได้ที่ชี้ไปยังคอมมิตตัวอย่างเช่น branch (หัว) แท็กและรีโมตแบรนช์ คุณควรเห็นหัวรีโมทและแท็กใน.git/refsไดเร็กทอรีของคุณโดยสมมติว่าคุณมี refs ทั้งสามประเภทในที่เก็บของคุณ

refs/heads/0.58ระบุสาขาชื่อ 0.58 หากคุณไม่ระบุว่ามีการอ้างอิงในเนมสเปซใด git จะดูเป็นค่าเริ่มต้น สิ่งนี้ทำให้การใช้เพียง 0.58 มีความคลุมเครือ - คุณสามารถมีทั้ง branch และ tag ที่ชื่อ 0.58


3
ขอบคุณมากสิ่งนี้อธิบายได้ดีมาก มันใช้งานได้กับ "0.58" แบบธรรมดาเนื่องจากไม่มีแท็กที่มีชื่อดังกล่าว
Albert

1
ถูกต้องโดยพื้นฐานแล้วจะดีอย่างสมบูรณ์ แต่ก็ปลอดภัยดี
Cascabel

คำตอบนี้คือขุมทรัพย์ ในที่สุดก็มีคนอธิบาย Git และฉันก็สนุกกับมัน! ขอบคุณ.
aderchox

9
นี่คือทั้งหมดของพวกเขาเพื่อความชัดเจน: refs/heads/และrefs/remotes/และrefs/tags/
จิม Aho

41

สำหรับคนที่อยากรู้อยากเห็น - git show-refซึ่งมีให้ตั้งแต่ Git v1.8.2.2 จะแสดงข้อมูลอ้างอิงทั้งหมดที่คุณมีในพื้นที่เก็บข้อมูลในเครื่องของคุณ


3
นอกจากนี้git log --decorate=fullจะแสดงชื่อเต็มของการอ้างอิงในประวัติศาสตร์
galath

19

ดูbranchNameจำเป็นต้องได้รับการแก้ไขอย่างสมบูรณ์ก่อนที่ GIT จะสามารถระบุได้จริง refs/heads/branchNameชื่อการแก้ไขอย่างเต็มที่จะเป็น

หนึ่งในคำสั่งที่มีชื่อเสียงgit checkout branchNameจะแก้ไขคำสั่งดังกล่าวโดยอัตโนมัติเพื่อระบุตำแหน่งที่คุณต้องการชำระเงิน โปรดทราบว่ามันทำโดยอัตโนมัติดังนั้นเราจึงไม่เคยเขียนมันทั้งหมดด้วยตัวเอง

มันทำได้อย่างไร? ให้เราดูที่นี่

refname : เช่นmaster, heads/master,refs/heads/master

ชื่ออ้างอิงที่เป็นสัญลักษณ์ refs/heads/masterต้นแบบเช่นมักจะหมายถึงวัตถุที่กระทำโดยอ้างอิงจาก หากคุณมีทั้งสองอย่าง heads/masterและtags/masterคุณสามารถพูดอย่างชัดเจนheads/masterเพื่อบอก Git ว่าคุณหมายถึงอะไร เมื่อมีความคลุมเครือ a <refname>จะถูกทำให้สับสนโดยการจับคู่ครั้งแรกตามกฎต่อไปนี้:

1.If $GIT_DIR/<refname>มีอยู่นั่นคือสิ่งที่คุณหมายถึง (ซึ่งมักจะเป็นประโยชน์สำหรับHEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADและ CHERRY_PICK_HEAD);

2. มิฉะนั้นrefs/<refname>หากมีอยู่

3. มิฉะนั้นrefs/tags/<refname>หากมีอยู่

4. มิฉะนั้นrefs/heads/<refname>หากมีอยู่

5. มิฉะนั้นrefs/remotes/<refname>หากมีอยู่

6. มิฉะนั้นrefs/remotes/<refname>/HEADหากมีอยู่

ดังนั้นโดยขั้นตอนที่ 6 branchNameข้างต้นก็พยายามที่จะแก้ไขสิ่งที่เป็นนี้ ดังนั้นเราไม่จำเป็นต้องให้ branchName ที่ได้รับการแก้ไขอย่างสมบูรณ์

ดูที่นี่และที่นี่ด้วย

ไปที่.gitไดเรกทอรีของคุณและดูภายในrefโฟลเดอร์

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