กลับไปหน้าบทความ

อ่าน 25 นาที

กิต

Git ( / ɡ ɪ t / ⓘ [ 8 ] ) เป็น ระบบซอฟต์แวร์ ควบคุมเวอร์ชันแบบกระจาย [ 9 ] ที่สามารถ จัดการเวอร์ชัน ของซอร์สโค้ดหรือข้อมูลได้ มักใช้เพื่อควบคุม ซอร์สโค้ด โดย โปรแกรมเมอร์ ที่...

กิต

กิต
ผู้เขียนต้นฉบับลินัส ทอร์วัลด์ส[ 1 ]
นักพัฒนาจูนิโอ ฮามาโนะ และคนอื่นๆ[ 2 ]
ปล่อย7  เมษายน 2548 ( 7 เมษายน 2548 )
เวอร์ชันเสถียร
2.55.0 [ 3 ] / 29 มิถุนายน 2026 แก้ไขข้อมูลนี้บนวิกิดาต้า
เขียนเป็นส่วนใหญ่เขียนด้วยภาษาCโดยมีGUIและสคริปต์การเขียนโปรแกรมที่เขียนด้วยสคริปต์ Shell , Perl , TclและPython [ 4 ] [ 5 ]
ระบบปฏิบัติการPOSIX ( Linux , macOS , Solaris , AIX ), Windows
มีจำหน่ายในภาษาอังกฤษ
พิมพ์การควบคุมเวอร์ชัน
ใบอนุญาตGPL-2.0 เท่านั้น[ i ] [ 7 ]
เว็บไซต์git-scm .com แก้ไขข้อมูลนี้บนวิกิดาต้า
ที่เก็บข้อมูล
  • git .kernel .org /pub /scm /git /git .git

Git ( / ɡ ɪ t /[ 8 ] ) เป็นระบบซอฟต์แวร์ควบคุมเวอร์ชันแบบกระจาย [ 9 ]ที่สามารถจัดการเวอร์ชันของซอร์สโค้ดหรือข้อมูลได้ มักใช้เพื่อควบคุมซอร์สโค้ดโดยโปรแกรมเมอร์ที่พัฒนาซอฟต์แวร์ร่วมกันเดิมทีสร้างขึ้นโดยLinus Torvaldsเพื่อการควบคุมเวอร์ชันในการพัฒนาเคอร์เนลLinux [ 10 ]

เป้าหมายการออกแบบของ Git ได้แก่ ความเร็วความสมบูรณ์ของข้อมูลและการสนับสนุน เวิร์กโฟลว์ แบบกระจายและไม่เป็นเชิงเส้น — สาขาคู่ขนานหลายพัน สาขา ที่ทำงานบนคอมพิวเตอร์ที่แตกต่างกัน[ 11 ] [ 12 ] [ 13 ]

เช่นเดียวกับระบบควบคุมเวอร์ชันแบบกระจายอื่นๆ ส่วนใหญ่ และแตกต่างจาก ระบบ ไคลเอ็นต์-เซิร์ฟเวอร์ ส่วนใหญ่ Git จะเก็บสำเนาของที่เก็บข้อมูลทั้งหมดไว้ในเครื่องโลคัลซึ่งเรียกอีกอย่างว่า "repo" พร้อมประวัติและความสามารถในการติดตามเวอร์ชัน โดยไม่ขึ้นอยู่กับ การเข้าถึง เครือข่าย หรือ เซิร์ฟเวอร์กลาง ที่ เก็บข้อมูลจะถูกจัดเก็บไว้ในคอมพิวเตอร์แต่ละเครื่องในไดเร็กทอรี มาตรฐาน พร้อม ไฟล์ที่ซ่อนอยู่เพิ่มเติมเพื่อให้ความสามารถในการควบคุมเวอร์ชัน[ 14 ] Git มีคุณสมบัติในการซิงโครไนซ์การเปลี่ยนแปลงระหว่างที่เก็บข้อมูลที่ใช้ประวัติร่วมกัน สำหรับการทำงานร่วมกันแบบอะซิงโครนัส คุณสมบัตินี้จะขยายไปยังที่เก็บข้อมูลบนเครื่องระยะไกล แม้ว่าที่เก็บข้อมูลทั้งหมด (ที่มีประวัติเดียวกัน) จะเป็นเพื่อนร่วมงานกัน นักพัฒนาซอฟต์แวร์มักใช้เซิร์ฟเวอร์กลางเพื่อโฮสต์ที่เก็บข้อมูลเพื่อเก็บสำเนาที่รวมเข้าด้วยกัน

ปัจจุบัน Git เป็นระบบควบคุมเวอร์ชันที่นักพัฒนาซอฟต์แวร์ใช้กันมากที่สุด เป็นระบบควบคุมเวอร์ชันแบบกระจายที่ได้รับความนิยมมากที่สุด[ 15 ] [ 16 ]โดยมีนักพัฒนาเกือบ 95% รายงานว่าเป็นระบบควบคุมเวอร์ชันหลักของพวกเขาในปี 2022 [ 17 ]เป็นเครื่องมือจัดการซอร์สโค้ดที่ใช้กันอย่างแพร่หลายที่สุดในหมู่นักพัฒนามืออาชีพ มี แพลตฟอร์มซอฟต์แวร์ หลายแห่ง ที่ให้บริการ Git repository รวมถึง GitHub , SourceForge , BitbucketและGitLab [ 18 ] [ 19 ] [ 20 ] [ 21 ] [ 22 ]

Git เป็นซอฟต์แวร์โอเพนซอร์สฟรีที่เผยแพร่ภายใต้ใบอนุญาต GPL-2.0เท่านั้น

เครื่องหมายการค้า "Git" ได้รับการจดทะเบียนโดยSoftware Freedom Conservancy

ประวัติศาสตร์

Torvalds เริ่มพัฒนา Git ในเดือนเมษายน พ.ศ. 2548 หลังจากที่ใบอนุญาต ฟรี สำหรับBitKeeper ซึ่งเป็นระบบ การจัดการควบคุมแหล่งที่มา(SCM) ที่เป็นกรรมสิทธิ์ซึ่งใช้สำหรับการพัฒนาเคอร์เนล Linux ตั้งแต่ปี พ.ศ. 2545 ถูกเพิกถอนสำหรับ Linux [ 23 ] [ 24 ] Larry McVoyผู้ถือลิขสิทธิ์ของ BitKeeper อ้างว่าAndrew Tridgellได้สร้างSourcePullerโดยการวิศวกรรมย้อนกลับโปรโตคอลของ BitKeeper [ 25 ]เหตุการณ์เดียวกันนี้ยังกระตุ้นให้เกิดการสร้างMercurial ซึ่ง เป็นระบบควบคุมเวอร์ชันอีกระบบหนึ่ง

Torvalds ต้องการระบบกระจายที่เขาสามารถใช้งานได้เหมือน BitKeeper แต่ไม่มีระบบฟรีใดที่ตรงกับความต้องการของเขา เขายกตัวอย่างระบบการจัดการควบคุมแหล่งที่มาที่ต้องใช้เวลา 30 วินาทีในการใช้แพตช์และอัปเดตเมตาเดตาที่เกี่ยวข้องทั้งหมด และตั้งข้อสังเกตว่าสิ่งนี้จะไม่สามารถรองรับความต้องการของการพัฒนาเคอร์เนล Linux ได้ ซึ่งการซิงโครไนซ์กับผู้ดูแลคนอื่นๆ อาจต้องดำเนินการดังกล่าวถึง 250 ครั้งในคราวเดียว สำหรับเกณฑ์การออกแบบของเขา เขาได้ระบุว่าการใช้แพตช์ไม่ควรใช้เวลาเกินสามวินาที และเพิ่มเป้าหมายอีกสามข้อ: [ 11 ]

  • ยกตัวอย่างระบบเวอร์ชันพร้อมกัน (CVS) เป็นตัวอย่างว่าไม่ควรทำอะไร หากไม่แน่ใจ ให้ตัดสินใจตรงกันข้ามโดยสิ้นเชิง[ 13 ]
  • รองรับเวิร์กโฟลว์แบบกระจายที่คล้ายกับ BitKeeper [ 13 ]
  • รวมถึงมาตรการป้องกันการทุจริตที่เข้มงวดมาก ไม่ว่าจะเป็นโดยบังเอิญหรือโดยเจตนา[ 12 ]

เกณฑ์เหล่านี้กำจัดระบบควบคุมเวอร์ชันทั้งหมดที่ใช้ในขณะนั้น ดังนั้นทันทีหลังจากการเปิดตัวการพัฒนาเคอร์เนล Linux 2.6.12-rc2 Torvalds จึงเริ่มเขียนระบบของตนเอง[ 13 ]

การพัฒนา Git เริ่มขึ้นเมื่อวันที่ 3 เมษายน พ.ศ. 2548 [ 26 ] Torvalds ประกาศโครงการเมื่อวันที่ 6 เมษายน และเริ่มให้บริการแบบโฮสต์เองในวันถัดมา[ 26 ] [ 27 ]การรวมสาขาหลายสาขาครั้งแรกเกิดขึ้นเมื่อวันที่ 18 เมษายน[ 28 ] Torvalds บรรลุเป้าหมายด้านประสิทธิภาพของเขา เมื่อวันที่ 29 เมษายน Git ที่เพิ่งเริ่มต้นได้รับการทดสอบประสิทธิภาพโดยบันทึกแพตช์ไปยังโครงสร้างเคอร์เนล Linux ด้วยอัตรา 6.7 แพตช์ต่อวินาที[ 29 ]เมื่อวันที่ 16 มิถุนายน Git จัดการการเผยแพร่เคอร์เนลเวอร์ชัน 2.6.12 [ 30 ]

Torvalds ได้มอบหมายการบำรุงรักษาให้กับ Junio ​​Hamano ซึ่งเป็นผู้มีส่วนร่วมสำคัญในโครงการนี้เมื่อวันที่ 26 กรกฎาคม พ.ศ. 2548 [ 31 ] Hamano รับผิดชอบในการเปิดตัวเวอร์ชัน 1.0 เมื่อวันที่ 21 ธันวาคม พ.ศ. 2548 [ 32 ]

การตั้งชื่อ

Torvalds พูดติดตลกเกี่ยวกับชื่อgit (ซึ่งเป็น คำแสลง ภาษาอังกฤษแบบบริติชที่หมายถึงคนที่ไม่น่าคบหาหรือโง่เขลา): "ผมเป็นไอ้สารเลวที่เห็นแก่ตัว และผมตั้งชื่อโปรเจกต์ทั้งหมดตามชื่อตัวเอง ก่อนหน้านี้ ' Linux ' ตอนนี้ 'git'" [ 33 ] [ 34 ]หน้าคู่มืออธิบาย Git ว่าเป็น "ตัวติดตามเนื้อหาที่โง่เขลา" [ 35 ]

ไฟล์readmeของซอร์สโค้ดอธิบายเพิ่มเติมดังนี้: [ 36 ]

คำว่า "git" สามารถหมายถึงอะไรก็ได้ ขึ้นอยู่กับอารมณ์ของคุณ

  • เป็นการรวมตัวอักษรสามตัวแบบสุ่มที่ออกเสียงได้ และไม่ได้ถูกใช้ในคำสั่ง UNIX ทั่วไปใดๆ ข้อเท็จจริงที่ว่ามันเป็นการออกเสียงผิดของคำว่า "get" อาจมีความเกี่ยวข้องหรือไม่เกี่ยวข้องก็ได้
  • โง่เขลา น่าดูถูก และเลวทราม ง่ายๆ เลย เลือกเอาสักคำจากพจนานุกรมคำสแลงก็ได้
  • "แอปติดตามข้อมูลทั่วโลก": คุณอารมณ์ดี และมันก็ได้ผลจริงๆ เสียงเพลงจากเหล่าเทวดาดังขึ้น และแสงสว่างก็สาดส่องไปทั่วห้อง
  • "รถบรรทุกขยะโง่เง่าบ้าบอ": เมื่อมันพัง

ซอร์สโค้ดของ Git อ้างถึงโปรแกรมว่าเป็น "ตัวจัดการข้อมูลจากนรก" [ 37 ] [ 38 ]

ลักษณะเฉพาะ

ออกแบบ

การออกแบบของ Git เป็นการสังเคราะห์ประสบการณ์ของ Torvalds กับ Linux ในการบำรุงรักษาโครงการพัฒนาแบบกระจายขนาดใหญ่ พร้อมกับความรู้เชิงลึกเกี่ยวกับประสิทธิภาพของระบบไฟล์ที่ได้รับจากโครงการเดียวกัน และความจำเป็นเร่งด่วนในการสร้างระบบที่ใช้งานได้ในเวลาอันสั้น อิทธิพลเหล่านี้ทำให้เกิดทางเลือกในการใช้งานดังต่อไปนี้: [ 10 ]

การสนับสนุนอย่างแข็งขันต่อการพัฒนาที่ไม่เป็นเชิงเส้น
Git รองรับการสร้างและรวมสาขาอย่างรวดเร็ว และมีเครื่องมือเฉพาะสำหรับการแสดงภาพและนำทางประวัติการพัฒนาที่ไม่เป็นเส้นตรง ใน Git ข้อสมมติฐานหลักคือการเปลี่ยนแปลงจะถูกรวมเข้าบ่อยกว่าที่จะถูกเขียนขึ้น เนื่องจากมีการส่งต่อไปยังผู้ตรวจสอบหลายคน ใน Git สาขามีน้ำหนักเบามาก: สาขาเป็นเพียงการอ้างอิงถึงคอมมิตเดียวเท่านั้น
การพัฒนาแบบกระจาย
เช่นเดียวกับDarcs , BitKeeper , Mercurial , BazaarและMonotone Git มอบสำเนาประวัติการพัฒนาทั้งหมดให้กับนักพัฒนาแต่ละคน และการเปลี่ยนแปลงจะถูกคัดลอกจากที่เก็บข้อมูลดังกล่าวหนึ่งไปยังอีกที่เก็บข้อมูลหนึ่ง การเปลี่ยนแปลงเหล่านี้จะถูกนำเข้าเป็นสาขาการพัฒนาที่เพิ่มเข้ามา และสามารถผสานรวมได้ในลักษณะเดียวกับสาขาที่พัฒนาในพื้นที่[ 39 ]
ความเข้ากันได้กับระบบและโปรโตคอลที่มีอยู่
สามารถเผยแพร่ที่เก็บข้อมูลผ่านHypertext Transfer Protocol Secure (HTTPS), Hypertext Transfer Protocol (HTTP), File Transfer Protocol (FTP) หรือโปรโตคอล Git ผ่านซ็อกเก็ตธรรมดาหรือSecure Shell (ssh) Git ยังมีการจำลองเซิร์ฟเวอร์ CVS ซึ่งช่วยให้สามารถใช้ไคลเอ็นต์ CVS และปลั๊กอิน IDE ที่มีอยู่เพื่อเข้าถึงที่เก็บข้อมูล Git ได้ ที่เก็บข้อมูล Subversionสามารถใช้งานได้โดยตรงกับ git-svn [ 40 ]
การจัดการโครงการขนาดใหญ่อย่างมีประสิทธิภาพ
Torvalds ได้อธิบายว่า Git นั้นเร็วและปรับขนาดได้ดีมาก[ 41 ]และการทดสอบประสิทธิภาพที่ดำเนินการโดย Mozilla [ 42 ]แสดงให้เห็นว่าการเปรียบเทียบความแตกต่างของคลังข้อมูลขนาดใหญ่เร็วกว่าMercurialและGNU Bazaar ถึงหนึ่ง ลำดับขนาด การดึงประวัติเวอร์ชันจากคลังข้อมูลที่จัดเก็บไว้ในเครื่องอาจเร็วกว่าการดึงจากเซิร์ฟเวอร์ระยะไกลถึงหนึ่งร้อยเท่า[ 43 ]
การตรวจสอบความถูกต้องทางการเข้ารหัสของประวัติศาสตร์
ประวัติ Git ถูกจัดเก็บในลักษณะที่ ID ของเวอร์ชันเฉพาะ (หรือcommitในแง่ของ Git) ขึ้นอยู่กับประวัติการพัฒนาทั้งหมดก่อนหน้า commit นั้น เมื่อเผยแพร่แล้ว จะไม่สามารถเปลี่ยนแปลงเวอร์ชันเก่าได้โดยไม่ถูกตรวจพบ โครงสร้างคล้ายกับMerkle treeแต่มีข้อมูลเพิ่มเติมที่โหนดและใบ[ 44 ] ( MercurialและMonotoneก็มีคุณสมบัตินี้เช่นกัน)
การออกแบบโดยใช้ชุดเครื่องมือ
Git ได้รับการออกแบบให้เป็นชุดโปรแกรมที่เขียนด้วยภาษาCและสคริปต์เชลล์หลายตัวที่ให้ตัวห่อหุ้มรอบโปรแกรมเหล่านั้น[ 45 ]แม้ว่าสคริปต์ส่วนใหญ่จะถูกเขียนใหม่ด้วยภาษา C เพื่อความเร็วและความสามารถในการพกพา แต่การออกแบบยังคงอยู่ และสามารถเชื่อมโยงส่วนประกอบต่างๆ เข้าด้วยกันได้อย่างง่ายดาย[ 46 ]
กลยุทธ์การผสานแบบเสียบปลั๊กได้
ในส่วนของการออกแบบชุดเครื่องมือ Git มีโมเดลการรวมที่ไม่สมบูรณ์ที่กำหนดไว้อย่างชัดเจน และมีอัลกอริทึมหลายตัวสำหรับทำให้การรวมเสร็จสมบูรณ์ โดยท้ายที่สุดจะแจ้งให้ผู้ใช้ทราบว่าไม่สามารถทำการรวมให้เสร็จสมบูรณ์โดยอัตโนมัติได้ และจำเป็นต้องแก้ไขด้วยตนเอง[ 47 ]
ขยะจะสะสมไปเรื่อยๆ จนกว่าจะมีคนมาเก็บ
การยกเลิกการดำเนินการหรือการย้อนกลับการเปลี่ยนแปลงจะทำให้วัตถุที่ค้างอยู่ซึ่งไม่มีประโยชน์เหลืออยู่ในฐานข้อมูล โดยทั่วไปแล้ววัตถุเหล่านี้จะเป็นเพียงส่วนน้อยของประวัติวัตถุที่ต้องการซึ่งเติบโตอย่างต่อเนื่อง Git จะทำการเก็บขยะ โดยอัตโนมัติ เมื่อมีการสร้างวัตถุที่หลวมจำนวนมากพอในที่เก็บข้อมูล การเก็บขยะสามารถเรียกได้อย่างชัดเจนโดยใช้git gc. [ 48 ] [ 49 ]
การจัดเรียงวัตถุแบบชัดเจนเป็นระยะ
Git จัดเก็บอ็อบเจ็กต์ที่สร้างขึ้นใหม่แต่ละรายการเป็นไฟล์แยกกัน แม้ว่าจะมีการบีบอัดทีละรายการ แต่ก็ใช้พื้นที่มากและไม่มีประสิทธิภาพ วิธีแก้ปัญหานี้คือการใช้แพ็คซึ่งจัดเก็บอ็อบเจ็กต์จำนวนมากที่บีบอัดแบบเดลต้าไว้ในไฟล์เดียว (หรือสตรีมไบต์เครือข่าย) ที่เรียกว่าไฟล์แพ็คแพ็คจะถูกบีบอัดโดยใช้หลักการที่ว่าไฟล์ที่มีชื่อเดียวกันน่าจะคล้ายกัน โดยไม่ขึ้นอยู่กับความถูกต้อง ไฟล์ดัชนีที่สอดคล้องกันจะถูกสร้างขึ้นสำหรับแต่ละไฟล์แพ็ค โดยบันทึกออฟเซ็ตของแต่ละอ็อบเจ็กต์ในไฟล์แพ็ค อ็อบเจ็กต์ที่สร้างขึ้นใหม่ (พร้อมประวัติที่เพิ่มเข้ามาใหม่) ยังคงถูกจัดเก็บเป็นอ็อบเจ็กต์เดี่ยว และจำเป็นต้องมีการแพ็คใหม่เป็นระยะเพื่อรักษาประสิทธิภาพการใช้พื้นที่ กระบวนการแพ็คที่เก็บข้อมูลอาจมีค่าใช้จ่ายในการคำนวณสูงมาก โดยการอนุญาตให้อ็อบเจ็กต์มีอยู่ในที่เก็บข้อมูลในรูปแบบที่หลวมแต่สร้างขึ้นอย่างรวดเร็ว Git ช่วยให้สามารถเลื่อนการดำเนินการแพ็คที่มีค่าใช้จ่ายสูงไปในภายหลัง เมื่อเวลามีความสำคัญน้อยลง เช่น สิ้นสุดวันทำงาน Git จะทำการแพ็คใหม่เป็นระยะโดยอัตโนมัติ แต่ก็สามารถแพ็คใหม่ด้วยตนเองได้ด้วยgit gcคำสั่ง[ 50 ]เพื่อความสมบูรณ์ของข้อมูล ทั้งไฟล์แพ็คและดัชนีจะมีค่าตรวจสอบSHA-1 [ 51 ]อยู่ภายใน และชื่อไฟล์ของไฟล์แพ็คยังมีค่าตรวจสอบ SHA-1 ด้วย หากต้องการตรวจสอบความสมบูรณ์ของที่เก็บข้อมูล ให้รันgit fsckคำสั่ง[ 52 ] [ 53 ]

คุณสมบัติอีกประการหนึ่งของ Git คือการสร้างสแนปช็อตของโครงสร้างไดเร็กทอรีของไฟล์ ระบบแรกสุดสำหรับการติดตามเวอร์ชันของซอร์สโค้ด ได้แก่ระบบควบคุมซอร์สโค้ด (SCCS) และระบบควบคุมการแก้ไข (RCS) ทำงานกับไฟล์แต่ละไฟล์และเน้นการประหยัดพื้นที่ที่ได้จากเดลต้าแบบสลับ (SCCS) หรือการเข้ารหัสเดลต้า (RCS) ของเวอร์ชัน (ส่วนใหญ่คล้ายกัน) ระบบควบคุมการแก้ไขในภายหลังยังคงรักษาแนวคิดที่ว่าไฟล์มีเอกลักษณ์เดียวกันในหลายเวอร์ชันของโครงการ อย่างไรก็ตาม Torvalds ปฏิเสธแนวคิดนี้[ 54 ]ด้วยเหตุนี้ Git จึงไม่ได้บันทึกความสัมพันธ์การแก้ไขไฟล์อย่างชัดเจนในระดับใด ๆ ที่ต่ำกว่าโครงสร้างซอร์สโค้ด

ข้อเสีย

ความสัมพันธ์การแก้ไขโดยนัยเหล่านี้มีผลกระทบที่สำคัญหลายประการ:

  • การตรวจสอบประวัติการเปลี่ยนแปลงของไฟล์เดียวมีค่าใช้จ่ายสูงกว่าการตรวจสอบทั้งโปรเจกต์เล็กน้อย[ 55 ]เพื่อให้ได้ประวัติการเปลี่ยนแปลงที่มีผลต่อไฟล์ที่กำหนด Git จะต้องตรวจสอบประวัติโดยรวมแล้วพิจารณาว่าการเปลี่ยนแปลงแต่ละครั้งได้แก้ไขไฟล์นั้นหรือไม่ อย่างไรก็ตาม วิธีการตรวจสอบประวัติแบบนี้ทำให้ Git สามารถสร้างประวัติเดียวที่แสดงการเปลี่ยนแปลงของชุดไฟล์ใดๆ ได้อย่างมีประสิทธิภาพเท่าเทียมกัน ตัวอย่างเช่น ไดเร็กทอรีย่อยของโครงสร้างซอร์สโค้ดบวกกับไฟล์ส่วนหัวส่วนกลางที่เกี่ยวข้องเป็นกรณีที่พบได้บ่อยมาก
  • การเปลี่ยนชื่อจะถูกจัดการโดยปริยายมากกว่าโดยชัดแจ้ง ข้อร้องเรียนทั่วไปเกี่ยวกับCVSคือการใช้ชื่อไฟล์เพื่อระบุประวัติการแก้ไข ดังนั้นการย้ายหรือเปลี่ยนชื่อไฟล์จึงเป็นไปไม่ได้หากไม่ขัดจังหวะประวัติหรือเปลี่ยนชื่อประวัติและทำให้ประวัติไม่ถูกต้อง ระบบควบคุมการแก้ไขส่วนใหญ่หลัง CVS แก้ปัญหานี้โดยการให้ไฟล์มีชื่อที่ไม่ซ้ำกันและใช้งานได้นาน (คล้ายกับ หมายเลข inode ) ซึ่งยังคงอยู่แม้จะมีการเปลี่ยนชื่อ Git ไม่บันทึกตัวระบุเช่นนี้ และอ้างว่าเป็นข้อดี[ 56 ] [ 57 ] บางครั้งไฟล์ ซอร์สโค้ดจะถูกแยกหรือรวมเข้าด้วยกัน หรือเพียงแค่เปลี่ยนชื่อ[ 58 ]และการบันทึกสิ่งนี้เป็นการเปลี่ยนชื่อแบบง่ายๆ จะทำให้คำอธิบายที่ไม่ถูกต้องเกี่ยวกับสิ่งที่เกิดขึ้นในประวัติ (ที่เปลี่ยนแปลงไม่ได้) หยุดนิ่ง Git แก้ปัญหานี้โดยการตรวจจับการเปลี่ยนชื่อในขณะที่เรียกดูประวัติของสแนปช็อตแทนที่จะบันทึกเมื่อสร้างสแนปช็อต[ 59 ] (โดยสรุป เมื่อมีไฟล์ในเวอร์ชันNไฟล์ที่มีชื่อเดียวกันในเวอร์ชันN  1 จะเป็นไฟล์บรรพบุรุษเริ่มต้น อย่างไรก็ตาม เมื่อไม่มีไฟล์ที่มีชื่อเดียวกันในเวอร์ชันN  1 Git จะค้นหาไฟล์ที่มีอยู่เฉพาะในเวอร์ชันN  1 และมีความคล้ายคลึงกับไฟล์ใหม่มาก) อย่างไรก็ตาม วิธีนี้ต้องใช้ การทำงานของ CPU มากขึ้น ทุกครั้งที่มีการตรวจสอบประวัติ และมีตัวเลือกหลายอย่างในการปรับฮิวริสติกส์ กลไกนี้ไม่ได้ผลเสมอไป บางครั้งไฟล์ที่เปลี่ยนชื่อพร้อมกับการเปลี่ยนแปลงในคอมมิตเดียวกันจะถูกอ่านเป็นการลบไฟล์เก่าและการสร้างไฟล์ใหม่ นักพัฒนาสามารถแก้ไขข้อจำกัดนี้ได้โดยการคอมมิตการเปลี่ยนชื่อและการเปลี่ยนแปลงแยกกัน

กลยุทธ์การควบรวม

Git ใช้กลยุทธ์การรวมหลายแบบ สามารถเลือกกลยุทธ์ที่ไม่ใช่ค่าเริ่มต้นได้ในเวลารวม: [ 60 ]

  • resolve : อัลกอริทึมการรวมแบบสามทาง แบบดั้งเดิม
  • แบบเรียกซ้ำ (Recursive ): นี่คือค่าเริ่มต้นเมื่อดึงหรือผสานสาขาเดียว และเป็นรูปแบบหนึ่งของอัลกอริธึมการผสานแบบสามทาง (three-way merge algorithm)

    เมื่อมีบรรพบุรุษร่วมกันมากกว่าหนึ่งรายที่สามารถใช้สำหรับการรวมแบบสามทางได้ ระบบจะสร้างแผนผังต้นไม้ที่รวมกันของบรรพบุรุษร่วมกันเหล่านั้น และใช้แผนผังนั้นเป็นแผนผังอ้างอิงสำหรับการรวมแบบสามทาง จากการทดสอบกับคอมมิตการรวมก่อนหน้านี้จากประวัติการพัฒนาเคอร์เนล Linux 2.6 พบว่าวิธีนี้ส่งผลให้เกิดข้อขัดแย้งในการรวมน้อยลงโดยไม่ทำให้เกิดการรวมที่ไม่ถูกต้อง นอกจากนี้ยังสามารถตรวจจับและจัดการการรวมที่เกี่ยวข้องกับการเปลี่ยนชื่อได้อีกด้วย

    ลินัส ทอร์วัลด์ส[ 61 ]

  • ปลาหมึกยักษ์ : นี่คือค่าเริ่มต้นเมื่อรวมหัวมากกว่าสองหัว

โครงสร้างข้อมูล

ฟังก์ชันพื้นฐานของ Git ไม่ใช่ ระบบ จัดการซอร์สโค้ด โดยเนื้อแท้ Torvalds อธิบายว่า: [ 62 ]

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

จากแนวทางการออกแบบเบื้องต้นนี้ Git ได้พัฒนาฟีเจอร์ครบชุดตามที่คาดหวังจาก SCM แบบดั้งเดิม[ 63 ]โดยฟีเจอร์ส่วนใหญ่จะถูกสร้างขึ้นตามความจำเป็น จากนั้นจึงปรับปรุงและขยายเพิ่มเติมเมื่อเวลาผ่านไป

การไหลเวียนของข้อมูลและระดับการจัดเก็บในระบบควบคุมเวอร์ชัน Git

Git มีโครงสร้างข้อมูล สองแบบ : ดัชนี ที่เปลี่ยนแปลงได้ (เรียกอีกอย่างว่าstageหรือcache ) ที่แคชข้อมูลเกี่ยวกับไดเร็กทอรีการทำงานและการแก้ไขครั้งถัดไปที่จะทำการคอมมิต และฐานข้อมูลวัตถุที่จัดเก็บวัตถุที่ไม่สามารถเปลี่ยนแปลงได้[ 64 ]

ดัชนีทำหน้าที่เป็นจุดเชื่อมต่อระหว่างฐานข้อมูลวัตถุและโครงสร้างการทำงาน[ 64 ]

ที่เก็บวัตถุประกอบด้วยวัตถุห้าประเภท: [ 65 ] [ 52 ]

  • ล็อบคือเนื้อหาของไฟล์บล็อบไม่มีชื่อไฟล์ที่ถูกต้อง การประทับเวลา หรือเมตาเดตาอื่น ๆ (ชื่อบล็อบภายในคือแฮชของเนื้อหา) ใน Git แต่ละบล็อบเป็นเวอร์ชันของไฟล์ ซึ่งมีข้อมูลของไฟล์อยู่[ 66 ]
  • อ็อบเจ็กต์ต้นไม้เทียบเท่ากับไดเร็กทอรี ประกอบด้วยรายการชื่อไฟล์[ 67 ]แต่ละไฟล์มีบิตประเภทบางส่วนและการอ้างอิงถึงบล็อบหรืออ็อบเจ็กต์ต้นไม้ที่เป็นไฟล์ ลิงก์สัญลักษณ์ หรือเนื้อหาของไดเร็กทอรีนั้น อ็อบเจ็กต์เหล่านี้เป็นภาพรวมของต้นไม้ต้นทาง (โดยรวมแล้ว ประกอบด้วยต้นไม้ Merkleซึ่งหมายความว่าแฮชเดียวสำหรับต้นไม้รากก็เพียงพอและถูกใช้จริงในการคอมมิตเพื่อระบุสถานะที่แน่นอนของโครงสร้างต้นไม้ทั้งหมดของไดเร็กทอรีย่อยและไฟล์จำนวนใดก็ได้)
  • อ อบเจ็กต์ คอมมิตเชื่อมโยงออบเจ็กต์ต้นไม้เข้าด้วยกันในประวัติ ประกอบด้วยชื่อของออบเจ็กต์ต้นไม้ (ของไดเร็กทอรีแหล่งที่มาระดับบนสุด) การประทับเวลา ข้อความบันทึก และชื่อของออบเจ็กต์คอมมิตแม่ศูนย์ตัวขึ้นไป[ 68 ]
  • อ็อบเจ็กต์แท็กเป็นคอนเทนเนอร์ที่ประกอบด้วยการอ้างอิงถึงอ็อบเจ็กต์อื่น และสามารถเก็บข้อมูลเมตาเพิ่มเติมที่เกี่ยวข้องกับอ็อบเจ็กต์อื่นได้ โดยทั่วไปแล้ว จะใช้เพื่อจัดเก็บลายเซ็นดิจิทัลของอ็อบเจ็กต์คอมมิตที่สอดคล้องกับการเผยแพร่ข้อมูลเฉพาะที่กำลังติดตามโดย Git [ 69 ]
  • อ็อบเจ็กต์packfileจะรวบรวมอ็อบเจ็กต์อื่นๆ ต่างๆ เข้าไว้ใน บันเดิลที่บีบอัดด้วย zlibเพื่อความกะทัดรัดและง่ายต่อการขนส่งผ่านโปรโตคอลเครือข่าย[ 70 ]

แต่ละอ็อบเจ็กต์จะถูกระบุด้วย ค่าแฮช SHA-1 ของเนื้อหาภายใน Git จะคำนวณค่าแฮชและใช้ค่านี้เป็นชื่อของอ็อบเจ็กต์ อ็อบเจ็กต์จะถูกจัดเก็บไว้ในไดเร็กทอรีที่ตรงกับอักขระสองตัวแรกของค่าแฮช ส่วนที่เหลือของค่าแฮชจะถูกใช้เป็นชื่อไฟล์สำหรับอ็อบเจ็กต์นั้น

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

นอกจากนี้ Git ยังจัดเก็บป้ายกำกับที่เรียกว่า refs (ย่อมาจาก references) เพื่อระบุตำแหน่งของ commit ต่างๆ โดยจะถูกจัดเก็บไว้ในฐานข้อมูลอ้างอิงและมีดังนี้: [ 71 ]

  • หัว (สาขา) : การอ้างอิงที่มีชื่อซึ่งจะถูกเลื่อนไปยังคอมมิตใหม่โดยอัตโนมัติเมื่อมีการสร้างคอมมิตทับลงบนสาขาเหล่านั้น
  • HEAD : ส่วนหัวที่สงวนไว้ซึ่งจะถูกนำไปเปรียบเทียบกับ working tree เพื่อสร้าง commit
  • แท็ก : คล้ายกับการอ้างอิงสาขา แต่กำหนดไว้ที่คอมมิตเฉพาะ ใช้เพื่อระบุจุดสำคัญในประวัติศาสตร์

คำสั่ง

คำสั่งที่ใช้บ่อยสำหรับอินเทอร์เฟซบรรทัดคำสั่ง ของ Git ได้แก่: [ 72 ] [ 73 ]

  • git initซึ่งใช้ในการสร้างที่เก็บข้อมูล Git
  • git clone [URL]ซึ่งเป็นการโคลนหรือทำสำเนาที่เก็บข้อมูล Git จาก URL ภายนอก
  • git add [file]ซึ่งเป็นการเพิ่มไฟล์เข้าไปในไดเร็กทอรีการทำงาน ของ Git (ไฟล์ที่จะถูกคอมมิต)
  • git commit -m [commit message]ซึ่งจะบันทึกไฟล์จากไดเร็กทอรีการทำงานปัจจุบัน (ดังนั้นไฟล์เหล่านั้นจึงเป็นส่วนหนึ่งของประวัติของที่เก็บข้อมูล)

สามารถสร้างไฟล์ .gitignore ในที่เก็บ Git เป็นไฟล์ข้อความธรรมดาได้ไฟล์ที่ระบุไว้ในไฟล์ . gitignoreจะไม่ถูกติดตามโดย Git [ 74 ] : 3–4คุณสมบัตินี้สามารถใช้เพื่อละเว้นไฟล์ที่มีคีย์หรือรหัสผ่าน ไฟล์แปลกปลอมต่างๆ และไฟล์ขนาดใหญ่ (ซึ่งGitHubจะปฏิเสธการอัปโหลด) [ 75 ]

การอ้างอิง Git

วัตถุทุกชิ้นในฐานข้อมูล Git ที่ไม่ได้ถูกอ้างอิงถึง สามารถถูกล้างข้อมูลได้โดยใช้คำสั่งเก็บกวาดขยะ หรือโดยอัตโนมัติ วัตถุหนึ่งอาจถูกอ้างอิงโดยวัตถุอื่น หรือโดยการอ้างอิงแบบชัดเจน Git มีการอ้างอิงหลายประเภท คำสั่งในการสร้าง ย้าย และลบการอ้างอิงนั้นแตกต่างกันไปgit show-refรายการการอ้างอิงทั้งหมดมีดังนี้:

  • heads : หมายถึงวัตถุภายในเครื่อง
  • remotes : หมายถึงวัตถุที่อยู่ในที่เก็บข้อมูลระยะไกล (remote repository)
  • stash : หมายถึงวัตถุที่ยังไม่ได้บันทึก (commit)
  • เมตา : เช่น การกำหนด ค่าในที่เก็บข้อมูลเปล่า สิทธิ์ของผู้ใช้ เนมสเปซ refs/meta/config ได้รับการแนะนำในภายหลัง และถูกใช้โดยGerrit [ 76 ]
  • แท็ก : ดูด้านบน

การนำไปใช้

gitgเป็นโปรแกรมส่วนติดต่อผู้ใช้แบบกราฟิกที่ใช้GTK +

Git (การใช้งานหลักในภาษา C) ได้รับการพัฒนาบนLinux เป็นหลัก แม้ว่าจะรองรับระบบปฏิบัติการหลักส่วนใหญ่ รวมถึง BSD ( DragonFly BSD , FreeBSD , NetBSDและOpenBSD ), Solaris , macOSและWindowsก็ตาม[ 77 ] [ 78 ]

Git เวอร์ชัน Windows แรกเป็นเฟรมเวิร์กจำลอง Linux เป็นหลักซึ่งรองรับเวอร์ชัน Linux การติดตั้ง Git บน Windows จะสร้างไดเร็กทอรี Program Files ที่มีชื่อคล้ายกันซึ่งประกอบด้วยMingw-w64 ซึ่งเป็น พอร์ตของGNU Compiler Collection , Perl 5, MSYS2 (ซึ่งเป็นเวอร์ชันแยกของCygwinซึ่งเป็นสภาพแวดล้อมจำลองแบบ Unix สำหรับ Windows) และพอร์ตหรือการจำลองยูทิลิตี้และไลบรารี Linux อื่นๆ สำหรับ Windows ปัจจุบัน Git เวอร์ชัน Windows ดั้งเดิมมีการแจกจ่ายในรูปแบบตัวติดตั้ง 32 บิตและ 64 บิต[ 79 ]เว็บไซต์อย่างเป็นทางการของ Git ยังคงดูแลการสร้าง Git สำหรับ Windows ซึ่งยังคงใช้สภาพแวดล้อม MSYS2 อยู่[ 80 ]

JGit เป็น ไลบรารีซอฟต์แวร์ Java บริสุทธิ์ ที่ออกแบบมาเพื่อฝังในแอปพลิเคชัน Java ใดๆ JGit ถูกใช้ใน เครื่องมือตรวจสอบโค้ด Gerritและใน EGit ซึ่งเป็นไคลเอ็นต์ Git สำหรับEclipse IDE [ 81 ]

Go-git เป็นการใช้งาน Git แบบโอเพนซอร์ส ที่เขียนด้วย ภาษาGo บริสุทธิ์ [ 82 ]ปัจจุบันใช้สำหรับรองรับโปรเจกต์ในฐานะ อินเทอร์เฟซ SQLสำหรับที่เก็บโค้ด Git [ 83 ]และให้การเข้ารหัสสำหรับ Git [ 84 ]

Dulwich เป็นการใช้งาน Git ที่เขียนด้วยPython บริสุทธิ์ โดยรองรับ CPython 3.6 และเวอร์ชันที่ใหม่กว่า รวมถึง Pypy ด้วย[ 85 ]

การใช้งาน Git libgit2 เป็นไลบรารีซอฟต์แวร์ ANSI C ที่ไม่มีการพึ่งพาอื่นๆ ซึ่งสามารถสร้างได้บนหลายแพลตฟอร์ม รวมถึง Windows, Linux, macOS และ BSD [ 86 ]มีการเชื่อมต่อสำหรับภาษาโปรแกรมหลายภาษา รวมถึงRuby , Python และHaskell [ 87 ] [ 88 ] [ 89 ]

การใช้งาน Git อื่นๆ ได้แก่ JS-Git ( การใช้งาน Git บางส่วนด้วยJavaScript ) [ 90 ] Game of Trees (การใช้งาน Git แบบโอเพนซอร์สสำหรับ โครงการ OpenBSD ) [ 91 ] git9 (การใช้งาน Git แบบอิสระสำหรับPlan 9โดยใช้นามธรรมดั้งเดิมของระบบ) [ 92 ] [ 93 ] และ gitoxide (การใช้งาน Git ที่เขียนด้วย Rustบริสุทธิ์) [ 94 ]

เซิร์ฟเวอร์ Git

ภาพหน้าจอของอินเทอร์เฟซ gitweb ที่แสดงความแตกต่าง ของการคอมมิต

เนื่องจาก Git เป็นระบบควบคุมเวอร์ชันแบบกระจาย จึงสามารถใช้เป็นเซิร์ฟเวอร์ได้ทันที มีคำสั่งในตัวgit daemonที่เริ่มต้นเซิร์ฟเวอร์ TCP แบบง่ายๆ ที่ทำงานบนโปรโตคอล Git [ 95 ] [ 96 ]เซิร์ฟเวอร์ Git HTTP เฉพาะช่วย (นอกเหนือจากคุณสมบัติอื่นๆ) โดยการเพิ่มการควบคุมการเข้าถึง การแสดงเนื้อหาของที่เก็บ Git ผ่านอินเทอร์เฟซเว็บ และการจัดการที่เก็บหลายแห่ง ที่เก็บ Git ที่มีอยู่แล้วสามารถโคลนและแชร์เพื่อให้ผู้อื่นใช้เป็นที่เก็บส่วนกลางได้ นอกจากนี้ยังสามารถเข้าถึงได้ผ่านเชลล์ระยะไกลเพียงแค่ติดตั้งซอฟต์แวร์ Git และอนุญาตให้ผู้ใช้ล็อกอิน[ 97 ] โดยทั่วไป เซิร์ฟเวอร์ Git จะรับฟังบนพอร์ต TCP 9418 [ 98 ]

สำหรับการเรียกดูคลังเก็บข้อมูลบนเว็บ Git ยังมาพร้อมกับ gitweb ซึ่งเป็นอินเทอร์เฟซแบบ CGI สำหรับดูเนื้อหาคลังเก็บข้อมูลผ่าน HTTP [ 99 ]

โอเพนซอร์ส

  • การโฮสต์เซิร์ฟเวอร์ Git โดยใช้ไบนารี Git [ 100 ]
  • Gerritคือเซิร์ฟเวอร์ Git ที่สามารถกำหนดค่าเพื่อรองรับการตรวจสอบโค้ดและให้การเข้าถึงผ่าน SSH, Apache MINAหรือ OpenSSH ที่ผสานรวม หรือ เว็บเซิร์ฟเวอร์ Jetty ที่ผสานรวม Gerrit รองรับการผสานรวม LDAP, Active Directory, OpenID, OAuth, Kerberos/GSSAPI และใบรับรองไคลเอ็นต์ X509 https ใน Gerrit 3.0 การกำหนดค่าทั้งหมดจะถูกจัดเก็บเป็นที่เก็บ Git และไม่จำเป็นต้องใช้ฐานข้อมูลในการทำงาน Gerrit มีฟีเจอร์ pull-request ที่ถูกนำมาใช้ในส่วนหลัก แต่ขาด GUI สำหรับฟีเจอร์นี้
  • Phabricatorเป็นบริษัทที่แยกตัวออกมาจาก Facebook เนื่องจาก Facebook ใช้Mercurial เป็นหลัก การสนับสนุน Git จึงไม่โดดเด่นนัก[ 101 ]
  • RhodeCode Community Edition (CE) รองรับ Git, MercurialและSubversionภายใต้ใบอนุญาต AGPLv3
  • Kallitheaรองรับทั้ง Git และMercurialพัฒนาด้วยภาษาPython ภาย ใต้ใบอนุญาต GPL
  • โครงการภายนอกเช่น gitolite [ 102 ]ซึ่งจัดเตรียมสคริปต์บนซอฟต์แวร์ Git เพื่อให้การควบคุมการเข้าถึงแบบละเอียด
  • มีโซลูชัน FLOSS อื่นๆ อีกหลายอย่างสำหรับการโฮสต์ด้วยตนเอง รวมถึง Gogs [ 103 ] Giteaซึ่งเป็นเวอร์ชันแยกของ Gogs และForgejoซึ่งเป็นเวอร์ชันแยกของ Gitea อีกด้วย Gogs รวมถึงเวอร์ชันแยกอีกสองเวอร์ชันที่กล่าวถึงข้างต้น ได้รับการพัฒนาโดยใช้ภาษา Goโซลูชันทั้งสามนี้ให้บริการภายใต้ใบอนุญาต MIT

เซิร์ฟเวอร์ Git ในรูปแบบบริการ

มีบริการ Git repositories มากมายให้เลือกใช้ บริการที่ได้รับความนิยมมากที่สุดได้แก่ GitHub , SourceForge , BitbucketและGitLab [ 104 ] [ 19 ] [ 20 ] [ 21 ] [ 22 ]

ส่วนต่อประสานกราฟิก

โปรแกรมไคลเอ็นต์ Git GUI มีส่วนติดต่อผู้ใช้แบบกราฟิก (GUI) เพื่อลดความซับซ้อนในการโต้ตอบกับที่เก็บข้อมูล Git

อินเทอร์เฟซผู้ใช้แบบกราฟิก (GUI) เหล่านี้แสดงภาพประวัติของโครงการ รวมถึงสาขา การคอมมิต และการเปลี่ยนแปลงไฟล์ นอกจากนี้ยังช่วยให้การดำเนินการต่างๆ เช่น การจัดเตรียมการเปลี่ยนแปลง การสร้างคอมมิต และการจัดการสาขา เป็นไปอย่างราบรื่น เครื่องมือเปรียบเทียบความแตกต่างแบบภาพช่วยแก้ไขข้อขัดแย้งในการผสานที่เกิดขึ้นจากการพัฒนาพร้อมกัน

Git มาพร้อมกับGUI ที่ใช้ Tcl/Tk ซึ่งช่วยให้ผู้ใช้สามารถดำเนินการต่างๆ เช่น การสร้างและแก้ไขคอมมิต การสร้างและผสานสาขา และการโต้ตอบกับที่เก็บข้อมูลระยะไกล[ 105 ]

นอกจาก GUI อย่างเป็นทางการแล้ว ยังมีอินเทอร์เฟซของบุคคลที่สามอีกมากมายที่ให้คุณสมบัติที่คล้ายคลึงกันกับ GUI อย่างเป็นทางการที่แจกจ่ายมาพร้อมกับ Git [ 106 ]

ไคลเอนต์แบบ GUI ช่วยให้เรียนรู้และใช้งาน Git ได้ง่ายขึ้น ปรับปรุงประสิทธิภาพการทำงาน และลดข้อผิดพลาด

การรับเลี้ยงบุตรบุญธรรม

มูลนิธิEclipseรายงานในแบบสำรวจชุมชนประจำปีว่าณ เดือนพฤษภาคม2557 Git เป็นเครื่องมือจัดการซอร์สโค้ดที่ใช้กันอย่างแพร่หลายที่สุด โดยนักพัฒนาซอฟต์แวร์มืออาชีพ 42.9% รายงานว่าใช้ Git เป็นระบบควบคุมซอร์สโค้ดหลัก[ 107 ]เมื่อเทียบกับ 36.3% ในปี 2013 และ 32% ในปี 2012 หรือสำหรับคำตอบเกี่ยวกับ Git ที่ไม่รวมการใช้GitHub : 33.3% ในปี 2014, 30.3% ในปี 2013, 27.6% ในปี 2012 และ 12.8% ในปี 2011 [ 108 ] OpenHub ซึ่งเป็นไดเร็กทอรีโอเพนซอร์สรายงานการใช้งานที่คล้ายคลึงกันในหมู่โครงการโอเพนซอร์ส[ 109 ]

Stack Overflowได้รวมการควบคุมเวอร์ชันไว้ในแบบสำรวจนักพัฒนาประจำปี[ 110 ]ในปี 2015 (มีผู้ตอบแบบสอบถาม 16,694 ราย) [ 111 ] 2017 (มีผู้ตอบแบบสอบถาม 30,730 ราย) [ 112 ] 2018 (มีผู้ตอบแบบสอบถาม 74,298 ราย) [ 113 ]และ 2022 (มีผู้ตอบแบบสอบถาม 71,379 ราย) [ 17 ] Git เป็นที่ชื่นชอบอย่างมากของนักพัฒนาที่ตอบแบบสอบถามในแบบสำรวจเหล่านี้ โดยมีรายงานสูงถึง 93.9% ในปี 2022

ระบบควบคุมเวอร์ชันที่นักพัฒนาใช้:

ชื่อ2015201720182022
กิต69.3%69.2%87.2%93.9%
การบ่อนทำลาย36.9%9.1%16.1%5.2%
ทีเอฟวีซี12.2%7.3%10.9%[ ii ]
เปลี่ยนแปลงง่าย7.9%1.9%3.6%1.1%
ซีวีเอส4.2%[ ii ][ ii ][ ii ]
เพอร์ฟอร์ซ3.3%[ ii ][ ii ][ ii ]
วีเอสเอส[ ii ]0.6%[ ii ][ ii ]
IBM DevOps Code ClearCase[ ii ]0.4%[ ii ][ ii ]
การสำรองข้อมูลไฟล์ Zip[ ii ]2.0%7.9%[ ii ]
การแชร์เครือข่ายดิบ[ ii ]1.7%7.9%[ ii ]
อื่น5.8%3.0%[ ii ][ ii ]
ไม่มี9.3%4.8%4.8%4.3%

เว็บไซต์หางานด้านไอทีของสหราชอาณาจักร itjobswatch.co.uk รายงานว่า ณ ปลายเดือนกันยายน 2016 ตำแหน่งงานพัฒนาซอฟต์แวร์ถาวรในสหราชอาณาจักร 29.27% ​​ระบุถึง Git [ 114 ]นำหน้า Microsoft Team Foundation Server 12.17 % [ 115 ] Subversion 10.60 % [ 116 ] Mercurial 1.30% [ 117 ]และVisual SourceSafe 0.48 % [ 118 ]

ส่วนขยาย

มีส่วนเสริมของ Git มากมาย เช่น Git LFS ซึ่งเริ่มต้นจากการเป็นส่วนเสริมของ Git ในชุมชน GitHub และปัจจุบันถูกใช้งานอย่างแพร่หลายโดยคลังเก็บข้อมูลอื่นๆ ส่วนเสริมเหล่านี้มักได้รับการพัฒนาและดูแลรักษาโดยอิสระจากบุคคลต่างๆ แต่ในอนาคต ส่วนเสริมที่ใช้งานกันอย่างแพร่หลายอาจถูกรวมเข้ากับ Git ในที่สุด

ส่วนขยาย Git แบบโอเพนซอร์สอื่นๆ ได้แก่:

  • git-annexคือระบบซิงโครไนซ์ไฟล์แบบกระจายศูนย์ที่ใช้ Git เป็นพื้นฐาน
  • git-flowคือชุดส่วนขยายของ Git ที่ช่วยให้สามารถดำเนินการกับที่เก็บข้อมูลระดับสูงได้ตามแบบจำลองการแตกสาขาของ Vincent Driessen
  • git-machete คือเครื่องมือจัดการและควบคุมพื้นที่เก็บข้อมูล (repository) สำหรับการทำ automating rebase/merge/pull/push

Microsoft ได้พัฒนา ส่วนขยาย Virtual File System for Git (VFS for Git; เดิมชื่อ Git Virtual File System หรือ GVFS) เพื่อจัดการขนาดของโครงสร้างซอร์สโค้ดของ Windows ซึ่งเป็นส่วนหนึ่งของการย้ายจาก Perforce ในปี 2017 VFS for Git อนุญาตให้ที่เก็บข้อมูลที่โคลนมาใช้ตัวยึดตำแหน่งซึ่งเนื้อหาจะถูกดาวน์โหลดเพียงครั้งเดียวเมื่อมีการเข้าถึงไฟล์[ 119 ]

อนุสัญญา

Git สามารถใช้งานได้หลากหลายวิธี แต่ก็มีรูปแบบการใช้งานบางอย่างที่นิยมใช้กันทั่วไป

  • คำสั่งสร้าง repo ในเครื่องgit init จะ สร้างbranch ชื่อmaster [ 66 ] [ 120 ]มักใช้เป็น branch สำหรับการรวมการเปลี่ยนแปลง[ 121 ]เครื่องมือบางอย่าง เช่น GitHub [ 122 ]และ GitLab [ 123 ]จะสร้าง branch เริ่มต้นชื่อmainแทนGit จะเริ่มใช้main ตั้งแต่เวอร์ชัน 3.0 ซึ่งคาดว่าจะ ออกภายในสิ้นปี 2026 [ 124 ] เนื่องจาก remote ต้นทางเริ่มต้นชื่อorigin [ 125 ] ดังนั้น branch remote เริ่มต้นคือorigin/masterนอกจากนี้ ผู้ใช้ยังสามารถเพิ่มและลบ branch และเลือก branch ใดก็ได้สำหรับการรวม
  • โดยทั่วไปแล้ว คอมมิตที่ถูกพุชจะไม่ถูกเขียนทับ แต่จะถูกย้อนกลับ[ 126 ]โดยคอมมิตการเปลี่ยนแปลงอื่นที่ย้อนกลับคอมมิตก่อนหน้า วิธีนี้ช่วยป้องกันไม่ให้คอมมิตที่ใช้ร่วมกันเป็นโมฆะเนื่องจากคอมมิตที่ใช้เป็นพื้นฐานไม่มีอยู่ในรีโมต หากคอมมิตมีข้อมูลที่ละเอียดอ่อน ควรลบออก ซึ่งเกี่ยวข้องกับขั้นตอนที่ซับซ้อนกว่าในการเขียนประวัติใหม่
  • เวิร์กโฟลว์git-flow [ 127 ]และข้อกำหนดการตั้งชื่อมักถูกนำมาใช้เพื่อแยกแยะประวัติที่ไม่เสถียรเฉพาะฟีเจอร์ (feature/*), ประวัติร่วมที่ไม่เสถียร (develop), ประวัติที่พร้อมใช้งานสำหรับการผลิต (main) และแพตช์ฉุกเฉินสำหรับผลิตภัณฑ์ที่เผยแพร่แล้ว (hotfix)
  • คำขอพูล (pull request ) หรือที่เรียกว่าคำขอผสาน (merge request ) คือคำขอจากผู้ใช้เพื่อผสานสาขาหนึ่งเข้ากับอีกสาขาหนึ่ง[ 128 ] [ 129 ] Git ไม่ได้รองรับคำขอพูล แต่เป็นคุณสมบัติทั่วไปของบริการคลาวด์ของ Git ฟังก์ชันพื้นฐานของคำขอพูลไม่แตกต่างจากการที่ผู้ดูแลระบบของที่เก็บข้อมูลดึงการเปลี่ยนแปลงจากรีโมตอื่น (ที่เก็บข้อมูลที่เป็นแหล่งที่มาของคำขอพูล) อย่างไรก็ตาม คำขอพูลเป็นตั๋วที่จัดการโดยเซิร์ฟเวอร์โฮสติ้ง ซึ่งเป็นผู้ดำเนินการเหล่านี้ ไม่ใช่คุณสมบัติของ Git SCM

ความปลอดภัย

Git ไม่ได้มีกลไกการควบคุมการเข้าถึง แต่ได้รับการออกแบบมาเพื่อใช้งานร่วมกับเครื่องมืออื่นๆ ที่เชี่ยวชาญด้านการควบคุมการเข้าถึง[ 130 ]

เมื่อวันที่ 17 ธันวาคม 2014 มีการค้นพบช่องโหว่ที่ส่งผลกระทบต่อโปรแกรม Git เวอร์ชันWindowsและmacOS ผู้โจมตีสามารถทำการ เรียกใช้โค้ดตามอำเภอใจบนคอมพิวเตอร์เป้าหมายที่มี Git ติดตั้งอยู่ โดยการสร้างโครงสร้าง Git ที่เป็นอันตราย (ไดเร็กทอรี) ชื่อ.git (ไดเร็กทอรีในที่เก็บ Git ที่เก็บข้อมูลทั้งหมดของที่เก็บ) โดยใช้ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กที่แตกต่างกัน (เช่น .GIT หรือ .Git ซึ่งจำเป็นเพราะ Git ไม่อนุญาตให้สร้าง เวอร์ชัน .git ที่เป็นตัวพิมพ์เล็กทั้งหมดด้วยตนเอง) พร้อมด้วยไฟล์ที่เป็นอันตรายในไดเร็กทอรี ย่อย .git/hooks (โฟลเดอร์ที่มีไฟล์ปฏิบัติการที่ Git เรียกใช้) บนที่เก็บที่ผู้โจมตีสร้างขึ้นหรือบนที่เก็บที่ผู้โจมตีสามารถแก้ไขได้ หากผู้ใช้ Windows หรือ Mac ดึง (ดาวน์โหลด) เวอร์ชันของที่เก็บที่มีไดเร็กทอรีที่เป็นอันตราย จากนั้นสลับไปยังไดเร็กทอรีนั้น ไดเร็กทอรี .git จะถูกเขียนทับ (เนื่องจากคุณสมบัติที่ไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็กของระบบไฟล์ Windows และ Mac) และไฟล์ปฏิบัติการที่เป็นอันตรายใน . git/hooksอาจถูกเรียกใช้ ซึ่งส่งผลให้คำสั่งของผู้โจมตีถูกดำเนินการ ผู้โจมตียังสามารถแก้ไข ไฟล์การกำหนดค่า .git/configซึ่งอนุญาตให้ผู้โจมตีสร้างนามแฝง Git ที่เป็นอันตราย (นามแฝงสำหรับคำสั่ง Git หรือคำสั่งภายนอก) หรือแก้ไขนามแฝงที่มีอยู่เพื่อเรียกใช้คำสั่งที่เป็นอันตรายเมื่อเรียกใช้ ช่องโหว่นี้ได้รับการแก้ไขใน Git เวอร์ชัน 2.2.1 ซึ่งเผยแพร่เมื่อวันที่ 17 ธันวาคม 2014 และประกาศในวันถัดไป[ 131 ] [ 132 ]

Git เวอร์ชัน 2.6.1 ซึ่งเผยแพร่เมื่อวันที่ 29 กันยายน 2015 มีแพตช์สำหรับช่องโหว่ด้านความปลอดภัย (CVE-2015-7545) [ 133 ]ที่อนุญาตให้เรียกใช้โค้ดตามอำเภอใจได้[ 134 ]ช่องโหว่นี้สามารถใช้ประโยชน์ได้หากผู้โจมตีสามารถโน้มน้าวให้เหยื่อทำการโคลน URL เฉพาะ เนื่องจากคำสั่งตามอำเภอใจถูกฝังอยู่ใน URL [ 135 ]ผู้โจมตีสามารถใช้ช่องโหว่นี้ผ่านการโจมตีแบบ man-in-the-middle ได้ หากการเชื่อมต่อไม่ได้เข้ารหัส[ 135 ]เนื่องจากพวกเขาสามารถเปลี่ยนเส้นทางผู้ใช้ไปยัง URL ที่พวกเขาเลือกได้ การโคลนแบบเรียกซ้ำก็มีความเสี่ยงเช่นกัน เนื่องจากอนุญาตให้ผู้ควบคุมของที่เก็บข้อมูลระบุ URL ตามอำเภอใจผ่านไฟล์ gitmodules [ 135 ]

Git ใช้ แฮช SHA-1ภายใน Linus Torvalds ตอบว่าแฮชส่วนใหญ่มีไว้เพื่อป้องกันความเสียหายโดยไม่ได้ตั้งใจ และความปลอดภัยที่ ได้จาก แฮชที่มีการเข้ารหัสลับเป็นเพียงผลข้างเคียงโดยบังเอิญ โดยความปลอดภัยหลักอยู่ที่การลงนามที่อื่น[ 136 ] [ 137 ]นับตั้งแต่มีการสาธิต การโจมตี SHAtteredต่อ Git ในปี 2017 Git ได้รับการแก้ไขให้ใช้ SHA-1 เวอร์ชันที่ทนต่อการโจมตีนี้ แผนการเปลี่ยนผ่านฟังก์ชันแฮชกำลังถูกเขียนขึ้นตั้งแต่เดือนกุมภาพันธ์ 2020 [ 138 ]

เครื่องหมายการค้า

"Git" เป็นเครื่องหมายการค้าจดทะเบียนของ Software Freedom Conservancyซึ่งจดทะเบียนกับสำนักงานสิทธิบัตรและเครื่องหมายการค้าแห่งสหรัฐอเมริกาหมายเลขทะเบียน 4680534 ตั้งแต่วันที่ 3 กุมภาพันธ์ 2015

ดูเพิ่มเติม

หมายเหตุ

  1. ↑ GPL-2.0 เท่านั้นตั้งแต่ 11 เมษายน 2548 บางส่วน อยู่ภายใต้ใบอนุญาตที่เข้ากันได้ เช่น LGPLv2.1 [ 6 ]
  2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19ไม่ได้ระบุเป็นตัวเลือกในแบบสำรวจนี้
  • เว็บไซต์อย่างเป็นทางการแก้ไขข้อมูลนี้ได้ที่วิกิดาต้า
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Git&oldid=1361809647 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ กิต

Git ( / ɡ ɪ t / ⓘ [ 8 ] ) เป็น ระบบซอฟต์แวร์ ควบคุมเวอร์ชันแบบกระจาย [ 9 ] ที่สามารถ จัดการเวอร์ชัน ของซอร์สโค้ดหรือข้อมูลได้ มักใช้เพื่อควบคุม ซอร์สโค้ด โดย โปรแกรมเมอร์ ที่...

ประวัติศาสตร์

Torvalds เริ่มพัฒนา Git ในเดือนเมษายน พ.ศ. 2548 หลังจากที่ ใบอนุญาต ฟรี สำหรับ BitKeeper ซึ่งเป็นระบบ การจัดการควบคุมแหล่ง ที่มา(SCM) ที่เป็นกรรมสิทธิ์ซึ่งใช้สำหรับการพัฒนาเคอร์เนล Linux ตั้งแต่ปี พ.ศ.

การตั้งชื่อ

Torvalds พูดติดตลกเกี่ยวกับชื่อ git (ซึ่งเป็น คำแสลง ภาษาอังกฤษ แบบบริติชที่หมายถึงคนที่ไม่น่าคบหาหรือโง่เขลา): "ผมเป็นไอ้สารเลวที่เห็นแก่ตัว และผมตั้งชื่อโปรเจกต์ทั้งหมดตามชื่อตัวเอง ก่อนหน้านี้ ' Linux ' ตอนนี้ 'git'" [ 33 ] [ 34 ] หน้า คู่มือ อธิบาย Git...

ออกแบบ

การออกแบบของ Git เป็นการสังเคราะห์ประสบการณ์ของ Torvalds กับ Linux ในการบำรุงรักษาโครงการพัฒนาแบบกระจายขนาดใหญ่ พร้อมกับความรู้เชิงลึกเกี่ยวกับประสิทธิภาพของระบบไฟล์ที่ได้รับจากโครงการเดียวกัน และความจำเป็นเร่งด่วนในการสร้างระบบที่ใช้งานได้ในเวลาอันสั้น...