เวิร์กโฟลว์และการใช้งาน Git ขั้นสูง
เผยแพร่แล้ว: 2022-06-30เมื่อเร็ว ๆ นี้เราได้ดูพื้นฐานของการเริ่มต้นใช้งาน Git สำหรับการควบคุมแหล่งที่มาในโครงการของคุณ แม้ว่าจะเป็นจุดเริ่มต้นที่ดี แต่ก็มีคำสั่งอื่นๆ และเวิร์กโฟลว์ของ Git มากมายที่จะช่วยให้คุณเข้าใจถึงการใช้ Git ในงานเขียนโค้ดประจำวันของคุณ
เวิร์กโฟลว์ Git
เมื่อฉันเริ่มใช้ Git ฉันคิดว่าฉันรู้วิธีใช้อย่างถูกต้อง แนวทางในอุดมคติของฉันคือทำการเปลี่ยนแปลงทั้งหมดในจุดเดียวโดยไม่ต้องแยกสาขา แล้วส่งไปยังที่เก็บและทำงานต่อไป
แม้ว่าจะดีกว่าการไม่ใช้การควบคุมเวอร์ชัน แต่ฉันต้องใช้เวลาสักพักกว่าจะรู้ว่าฉันไม่ได้ใช้พลังงานส่วนใหญ่ที่ Git ให้มา เพื่อให้ Git ทำงานให้ฉันได้ ฉันจำเป็นต้องมีกลยุทธ์เพื่อแยกสาขาและรวมการเปลี่ยนแปลงของฉัน
จากนั้น git-flow ก็ออกมาและฉันก็นำมันเป็นกลยุทธ์ของฉัน ฉันยังจำได้ว่ารู้สึกเหมือนกำลังแอบมองหลังม่านไปยังที่ๆ นักพัฒนาที่น่าทึ่งอยู่ ตอนนี้ฉันมีความเข้าใจอย่างถ่องแท้ว่าพวกเขาทำงานอย่างไรและสามารถเริ่มเป็นหนึ่งในนั้นได้
แต่ git-flow ไม่เหมาะกับทุกสถานการณ์ ดังนั้นในขณะที่เรากำลังจะดูเรื่องนี้ เราจะมาดูวิธีอื่นๆ สองสามวิธีในการจัดระเบียบโครงการ Git ของคุณ รวมถึงวิธีที่ฉันจัดการโครงการของฉันในฐานะนักพัฒนาคนเดียว
git-flow
เมื่อดูที่ git-flow ตอนนี้ ฉันรับทราบว่าแนวซอฟต์แวร์มีการเปลี่ยนแปลงอย่างมากใน 10 ปี และ git-flow อาจไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับทีมของคุณ เมื่อเขียน git-flow มักจะทำให้แอปพลิเคชันใช้งานได้หลายครั้งในหนึ่งวัน แต่คุณอาจสร้างหมายเลขเวอร์ชันหลักและเผยแพร่ทุกสองสามเดือนหรือสัปดาห์หากคุณอยู่ในทีมที่คล่องตัวเป็นพิเศษ
มาดูกันว่า git-flow คืออะไร
หากคุณต้องการดูคำอธิบายโดยละเอียดเกี่ยวกับแผนภูมิและคำสั่ง Git สำหรับ Git Flow คุณควร อ่านโพสต์นี้
ใน git-flow สองสาขามีอายุการใช้งานไม่สิ้นสุด อันดับแรก หลัก ซึ่งควรสะท้อนถึงโค้ดที่พร้อมสำหรับการปรับใช้กับสภาพแวดล้อมการทำงานจริง/การใช้งานจริงของคุณ
ประการที่สอง เรามีสาขาพัฒนาของเรา สาขานี้ควรมีการเปลี่ยนแปลงล่าสุดที่พร้อมสำหรับซอฟต์แวร์รุ่นถัดไปของเรา เมื่อการเปลี่ยนแปลงในการพัฒนาพร้อมที่จะนำไปใช้กับแอปพลิเคชันที่ใช้งานจริงของเรา เราจะรวมเข้ากับสาขาหลักและแท็กด้วยหมายเลขเวอร์ชันที่สอดคล้องกับหมายเลขรุ่น
นอกสาขาใหญ่ 2 สาขา มีสาขารองรับ 3 ประเภท
1. คุณสมบัติ
สาขาคุณลักษณะสามารถสร้างได้จากสาขาพัฒนาเท่านั้น ต้องรวมกลับเข้าไปในสาขาพัฒนา การตั้งชื่อสามารถอธิบายคุณลักษณะที่คุณกำลังดำเนินการได้ทุกอย่าง
เมื่องานพร้อมสำหรับการเปิดตัวครั้งต่อไป งานจะถูกรวมกลับเข้าไปในสาขาการพัฒนาซึ่งรอเวลาเผยแพร่
2. ปล่อย
รีลีสสาขาถูกสร้างขึ้นจากสาขาพัฒนาและต้องรวมกลับเป็นทั้งพัฒนาและหลัก คุณตั้งชื่อ release branch ด้วยหลักการ release-x ในทางปฏิบัติ ซึ่งมักจะหมายความว่าคุณจะตั้งชื่อสาขาด้วยหมายเลขรุ่นที่คุณวางแผนจะใช้ดังนี้: release-2.2
คุณใช้รีลีสแบรนช์เป็นวิธีเตรียมการขั้นสุดท้ายเพื่อเผยแพร่ซอฟต์แวร์ของคุณ ซึ่งอาจรวมถึงการชนกับหมายเลขเวอร์ชันของไฟล์ ตรวจสอบให้แน่ใจว่าการแปลของคุณเสร็จสิ้น หรือการตรวจสอบโค้ดขั้นสุดท้าย
3. โปรแกรมแก้ไขด่วน
สาขาโปรแกรมแก้ไขด่วนสร้างขึ้นจากสาขาหลักและใช้เพื่อมีการเปลี่ยนแปลงที่จำเป็นต้องได้รับการจัดการในแอปพลิเคชันที่ใช้งานจริงทันที นี่อาจเป็นจุดบกพร่องที่ต้องแก้ไขหรือปัญหาด้านความปลอดภัยที่ต้องจัดการ
เมื่อปัญหาได้รับการแก้ไขและนำไปใช้กับสาขาหลักของคุณแล้ว คุณจะต้องแท็กโค้ดของคุณด้วยหมายเลขเวอร์ชันที่ถูกต้อง
เหตุผลที่ใหญ่ที่สุดที่ทีมไม่ได้ใช้ git-flow คือวิธีที่เราเผยแพร่ซอฟต์แวร์เปลี่ยนไป แทนที่จะออกเวอร์ชันที่ใหญ่กว่าบ่อยกว่า คุณอาจเผยแพร่การเปลี่ยนแปลงในแอปพลิเคชันได้สองสามครั้งในหนึ่งวัน ฉันรู้ว่าฉันส่งงานไปยังไซต์ของลูกค้าหลายครั้งต่อสัปดาห์ทันทีที่พร้อม เราไม่ได้ทำหมายเลขเวอร์ชันของไซต์ เราเพียงแค่ปรับปรุงอย่างต่อเนื่อง
git-flow มาตรฐานไม่ได้มีไว้สำหรับรองรับสิ่งนี้
Github Flow
ตัวเลือกที่สองที่หลายคนใช้คือ Github Flow
กฎข้อใหญ่ข้อหนึ่งของ Github Flow คือโค้ดใดก็ตามที่อยู่ในสาขาหลักสามารถนำไปใช้งานได้ตลอดเวลาเพราะมันพร้อมสำหรับการผลิต
สาขาทั้งหมดถูกสร้างขึ้นจากสาขาหลักพร้อมชื่อที่สื่อความหมายสำหรับสิ่งที่คุณกำลังทำ
เมื่อคุณเตรียมการเปลี่ยนแปลงแล้ว คุณก็สร้างคำขอดึง
คำขอดึงจะบอกผู้อื่นที่ทำงานในรหัสเดียวกันว่างานที่คุณทำนั้นพร้อมสำหรับการตรวจสอบก่อนที่การเปลี่ยนแปลงเหล่านั้นจะรวมเข้ากับรหัสหลัก
เมื่อคุณส่งคำขอดึงแล้ว ทีมที่คุณทำงานด้วยสามารถตรวจสอบการเปลี่ยนแปลงและให้ข้อเสนอแนะได้ หากคำขอดึงนั้นพร้อมที่จะรวม คำขอนั้นจะถูกรวมเข้ากับสาขาหลักสำหรับโครงการของคุณ
ข้อเสียเปรียบประการหนึ่งของโฟลว์ Github สำหรับนักพัฒนาเพียงคนเดียวหรือทีมขนาดเล็กมากคือ การดูแลจัดการคำขอดึงสามารถสร้างค่าใช้จ่ายเพิ่มเติมในการจัดการโครงการ นี่คือเหตุผลที่ฉันไม่ใช้มันในงานของฉัน
ฉันจะใช้เวิร์กโฟลว์ Git กับโปรเจ็กต์ไคลเอนต์ได้อย่างไร
ในงานลูกค้าของฉัน ปกติแล้วฉันเป็นเพียงคนเดียวที่เขียนโค้ดสำหรับโครงการในแต่ละวัน ลูกค้าของฉันอาจอัปเดตปลั๊กอิน WordPress หรือเปลี่ยน CSS บางส่วน แต่ไม่ได้ทำงานเขียนโค้ดที่สำคัญใดๆ นั่นหมายความว่าหากฉันใช้ Github flow ฉันจะตรวจสอบคำขอดึงของฉันซึ่งสร้างแต่ปัญหาการจัดการเพิ่มเติมเท่านั้น มาดูระบบที่ฉันใช้กัน ซึ่งมีความคล้ายคลึงกับทั้ง git-flow และ Github flow
ฉันมีสองสาขาหลักที่เรียกว่าหลักและการแสดงละคร สาขาหลักติดตามด้วยโค้ดใดก็ตามที่กำลังทำงานอยู่บนไซต์ที่ใช้งานจริง staging branch ติดตามสิ่งที่กำลังทดสอบบนไซต์ staging ที่เราใช้เพื่อทดสอบการเปลี่ยนแปลงก่อนที่เราจะพุชไปยังไซต์จริง
ทุกสาขาถูกสร้างขึ้นจากสาขาหลัก ฟีเจอร์ใหม่มีชื่อดังนี้: feature/32-new-feature ในบริบทนี้ หมายเลข 32 จะสอดคล้องกับหมายเลขตั๋วในระบบการจัดการโครงการของเรา และคำที่อยู่ข้างหลังเป็นคำอธิบายสั้นๆ เกี่ยวกับสิ่งที่กำลังดำเนินการอยู่ การแก้ไขข้อบกพร่องได้รับการตั้งชื่อในทำนองเดียวกัน bug/20-bug-name
ทุกสาขาที่สร้างขึ้นจะถูกรวมเข้ากับสาขาการจัดเตรียมของเราก่อน จากนั้นเมื่อได้รับอนุมัติจากลูกค้าหรือทดสอบด้วยตัวเองจะถูกรวมเข้ากับสาขาหลัก เวิร์กโฟลว์นั้นอาจมีลักษณะเช่นนี้
# ผสานคุณสมบัติเข้ากับสาขาการแสดงละคร
คุณสมบัติการผสาน git/32-new-feature
# ปรับใช้และทดสอบคุณสมบัติ
git ชำระเงินหลัก
คุณสมบัติการผสาน git/32-new-feature
# ปรับใช้คุณสมบัติกับไซต์สด
ในโครงการของฉัน ฉันมีการตั้งค่าการปรับใช้อย่างต่อเนื่อง ซึ่งหมายความว่าทุกครั้งที่ฉันกดรหัสไปที่หลัก รหัสจะถูกผลักไปยังไซต์ที่ใช้งานจริงโดยอัตโนมัติ มีการตั้งค่ากระบวนการเดียวกันสำหรับสาขาการแสดงละคร
ถ้าฉันทำงานกับทีมที่สามารถตรวจสอบรหัสของฉันในเวิร์กโฟลว์คำขอดึง ฉันจะใช้ระบบนี้เพราะมันทำงานได้ดีในทีม สำหรับนักพัฒนาซอฟต์แวร์ส่วนใหญ่ที่ทำงานด้วยตัวเอง เป็นเพียงค่าใช้จ่ายในการบริหารจัดการที่จะทำให้เวิร์กโฟลว์ของคุณช้าลง
คำสั่ง Git ขั้นสูงที่ฉันใช้
ตอนนี้เรามีแนวคิดแล้วว่าจะใช้ Git ได้อย่างไรในเวิร์กโฟลว์ที่ใช้งานได้จริง มาดูคำสั่งขั้นสูงเพิ่มเติมที่จำเป็นเพื่อให้สิ่งนี้เกิดขึ้น ฉันใช้แต่ละคำสั่งเหล่านี้อย่างน้อยสัปดาห์ละสองครั้งในขณะที่ฉันทำงานกับรหัสของลูกค้า
แม้ว่าคุณจะใช้แอปพลิเคชัน GUI (ฉันได้พูดถึงสิ่งดี ๆ บางอย่างในโพสต์ล่าสุดของฉันบน Git) ก็ยังเป็นสิ่งสำคัญที่จะต้องมีความเข้าใจในสิ่งที่เกิดขึ้นในเบื้องหลัง หลายครั้งที่ฉันต้องทำงานผ่านเทอร์มินัลเพื่อแก้ไขปัญหาที่สร้างโดยแอปพลิเคชัน Git GUI
การเพิ่มการเปลี่ยนแปลงโดย Line
คำสั่งเดียวที่ทำให้การใช้งาน Git ผ่าน Terminal คลิกสำหรับฉันคือ git add -p จนกว่าฉันจะเรียนรู้คำสั่งนี้ ฉันใช้แอปพลิเคชัน GUI เพราะฉันจะทำการเปลี่ยนแปลงในโค้ดของฉัน แต่ต้องการแยกบรรทัดเฉพาะออกเป็นคอมมิตต่างๆ เพื่อที่ฉันจะได้อธิบายได้ว่าทำไมฉันถึงทำการเปลี่ยนแปลง ในการทำเช่นนี้ ฉันใช้ GUI เพื่อเลือกบรรทัด แต่ git add -p จะแนะนำคุณผ่านอินเทอร์เฟซแบบโต้ตอบเพื่อเพิ่มการเปลี่ยนแปลงในส่วนต่างๆ
ฉันใช้สิ่งนี้หลายครั้งทุกวัน
ติดตามสาขา Git ระยะไกล
หากคุณกำลังดึงที่เก็บที่มีอยู่และมีสาขาเช่น main และ staging ที่คุณต้องการติดตาม แต่มีอยู่แล้ว คุณต้องบอกสาขาเวอร์ชัน ในพื้นที่ ของคุณเพื่อติดตามเวอร์ชัน ระยะไกล ของสาขา
มีสองสามวิธีในการทำเช่นนี้
# ตั้งค่าอัปสตรีมเมื่อกดไปที่รีโมท
git push -u การแสดงละครต้นกำเนิด
# ตั้งต้นน้ำ
# ถือว่าคุณอยู่ในสาขาที่คุณต้องการติดตามด้วยรีโมท
สาขา git -u ต้นทาง / การแสดงละคร
สาขา git --set-upstream-to=origin/staging
# หากคุณไม่ได้อยู่ในสาขาที่คุณต้องการติดตามดังนั้นคุณจึงระบุสาขาในตอนท้าย
สาขา git --set-upstream-to=origin/staging staging
บันทึกการเปลี่ยนแปลงโดยไม่ต้องผูกมัด
บางครั้งคุณอาจอยู่ท่ามกลางงานบางอย่างที่ยังไม่พร้อมจะลงมือทำ แต่คุณต้องรักษาสถานะไว้ นั่นคือสิ่งที่ git stash มีประโยชน์ คำสั่งนี้ซ่อนการเปลี่ยนแปลงสำหรับคุณโดยลบการเปลี่ยนแปลง คุณสามารถนำมันกลับมาได้โดยใช้ git stash pop มีคำสั่งอีกสองสามคำสั่งที่จะทำให้ที่เก็บสะสมมีประโยชน์ แต่นี่เป็นคำสั่งสองคำสั่งที่ฉันใช้เป็นประจำ
ดึงข้อผูกพัน Git เฉพาะ
บางครั้งคุณจำเป็นต้องดึงความมุ่งมั่นเฉพาะเข้าไปในงานปัจจุบันของคุณ ด้วย clean HEAD (คุณยังไม่ได้ทำการเปลี่ยนแปลงใดๆ) คุณสามารถดึงคอมมิตเฉพาะด้วย git cherry-pick ได้ คุณสามารถค้นหาเอกสารฉบับเต็มเกี่ยวกับ git cherry-pick ได้ที่นี่
สำหรับแต่ละคอมมิต Git จะสร้างลำดับตัวอักษรและตัวเลขแบบยาวซึ่งเรียกว่า Git Object และโดยทั่วไปจะเรียกว่า SHA เนื่องจากแต่ละคอมมิชชันได้รับหนึ่งอัน คุณจึงสามารถอ้างอิงคอมมิตด้วยค่า SHA ของมันได้ อ่านเพิ่มเติมเกี่ยวกับ Git Objects
ทิ้งการเปลี่ยนแปลงที่คุณไม่ต้องการ
ในบางจุดในโครงการใด ๆ เราจะทำการเปลี่ยนแปลงและตระหนักว่ามันไม่ทำงาน และเราจำเป็นต้องเพียงแค่ทิ้งมันและเริ่มต้นใหม่ แทนที่จะพยายามเลิกทำจนกว่าเราจะกลับมาที่ที่เราต้องการ เราสามารถใช้คำสั่ง Git ต่อไปนี้เพื่อลบการเปลี่ยนแปลงที่ยังไม่ได้ติดตาม
รีเซ็ต git --hard
คำสั่งด้านบนจะรีเซ็ตโค้ดของคุณกลับไปเป็นคอมมิตล่าสุดบนแบรนช์ที่คุณกำลังดำเนินการอยู่ นอกจากนี้เรายังสามารถใช้ <#commitSHA> กับคำสั่งนี้เพื่อรีเซ็ตการคอมมิตเฉพาะได้ หากเราต้องการกลับสู่สถานะก่อนการคอมมิตล่าสุด บางทีคุณอาจใช้สิ่งนี้เพื่อรีเซ็ตเป็นการชำระเงินของสาขาเริ่มต้น เนื่องจากงานทั้งสาขาไม่ใช่สิ่งที่คุณต้องการเก็บไว้ แต่คุณได้ติดตามงานบางส่วนแล้ว
เพื่อก้าวไปอีกขั้น เราสามารถทิ้งไฟล์หรือไดเร็กทอรีที่ยังไม่ได้ติดตามในคอมไพล์ด้วยคำสั่ง git clean
git clean -fd: แฟล็ก f และ d บอกให้ git ทิ้งไฟล์และไดเร็กทอรีที่ไม่ได้ติดตาม
ลบสาขา
ทุกสัปดาห์หรือสองสัปดาห์ ฉันจะดูผลลัพธ์ของคำสั่งสถานะ git และพบว่าฉันมีสาขามากเกินไปที่จะเข้าใจอย่างสมเหตุสมผลว่าเกิดอะไรขึ้นในที่เก็บของฉัน นั่นหมายความว่าฉันสามารถลบสาขาใดๆ ที่สอดคล้องกับตั๋วที่ได้รับการแก้ไขด้วยคำสั่งต่อไปนี้
# ลบเวอร์ชันท้องถิ่น
git branch -d $branchname
#ลบสาขาบนรีโมทของฉัน
git push $remotename --delete $branchname
ใช้การควบคุมเวอร์ชัน
แม้ว่าคุณอาจไม่ใช่ผู้เชี่ยวชาญในคำสั่ง Git ทั้งหมดที่คุณจะใช้ แต่สิ่งสำคัญอย่างหนึ่งที่ต้องจำไว้คือ คุณควรใช้การควบคุมเวอร์ชัน แม้ว่าคุณจะเป็นคนเดียวที่ทำงานในโครงการ การใช้เวิร์กโฟลว์ Git และ Git จะช่วยให้คุณจัดระเบียบโครงการได้ คุณไม่จำเป็นต้องกด CTRL + Z จนกว่าคุณจะรีเซ็ตงานหลังจากเขียนโค้ดที่ใช้ไม่ได้
คุณจะสามารถไว้วางใจระบบของคุณและผลิตงานสำหรับโครงการของคุณต่อไป
ลองใช้โฮสติ้ง WordPress ที่มีการจัดการอย่างเต็มที่
ต้องการโฮสติ้งที่เหมาะสำหรับ WordPress หรือไม่? ตรวจสอบแผนโฮสติ้ง WordPress ที่มีการจัดการเต็มรูปแบบของ Nexcess ได้แล้ววันนี้