Git branching: ต้นแบบเทียบกับต้นฉบับ / ต้นแบบเทียบกับรีโมท / แหล่งกำเนิด / ต้นแบบ


201

ฉันคิดว่าฉันถูกทางที่จะเข้าใจแนวคิดพื้นฐานของ git

ฉันได้ตั้งค่าและโคลนพื้นที่เก็บข้อมูลระยะไกลแล้ว ฉันยังสร้างที่เก็บข้อมูลว่างด้านเซิร์ฟเวอร์และเชื่อมโยงที่เก็บในเครื่องของฉันกับมัน

ปัญหาของฉันคือฉันไม่เข้าใจความแตกต่างระหว่าง:

  • แหล่งกำเนิด / ต้นแบบเทียบกับรีโมท / แหล่งกำเนิด / ต้นแบบ

เท่าที่ฉันเข้าใจอาจารย์เป็นสาขาท้องถิ่นและรีโมท / แหล่งกำเนิด / ต้นแบบเป็นรีโมต

แต่กำเนิด / ปรมาจารย์คืออะไร?


1
@ChristopherWallace: คุณกระตุ้นคำถามสองข้อเกี่ยวกับเมตาด้วยการแก้ไขของคุณ: " เราต้องการแท็ก [Origin] จริง ๆ หรือไม่? " และ " [Master] คืออะไรจริง ๆ "
Deduplicator

@Dupuplicator นั่นเป็นปัญหาหรือเปล่า
nbro

@ChristopherWallace: หลายคนคิดว่าแท็กทั้งสอง (แท็กที่คุณสร้างและแท็กที่คุณเพิ่งเพิ่ม) นั้นไม่ดี ฉันบังเอิญเห็นด้วย แต่บางทีคุณอาจมีบางสิ่งที่จะเพิ่มในการสนทนาที่ไม่ได้พิจารณา ถ้าไม่เป็นเช่นนั้น
Deduplicator


คำถามติดตามผล: ทำไมต้อง.git/refs/origin/masterลอยจากไป.git/refs/remotes/origin/master? สิ่งนี้กำลังเกิดขึ้นกับฉันในตอนนี้และฉันถูกทิ้งไป
พอล

คำตอบ:


219

ใช้โคลนของที่เก็บระยะไกลและเรียกใช้git branch -a(เพื่อแสดง git สาขาทั้งหมดรู้เกี่ยวกับ) มันอาจจะมีลักษณะเช่นนี้:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

นี่masterคือสาขาในพื้นที่เก็บข้อมูลท้องถิ่น remotes/origin/masterเป็นสาขาที่มีชื่อในการตั้งชื่อจากระยะไกลmaster originคุณสามารถอ้างถึงสิ่งนี้ได้เช่นorigin/masterเดียวกับใน:

git diff origin/master..master

นอกจากนี้คุณยังสามารถอ้างถึงมันเป็นremotes/origin/master:

git diff remotes/origin/master..master

นี่เป็นเพียงสองวิธีที่ต่างกันในการอ้างถึงสิ่งเดียวกัน (โดยบังเอิญคำสั่งทั้งสองนี้หมายถึง "แสดงการเปลี่ยนแปลงระหว่างmasterสาขาระยะไกลและmasterสาขาของฉัน)

remotes/origin/HEADเป็นสำหรับชื่อระยะไกลdefault branch originนี้ช่วยให้คุณเพียงแค่พูดแทนoriginorigin/master


5
คำตอบที่ดี. ฉันคิดว่าการgit branch -aแสดงสาขาระยะไกลเป็นremotes/origin/masterส่วนหนึ่งเพราะอ้างอิงพื้นฐานถูกเก็บไว้ใน.git/refs/remotes/origin(ถ้ายังไม่ได้บรรจุ) ในความคิดของฉันผลลัพธ์ของgit branch -aอาจมีความชัดเจนมากขึ้นโดยการแยกชื่อของรีโมทจากชื่อของสาขากับสิ่งอื่นที่ไม่ใช่สแลช
Matt Hurne

14
นอกจากนี้โปรดทราบว่าgit branch -rซึ่งจะแสดงเฉพาะสาขาระยะไกลเท่านั้นจะแสดงเฉพาะสาขาorigin/masterเนื่องจากremotes/ไม่จำเป็นต้องใช้คำนำหน้า
Matt Hurne

3
@ มิสเตอร์บิสกิต: มันเป็นเรื่องจริง ผลลัพธ์มีความสับสนมากกว่าการทำให้ชัดเจน ขอบคุณมากคำตอบที่ดีสำหรับคำถามของฉันที่ให้คำแนะนำที่ถูกต้องแก่ฉัน
John Rumpel

ถ้าฉันดูที่git logฉันเห็นcommit fa9sd8jasdf98 (HEAD -> master)สิ่งนี้หมายความว่าอย่างไร HEAD ในตัวอย่างนี้คืออะไร ฉันคิดว่าฉันเป็นอยู่ในปัจจุบัน "ต้นแบบ" และได้รับการ commiting origin/masterไป ฉันคิดว่าฉันมีอะไรบางอย่างปะปนกับใครบางคนช่วยได้บ้างไหม? ปรับปรุงแก้ไข: ฉันคิดว่าฉันเข้าใจแล้วถูกต้องหรือไม่ที่จะคิดว่าปัจจุบัน HEAD กำลังชี้ไปที่สาขาหลักซึ่งหมายความว่าฉันกำลังอยู่ระหว่างการรับปริญญา
เซบาสเตียนนีลเซ่น

@SebastianNielsen ใช่คุณพูดถูก HEAD -> ส่วนหลักหมายความว่าคุณอยู่ในสาขาหลักแล้ว
iRestMyCaseYourHonor

108

คำตอบสั้น ๆ สำหรับหุ่นเช่นฉัน (ขโมยมาจาก Torek):

  • Origin / masterคือ "ตำแหน่งที่อาจารย์อยู่ที่นั่นเมื่อฉันตรวจสอบครั้งล่าสุด"
  • ต้นแบบคือ "ที่ซึ่งต้นแบบอยู่ที่นี่โดยยึดตามสิ่งที่ฉันทำ"

9
Origin / master = สำรองข้อมูลของเครื่องระยะไกล, ปรับปรุงครั้งล่าสุดที่คุณตรวจสอบ master = สำเนาต้นทาง / ต้นแบบของคุณ
sakurashinken

40

ในทางเทคนิคแล้วไม่มี "รีโมต" อะไรเลยที่1ใน Git repo ของคุณมีเพียงชื่อในท้องที่ที่ควรจะตรงกับชื่อของอีก repo ที่ต่างกัน ชื่อที่origin/whateverเริ่มต้นจะจับคู่กับโฆษณาบน repo ที่คุณคัดลอกมาจาก:

git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where...

ทำสำเนาท้องถิ่นของ repo อื่น ๆ ไปตามทางที่มันบันทึกสาขาทุกคนที่อยู่ที่นั่นและกระทำเหล่านั้นหมายถึงการที่และ sticks เหล่านั้นลงใน repo refs/remotes/origin/ท้องถิ่นของคุณภายใต้ชื่อ

ขึ้นอยู่กับว่าคุณไปนานแค่ไหนก่อนที่คุณจะgit fetchเทียบเท่าหรืออัปเดต "สำเนาของฉันคืออะไรบางที่ที่ออกไปข้างนอก" พวกเขาอาจเปลี่ยนสาขาของพวกเขาไปรอบ ๆ สร้างสาขาใหม่และลบบางส่วน เมื่อคุณทำgit fetch(หรือgit pullที่เรียกจริง ๆ ว่าผสานบวก), repo ของคุณจะทำสำเนาของงานใหม่ของพวกเขาและเปลี่ยนrefs/remotes/origin/<name>รายการทั้งหมดตามที่ต้องการ มันเป็นช่วงเวลาที่fetchไอเอ็นจีที่ทำให้ทุกอย่างเข้ากันได้ (เช่นนั้นและโคลนเริ่มต้นและบางกรณีของpushไอเอ็นจีด้วย - โดยทั่วไปเมื่อใดก็ตามที่ Git ได้รับโอกาสตรวจสอบ - แต่ดูข้อแม้ด้านล่าง)

ปกติแล้ว Git จะอ้างถึงตัวคุณเองrefs/heads/<name>ว่าเป็นคนชอบธรรม<name>และคนที่อยู่ห่างไกลorigin/<name>และมันก็ใช้ได้ผลเพราะเห็นได้ชัดว่าอันไหนเป็นแบบไหน บางครั้งเป็นไปได้ที่จะสร้างชื่อสาขาของคุณเองซึ่งทำให้ไม่ชัดเจน แต่ไม่ต้องกังวลจนกว่าจะเกิดขึ้น :-) เพียงแค่ให้ชื่อที่สั้นที่สุดของ Git ที่ทำให้มันชัดเจนและมันจะไปจากที่นั่น: origin/masterคือ "ที่อาจารย์อยู่ที่นั่นครั้งสุดท้ายที่ฉันตรวจสอบ" และmaster"ที่อาจารย์อยู่ตรงนี้ตามสิ่งที่ฉันทำ" . เรียกใช้git fetchเพื่ออัปเดต Git บน "ตำแหน่งที่อยู่ตรงนั้น" ตามต้องการ


Caveat: ในรุ่น Git ที่เก่ากว่า 1.8.4 git fetchมีโหมดบางโหมดที่ไม่อัปเดต "ซึ่งต้นแบบอยู่ที่นั่น" (แม่นยำยิ่งขึ้นโหมดที่ไม่อัปเดตสาขาติดตามระยะไกล) เล่นgit fetch originหรือgit fetch --allหรือแม้เพียงแค่git fetch, ไม่ปรับปรุง เล่นไม่ได้git fetch origin master แต่น่าเสียดายที่นี้ "ไม่ได้อัปเดตโหมด" git pullถูกเรียกโดยสามัญ (นี่เป็นเพียงความรำคาญเล็กน้อยและได้รับการแก้ไขใน Git 1.8.4 และใหม่กว่า)


1มีสิ่งหนึ่งที่เรียกว่า "รีโมท" แต่นั่นก็เป็นท้องถิ่น! ชื่อoriginคือสิ่งที่ Git เรียกว่า "a remote" มันเป็นเพียงชื่อย่อสำหรับ URL ที่คุณใช้เมื่อคุณทำการโคลน นอกจากนี้ยังเป็นที่originในorigin/masterมาจาก ชื่อorigin/masterนี้เรียกว่าสาขาการติดตามระยะไกลซึ่งบางครั้งอาจย่อให้เป็น "สาขาย่อย" โดยเฉพาะในเอกสารที่เก่ากว่าหรือเป็นทางการมากกว่า


2
คำอธิบายที่ยอดเยี่ยมสำหรับมือใหม่อย่างฉันขอขอบคุณ! ชี้แจงว่าทำไมเธอถึงวางorigin/masterสติกเกอร์ลงบนlocalกราฟของ repo และไม่ติดบนสติ๊กเกอร์remote(ฉันขอแนะนำการนำเสนอ "Git Happens" ของเจสสิก้าเคอร์สำหรับคนใหม่git: vimeo.com/46010208ฉันเกาหัวระหว่าง 30:00 - 30: 19. )
ผู้สูงอายุ

11

ฉันจะพยายามทำให้คำตอบของ @ ErichBSchulz ง่ายขึ้นสำหรับผู้เริ่มต้น:

  • origin / masterคือสถานะของสาขาหลักบนที่เก็บรีโมต
  • masterคือสถานะของสาขาหลักบนที่เก็บโลคัล

1
ลองดี แต่ IMHO ไม่มีlast time I've checkedประเด็นสำคัญ
Alexei Martianov

6
  1. จุดกำเนิด - นี่คือชื่อที่กำหนดเองและพบบ่อยที่สุดที่จะชี้ไปที่ระยะไกล

$ git remote add origin https://github.com/git/git.git--- คุณจะเรียกใช้คำสั่งนี้เพื่อเชื่อมโยงโครงการ GitHub ของคุณเพื่อกำเนิด ต้นกำเนิดที่นี่มีผู้ใช้กำหนด คุณสามารถเปลี่ยนชื่อได้โดย$ git remote rename old-name new-name


  1. master - ชื่อสาขาเริ่มต้นใน Git คือ master สำหรับคอมพิวเตอร์ระยะไกลและท้องถิ่น

  1. origin / master - นี่เป็นเพียงตัวชี้เพื่ออ้างถึง master branch ใน repo ระยะไกล จำไว้ว่าฉันบอกว่าจุดกำเนิดเป็นรีโมท

$ git fetch origin- ดาวน์โหลดวัตถุและอ้างอิงจากพื้นที่เก็บข้อมูลระยะไกลไปยังเครื่องคอมพิวเตอร์ของคุณ [ที่มา / หลัก] นั่นหมายความว่ามันจะไม่ส่งผลกระทบต่อสาขาหลักในพื้นที่ของคุณเว้นแต่คุณจะใช้$ git merge origin/masterมัน อย่าลืมเช็คเอาต์สาขาที่ถูกต้องที่คุณต้องผสานก่อนที่จะเรียกใช้คำสั่งนี้

หมายเหตุ: เนื้อหาที่ดึงข้อมูลถูกแสดงเป็นสาขาระยะไกล การดึงข้อมูลช่วยให้คุณมีโอกาสตรวจสอบการเปลี่ยนแปลงก่อนที่จะรวมเข้ากับสำเนาโครงการของคุณ เพื่อแสดงการเปลี่ยนแปลงระหว่างคุณกับระยะไกล$git diff master..origin/master


5

หนึ่งการชี้แจง (และจุดที่ทำให้ฉันสับสน):

"รีโมท / กำเนิด / HEAD เป็นสาขาเริ่มต้น" ไม่ถูกต้องจริงๆ

remotes / origin / master เป็นสาขาเริ่มต้นในที่เก็บระยะไกล (ครั้งสุดท้ายที่คุณตรวจสอบ) HEAD ไม่ได้เป็นสาขา แต่เพียงชี้ไปที่สาขา

คิดว่า HEAD เป็นพื้นที่ทำงานของคุณ เมื่อคุณคิดว่าเป็นเช่นนี้แล้ว 'เช็คเอาต์ branchname' เหมาะสมกับการเปลี่ยนไฟล์ในที่ทำงานของคุณให้เป็นสาขาเฉพาะ คุณ "ชำระเงิน" ไฟล์สาขาในพื้นที่ทำงานของคุณ HEAD สำหรับวัตถุประสงค์ในทางปฏิบัติทั้งหมดคือสิ่งที่คุณมองเห็นได้ในพื้นที่ทำงานของคุณ


แม่นยำมากขึ้นHEADคือ "ตัวชี้ไปยังสาขา" (ไฟล์จริงใน repo ท้องถิ่นของคุณมักจะมีสตริงref: refs/heads/masterเช่น ... เว้นแต่จะเป็น "เดี่ยว" ซึ่งเป็นสิ่งอื่นทั้งหมด) อย่างไรก็ตามมีข้อผิดพลาดหลายอย่างในการcloneตีความ "remote HEAD": โปรโตคอลการโอนไม่สามารถส่งสาขาทางอ้อมได้เลยเพียงแค่ SHA-1 แบบดิบๆดังนั้น git จึงมี kludge ที่ทำให้สิ่งนี้ใช้งานได้เป็นส่วนใหญ่ ทุกครั้งในขณะที่มีคนสะดุดกรณีที่แปลก ชนิดของฉันปรารถนาคอมไพล์ไม่ได้สร้างremotes/origin/HEADที่ทุกคนโดยเฉพาะอย่างยิ่งเมื่อมันออกมาผิด ...
torek

2

ฉันคิดว่าสัญกรณ์เครื่องหมายทับนี้น่าจะเข้าใจได้ดีที่สุดโดยการดูใน.gitโฟลเดอร์ของคุณ


ตัวอย่างเช่นที่นี่เป็นต้นไม้ที่ค่อนข้างสั้นของ. git ของฉันสำหรับฐานข้อมูล LibreOffice

ในlinux sudo apt-get install treeมีประโยชน์ที่จะดูนี้
ในWindowsฉันคิดว่าtreeคำสั่งอาจยังใช้งานได้

เลื่อนลงและดู refs (aka 'การอ้างอิง') ใกล้ด้านล่าง:

$ tree  
.  
├── branches  
├── config  
├── description  
├── FETCH_HEAD  
├── gitk.cache  
├── HEAD  
├── hooks  
│   ├── applypatch-msg.sample  
    ...
├── index  
├── info  
│   └── exclude  
├── logs  
│   ├── HEAD  
│   └── refs  
│       ├── heads  
│       │   ├── master  
│       │   └── remotes  
│       │       └── origin  
│       └── remotes  
│           └── origin  
│               ├── distro  
│               │   ├── cib  
│               │   │   └── libreoffice-6-0  
│               │   ├── collabora  
│               │   │   └── cp-6.0  
│               │   └── lhm  
│               │       └── libreoffice-5-2+backports  
│               ├── HEAD  
│               ├── libreoffice-6-2  
│               ├── master  
│               └── private  
│                   └── mst  
│                       └── sw_redlinehide_4a  
├── objects  
│   ├── info  
│   └── pack  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.idx  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.pack  
│       ├── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.idx  
│       └── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.pack  
├── ORIG_HEAD  
├── packed-refs  
└── refs  
    ├── heads  
    │   ├── master  
    │   └── remotes  
    │       └── origin  
    ├── remotes  
    │   └── origin  
    │       ├── distro  
    │       │   ├── cib  
    │       │   │   └── libreoffice-6-0  
    │       │   ├── collabora  
    │       │   │   └── cp-6.0  
    │       │   └── lhm  
    │       │       └── libreoffice-5-2+backports  
    │       ├── HEAD  
    │       ├── libreoffice-6-2  
    │       ├── master  
    │       └── private  
    │           └── mst  
    │               └── sw_redlinehide_4a  
    └── tags  
        └── libreoffice-6-2-branch-point  

32 directories, 45 files

อาจทำให้สับสนน้อยกว่าหากวางไว้เช่นนี้ แต่ไม่:

repositories (i.e. independent trees)
├──local
│  └──master
│
└──origin1
│  └──master
└──origin2
   └──master

เรามีสามประเภทพื้นฐานของการอ้างอิง: หัว , รีโมทและแท็ก

  • .git / refs / หัวถือในท้องถิ่นของเราต้นแบบ

  • .git / refs / remotesสามารถเก็บรีโมตได้จำนวนหนึ่งแม้ว่าในขณะนี้เรามีแหล่งกำเนิดอยู่ในนั้นเท่านั้น

  • .git / refs / tags (มีการกล่าวถึงที่อื่น)

ต้นกำเนิดจึงเป็นหนึ่งเดียวของเราและห่างไกล มันถือกำเนิด / Master


เราพบว่าเรามี 2 HEADS (ตัวชี้ไปยังสาขาปัจจุบัน) หนึ่งแห่งในท้องถิ่นและหนึ่งแห่งจากระยะไกล:

$ cat .git/HEAD                        #         local:  HEAD -> master
ref: refs/heads/master

$ cat .git/refs/remotes/origin/HEAD    # remote origin:  HEAD -> master
ref: refs/remotes/origin/master

หากคุณแสดงรายการสาขาของคุณ:

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/aoo/aw080
  remotes/origin/aoo/trunk
  remotes/origin/distro/capgemini/cg-4.1
  remotes/origin/distro/cib/libreoffice-5-0
  remotes/origin/distro/cib/libreoffice-5-1
  remotes/origin/distro/cib/libreoffice-5-2
  ...
  • สาขาแรกที่ระบุไว้ ( มาสเตอร์ ) เป็นสาขาเดียวที่ไม่ใช่รีโมต ดังนั้นในกรณีนี้เรามีสาขาท้องถิ่นหนึ่งสาขา นี่คือที่ที่เราจะเริ่มงานของตัวเองจากสำหรับสาขาใหม่ของเราเองและความมุ่งมั่นที่ตามมา

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

  • ดังนั้นบรรทัดที่สองคือตัวชี้สาขาของแหล่งกำเนิดในปัจจุบัน รีโมท / แหล่งกำเนิด: HEAD - ชี้ไปที่ -> master นี่แสดงให้เห็นว่าในที่เก็บระยะไกลสาขาปัจจุบันคือสาขาของพวกเขาที่ชื่อว่าmaster (เพื่อไม่ให้สับสนกับสาขาในท้องถิ่นของเราที่ชื่อว่าmaster )

  • ไม่พบสาขาที่เหลือใน. git / refs / tree ของคุณ แต่คุณจะพบสาขาเหล่า.git/packed-refsนั้น

เมื่อเราดึงข้อมูลเราดาวน์โหลดการเปลี่ยนแปลงจากพื้นที่เก็บข้อมูลระยะไกลเข้าสู่พื้นที่เก็บข้อมูลติดตามระยะไกลของเรา

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

(เมื่อเราคอมไพล์เราจะทำทั้งสองขั้นตอนนี้ในการทำงานครั้งเดียว)


เป็นที่น่าสนใจที่จะบันทึกUUID ในพื้นที่และระยะไกลสำหรับMasterในปัจจุบันชี้ไปที่โหนดเดียวกัน (aka 'commit'):

$ cat refs/heads/master                   # local         master
1ca409292272632f443733450313de5a82c54a9c

$ cat refs/remotes/origin/master          # remote origin master
1ca409292272632f443733450313de5a82c54a9c

ดังนั้นอาจารย์ในพื้นที่ของเราชี้ไปที่เดียวกับที่มาของต้นแบบ:

[local] master = [remote] origin master

ในที่สุดฉันคิดว่ามันมีประโยชน์ที่จะดู .git/packed-refs

$ cat packed-refs 
# pack-refs with: peeled fully-peeled 
3c1d4742e649fe9c8aed8c2817fe3e1f3364f298 refs/remotes/origin/aoo/aw080
e87c8b7922e9a73e0abb7f9a7a47c9ac3374a826 refs/remotes/origin/aoo/trunk
b70fdffb041c12f124dcc0822b61bf3450e53137 refs/remotes/origin/distro/capgemini/cg-4.1
5dbc3f1754809b9489faaf380b1a4bdbcfbb6205 refs/remotes/origin/distro/cib/libreoffice-5-0
cfdbc96ca47d68d6785fd21829a8d61f49d6e591 refs/remotes/origin/distro/cib/libreoffice-5-1
5189c8c47461ef09739086e55512fc6a10245273 refs/remotes/origin/distro/cib/libreoffice-5-2
3bee5917569ca8e6ee3b086458f5b1a917b88ca1 refs/remotes/origin/distro/cib/libreoffice-5-3
92fbe703f9ca480d3a2b8610d87e991c729edf77 refs/remotes/origin/distro/cib/libreoffice-5-4
05c0a5df66cc69d75280f05b804cf82f3387d42b refs/remotes/origin/distro/cib/libreoffice-6-0
7fe193e759b24b90852e6e327115b77114d7b119 refs/remotes/origin/distro/cib/libreoffice-6-1
8187f7aa413e7ef7b377eea2b057d336bf256867 refs/remotes/origin/distro/collabora/cd-5.3
7a6b608591e21ef61dc05cff9fc58da531035755 refs/remotes/origin/distro/collabora/cd-5.3-3.1
....

ไม่ต้องสงสัยเลยว่าคำถามนี้มีคำตอบมากกว่าคำตอบ แต่ฉันคิดว่ามันสามารถช่วยให้คุณตอบคำถามของคุณเองได้ว่าอะไรคือสิ่งที่เกิดขึ้น

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