Git คืออะไร

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

การพัฒนา

ปี 2005: Linus Torvalds เริ่มพัฒนา Git หลังจากที่ทีมงาน Linux kernel ประสบปัญหากับระบบควบคุมเวอร์ชันเดิมที่ใช้ชื่อว่า BitKeeper ซึ่งเปลี่ยนแปลงเงื่อนไขการใช้งาน ทำให้ Linus และทีมงานต้องการระบบใหม่ที่สามารถใช้งานได้ฟรีและเปิดเผยซอร์สโค้ด

ปี 2005 (เดือนเมษายน): Git ถูกเปิดตัวเป็นครั้งแรก และในเวลาไม่นานก็ได้รับความนิยมเนื่องจากความเร็ว ความยืดหยุ่น และการออกแบบที่เหมาะสมกับโครงการซอฟต์แวร์ขนาดใหญ่

แม้ว่า นักพัฒนาแต่ละคนสามารถ ทำงานแบบ Decentralized ได้เพราะมี repo เป็นของตัวเอง แต่ก็ยังสามารถทำงานร่วมกันแบบ Centralized ได้ โดยอ้างเอิง ด้วย repo ที่ชื่อว่า ``origin```

การติดตั้ง Git

  • Fedora, Centos
$ sudo dnf update -y
$ sudo dnf install git
  • Ubuntu
$ sudo apt update -y
$ sudo apt install git -y
  • สำหรับ windows สามารถ Downlaod Git terminal ได้ที่ https://git-scm.com/

ก่อนที่จะมี Git

Copy File & Folder คือ ลักษณะการบันทึกเอกสารและแยกออกเป็นหลายๆไฟล์ แล้วตั้งชื่อไฟล์พร้อมระบุเวอร์ชั่นตามลำดับ

ข้อเสีย :

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

คุณสมบัติที่สำคัญของ Git

  1. Distributed Version Control: ทุกๆ นักพัฒนาที่ทำงานในโครงการเดียวกันจะมีสำเนาของ repository ทั้งหมดในเครื่องของตนเอง ทำให้ทุกคนสามารถทำงานได้อย่างอิสระโดยไม่ต้องพึ่งพา server กลาง

  2. Branching: Git ช่วยให้คุณสามารถสร้างสาขา (branch) เพื่อพัฒนาฟีเจอร์ใหม่ๆ โดยไม่กระทบต่อโค้ดหลัก และเมื่อฟีเจอร์นั้นพร้อมใช้งาน คุณสามารถ merge สาขากลับไปยังสาขาหลักได้

  3. Staging Area: Git มีพื้นที่กลางที่เรียกว่า staging area ซึ่งคุณสามารถเลือกไฟล์ที่ต้องการจะบันทึกการเปลี่ยนแปลง และค่อย commit การเปลี่ยนแปลงนั้นเข้า repository

  4. History: Git บันทึกประวัติการเปลี่ยนแปลงทั้งหมดของโครงการ ทำให้ง่ายต่อการตรวจสอบว่าใครทำอะไร เมื่อไหร่ และทำไม

การใช้งาน Git

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

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

Git Data Model

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

1. Snapshots (สแนปชอต)

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

2. Blobs (บล๊อบส์)

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

3. Trees (ทรีส์)

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

4. Commits (คอมมิทส์)

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

5. Branches (สาขา)

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

6. Tags (แท็กส์)

Tag ใน Git คือ pointer ที่ไม่เปลี่ยนแปลง ซึ่งมักใช้ในการทำเครื่องหมาย commit สำคัญ เช่น การปล่อยเวอร์ชันของซอฟต์แวร์ Tags จะถูกใช้ในการอ้างอิง commit ที่เฉพาะเจาะจงโดยไม่คำนึงถึง branch ที่มันอยู่

<root> (tree)
|
+- foo (tree)
|  |
|  + bar.txt (blob, contents = "hello world")
|
+- baz.txt (blob, contents = "git is wonderful")

  • root คือ Top folder ที่ต้องการ Track
  • Tree คื Folder
  • blob คือ File

สรุป

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

การจำลองประวัติ (History): การเชื่อมโยงสแนปชอต (Snapshot)

การเชื่อมโยงสแนปชอตควรทำอย่างไร?

ในระบบควบคุมเวอร์ชัน วิธีหนึ่งที่ง่ายที่สุดในการเชื่อมโยงสแนปชอตคือการใช้ประวัติแบบเส้นตรง (linear history) ซึ่งประวัติจะเป็นรายการของสแนปชอตที่เรียงตามลำดับเวลา วิธีนี้เป็นแบบจำลองที่เข้าใจง่ายและตรงไปตรงมา แต่ Git ไม่ใช้วิธีนี้เนื่องจากข้อจำกัดหลายประการ

ประวัติใน Git: Directed Acyclic Graph (DAG)

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

กราฟแบบไม่วนกลับ (DAG) คืออะไร?

DAG หมายความว่าแต่ละสแนปชอตใน Git จะมีการอ้างอิงถึงชุดของ "Parent" ซึ่งเป็นสแนปชอตที่เกิดขึ้นก่อนหน้า โดย "parent" เหล่านี้สามารถมีได้มากกว่าหนึ่งชุด เนื่องจากการ Merge Process ซึ่งเกิดจากการที่สแนปชอตอาจมีที่มาจากหลายสาขา (branch) ที่ถูกพัฒนาไปพร้อมกันแล้วถูกนำมารวมกัน (merge) ในภายหลัง

คอมมิต (Commit)

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

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

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

SHA-1 เป็นอัลกอริธึมที่ใช้ในการสร้างค่าเช็คซัมซึ่งเป็นสตริงที่ประกอบด้วยตัวอักษร 40 ตัวในรูปแบบฐานสิบหก (hexadecimal) ค่าเช็คซัมนี้ถูกคำนวณจากเนื้อหาของไฟล์และโครงสร้างของไดเรกทอรีใน repository ซึ่งหมายความว่าหากมีการเปลี่ยนแปลงใดๆ ในไฟล์หรือโครงสร้างไดเรกทอรี ค่า SHA-1 ที่สร้างขึ้นจะเปลี่ยนไปด้วย

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

การแสดงภาพของประวัติใน Git

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

Git Branch คืออะไร?

ความหมายของ Branch ใน Git

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

การทำงานของ Branch

เมื่อคุณสร้าง Branch ใหม่ Git จะสร้าง pointer ที่ชี้ไปยังคอมมิตปัจจุบันที่คุณทำงานอยู่ และจากนั้นคุณสามารถเริ่มทำงานใน Branch นั้นได้โดยการทำคอมมิตต่างๆ ใน Branch ของคุณโดยเฉพาะ เมื่อคุณทำการ commit ใน Branch ใหม่ pointer ของ Branch จะอัพเดตให้ชี้ไปยังคอมมิตล่าสุดที่คุณทำไว้

การสลับระหว่าง Branch

Git ช่วยให้คุณสามารถสลับไปมาระหว่าง Branch ต่างๆ ได้อย่างง่ายดายโดยใช้คำสั่ง git checkout หรือ git switch การสลับ Branch จะเปลี่ยนสถานะของไฟล์ในโฟลเดอร์ทำงานของคุณให้ตรงกับสแนปชอตล่าสุดของ Branch ที่คุณเลือกสลับไป ซึ่งหมายความว่าคุณสามารถทำงานในหลายๆ สายการพัฒนาได้โดยไม่ต้องกังวลว่าโค้ดจาก Branch หนึ่งจะส่งผลต่ออีก Branch หนึ่ง

การรวม Branch (Merging)

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

การลบ Branch

หลังจากที่คุณรวม Branch เข้ากับ Branch อื่นแล้ว และไม่ต้องการใช้งาน Branch นั้นอีก คุณสามารถลบ Branch ได้โดยใช้คำสั่ง git branch -d หรือ git branch -D หาก Branch นั้นยังไม่ได้ถูกรวม (unmerged) การลบ Branch ที่ไม่จำเป็นจะช่วยลดความซับซ้อนของโครงการและช่วยให้การจัดการโค้ดเป็นระเบียบมากขึ้น

สรุป

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

Git LAB

เครียมความพร้อม ติดตั้ง Git command line และ Git Bash บน windows

  • สำหรับ windows สามารถ Downlaod Git terminal ได้ที่ https://git-scm.com/

เปิด Git Bash terminal

จะได้ terminal ด้านล่าง (เป็น terminal ที่รองรับ linux command) พัฒนามาจาก MINGW64 https://www.mingw-w64.org/

Git GUI เพื่อให้การบริหารจัดการ แบบ GUI

เราสามารถใช้งาน Git Gui ได้หลาย Software ได้แก่

LAB1 เรียนรู้ Git อย่าง ง่ายผ่านทาง Animation

https://onlywei.github.io/explain-git-with-d3/

LAB2 เรียนรู้ Git ผ่านทาง Terminal

สำหรับ ใน lab ต่อจากนี้ไป จะทำบน git bash terminal นะครับ เพื่อความสะดวกในการใช้งาน git command line

step1 บอกให้ Git รู้ว่าเราเป็นใคร การตั้งค่าชื่อผู้ใช้และอีเมล

$ git config --global user.name "Sawangpong Muadphet"
$ git config --global user.email "sawangpongm@gmail.com"

คำสั่งเหล่านี้ใช้ในการตั้งค่าชื่อผู้ใช้และอีเมลที่ Git จะใช้ในการบันทึกข้อมูลคอมมิตแต่ละครั้ง โดยมีรายละเอียดดังนี้:

  • --global หมายความว่าการตั้งค่านี้จะมีผลกับทุก repository ในเครื่องของคุณ
  • user.name ใช้ในการตั้งชื่อผู้ใช้
  • user.email ใช้ในการตั้งค่าอีเมลที่ใช้ในการบันทึกคอมมิต

step2 การเปิดใช้งานสีในการแสดงผล

$ git config --global color.ui true
$ git config --global -e

step3 แสดงค่า config

$ git config --list

step4 การเริ่มต้น Repository

  • 4.1 การสร้าง Repository ใหม่ ในการเริ่มต้นโปรเจกต์ใหม่ ให้สร้าง repository ใหม่โดยใช้คำสั่ง:
$ mkdir git_lab1
$ cd git_lab1
$ git init .
Initialized empty Git repository in C:/Users/sysadmin/git_lab1/.git/

$ ls -la
total 24
drwxr-xr-x 1 sysadmin 197121 0 Aug 12 15:47 ./
drwxr-xr-x 1 sysadmin 197121 0 Aug 12 15:46 ../
drwxr-xr-x 1 sysadmin 197121 0 Aug 12 15:47 .git/
  • คำสั่งนี้จะสร้างโฟลเดอร์ .git ในไดเรกทอรีปัจจุบัน ซึ่งจะใช้ในการเก็บข้อมูลของ Git เป็น hidden folder เนื่องจากขึ้นต้นด้วย จุด ต้องใช้คำสั่ง ls -la
$ ls -la
total 12
drwxr-xr-x.  3 sysadmin sysadmin 4096 Aug 10 19:25 .
drwx------. 37 sysadmin sysadmin 4096 Aug 10 19:25 ..
drwxr-xr-x.  7 sysadmin sysadmin 4096 Aug 10 19:26 .git

  • 4.2 สร้าง file หลังจากสร้าง repository แล้ว ให้เพิ่มไฟล์เข้าไปและทำการคอมมิต:
$ echo "task1  create project" > tasks.txt
$ git status

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	tasks.txt

nothing added to commit but untracked files present (use "git add" to track)

screen: git แจ้งว่า file ที่สร้างมาใหม่ ที่ชื่อ tasks.txt ยังไม่ได้ถูก tracks และแนะนำให้ใช้คำสั่ง git add เพื่อเริ่มต้นการ Track

Git แสดงผลเป็นสีแดงเนื่องตากยังไม่ได้มี การ Add file tasks.txt ไว้ใน state area

  • 4.3 การเพิ่มไฟล์และการทำคอมมิตแรก
$ git add .
warning: in the working copy of 'tasks.txt', LF will be replaced by CRLF the next time Git touches it

$ git commit -m "Initial commit"
[master (root-commit) 6364659] Initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 tasks.txt
  • git add . ใช้ในการเพิ่มไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันเข้าสู่ staging area
  • git commit -m "Initial commit" ใช้ในการบันทึกการเปลี่ยนแปลงเป็นคอมมิต
warning: in the working copy of 'tasks.txt', LF will be replaced by CRLF the next time Git touches it

  • 4.4 handle end of line ใน windows

windows และ mac/linux จะมีความแตกต่างกันสำหรับ endofline ดังนั้น จะต้องทำการ Config ค่าของ Git ให้ถูกต้อง

$ git config --global core.autocrlf input
$ git config --global --list
user.email=sawangpongm@gmail.com
user.name=Sawangpong Muadphet
color.ui=true
core.autocrlf=input

step5 การใช้งานคำสั่ง git log

$ git log

คำสั่งนี้จะแสดงประวัติของคอมมิตทั้งหมดใน branch ปัจจุบันใน terminal โดยรายละเอียดจะรวมถึง:

  • SHA-1 ของคอมมิต
  • Author: ชื่อผู้ทำคอมมิต
  • Date: วันที่และเวลา
  • Commit message: ข้อความคอมมิต

คำสั่ง git log ที่ต้องใช้ในอนาคต

$ git log <branch-name>
$ git log --oneline
$ git log --graph --oneline 

ตัวอย่าง การแสดงผลแบบ Graph

*   0e25143 (HEAD, main) Merge branch 'feature'
|\  
| * 16b36c6 Fix a bug in the new feature
| * 23ad9ad Start a new feature
* | ad8621a Fix a critical security issue
|/  
* 400e4b7 Fix typos in the documentation
* 160e224 Add the initial code base

Ref คำสั่ง log เพิ่มเติม https://www.atlassian.com/git/tutorials/git-log

แก้ไขไฟล์ tasks.txt จำลองการพัฒนา code

ลอง แก้ไขไฟล์ tasks.txt ดู

$ echo "task2  develop/code project" >> tasks.txt

และทดสอบคำสั่งต่อไปนี้ เพื่อเป็นการทบทวน

$ git status

git แสดง modified

$ git add .
$ git commit "Add develop code"
[master 60d42ba] Add develop code
 1 file changed, 1 insertion(+)

สั่ง คำสั่ง:

$ git log

สั่ง คำสั่ง: git log -p เพื่อดูรายละเอียดของการเปลี่ยนแปลง

$ git log -p

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

step6 เรียนรู้คำสั่ง การสร้าง Branch

  • 6.1 การสร้าง Branch ใหม่ เพื่อสร้าง branch ใหม่ ให้ใช้คำสั่ง:

รูปแบบ:

$ git branch branch-name

แทนที่ branch-name ด้วยชื่อของ branch ที่คุณต้องการสร้าง

  • 6.2 การตรวจสอบ Branch สามารถตรวจสอบรายชื่อ branch ทั้งหมดได้ด้วยคำสั่ง:

รูปแบบ:

$ git branch

Branch ที่กำลังใช้งานจะมีเครื่องหมาย * ข้างหน้า

  • 6.3 การสลับ Branch การสลับไปยัง Branch อื่น เพื่อสลับไปยัง branch อื่น ให้ใช้คำสั่ง:

รูปแบบ:

$ git checkout branch-name

หรือใช้คำสั่ง git switch เป็นคำสั่งใหม่กว่า:

รูปแบบ:

$ git switch branch-name

การสร้างและสลับไปยัง Branch ใหม่ในคำสั่งเดียว สามารถสร้าง branch ใหม่และสลับไปที่ branch นั้นได้ด้วยคำสั่ง:

รูปแบบ:

$ git checkout -b branch-name

หรือสามารถใช้คำสั่ง git switch ใช้คำสั่งใหม่กว่า:

$ git switch -c branch-name

Git Flow branch model

Gitflow branching model เป็นการกำหนด โครงสร้างของการจัดการสถานะ (Stages) ของ การพัฒนา ในแต่ละ project จะมี Branch หลัก (primary branch) หลักอยู่ 2 branch ที่มีอายุอยู่ตลอดไป มีมีการลบ Branch

  • master ปรกติจะถูกสร้างจาก ขั้นตอนของการทำ initialization
  • develop สร้างจาก master จะเป็น Branch ที่คู่ขนานกัน

สร้าง branch develop จาก master

สั่งคำสั่ง สำหรับการสร้าง branch

$ git branch
* master

$ git checkout -b develop master
Switched to a new branch 'develop'

$ git  branch
* develop
  master

เราถือว่า origin/master เป็น Brance จะต้องสะท้อนถึงสถานะพร้อมใช้งานจริงเสมอ Production เราถือว่า origin/develop เป็น Branch ต้องสะท้อนถึงสถานะที่มีการเปลี่ยนแปลงการพัฒนาล่าสุดสำหรับการ Release ครั้งถัดไป

เมื่อโค้ดต้นแบบในสาขา develop ถึงจุดเสถียรภาพและพร้อมสำหรับการปล่อย ผ่านการ Test และ แก้ไข Bug หมดแล้ว (Green) การเปลี่ยนแปลงทั้งหมดควรจะถูก merge กลับไปยัง master อย่างไรก็ตาม และติดแท็กหมายเลขเวอร์ชัน วิธีการทำแบบละเอียดจะกล่าวถึงต่อไป

ดังนั้น ทุกครั้งที่มีการ merge การเปลี่ยนแปลงกลับไปยัง master นั่นคือการ เตรียม Release ใหม่

Support Branch

นอกจาก master, develop branch แล้ว ยังมี Branch ที่เกิดขึ้นระหว่างกระบวนการ การพัฒนา และจะถูก Delete เมื่อ merge กลับมาก ได้แก่

  • Feature Branches ดึงมาจาก develop และถูก merge กับไปยัง develop
  • Release Branch ดึงมาจาก develop และถูก merge กับไปยัง develop
  • Hotfix Branch ดึงมาจาก master และถูก merge กับไปยัง master

ดึงมาจาก develop และถูก merge กับไปยัง develop

นำคำสั่งที่เรียนรู้จากด้านบน มาทำ LAB git workflow ค่อ

สั่ง คำสั่ง: เพื่อสร้าง release branch จาก Branch develop (แนวคิดของ Git flow)

$ git checkout -b release/1.0.0 develop
$ echo "final release/1.0.0" >> tasks.txt
$ cat tasks.txt 

$ git add .
$ git commit -m "Final release/1.0.0"
$ git  diff develop

ให้กลับไป checkout develop branch

$ git checkout develop
$ cat tasks.txt
task1  create project
task2  develop/code project

$ git diff release/1.0.0

ทำการ Merge การเปลี่ยนแปลงจาก release กลับมายัง develop

$ git merge develop release/1.0.0 

Updating 60d42ba..615237f
Fast-forward
 tasks.txt | 1 +
 1 file changed, 1 insertion(+)

check log:

$ git log

commit 615237f584f2b5211b17bc7a43ed0119a7eb8998 (HEAD -> develop, release/1.0.0)
Author: Sawangpong Muadphet <sawangpongm@gmail.com>
Date:   Mon Aug 12 16:38:42 2024 +0700

    Final release/1.0.0

commit 60d42ba30b398ae453192cfa2d296bbbb3e59853 (master)
Author: Sawangpong Muadphet <sawangpongm@gmail.com>
Date:   Mon Aug 12 16:17:30 2024 +0700

    Add develop code

commit 63646592a35aa67bc52681cb0b8a3ba80ce66c00
Author: Sawangpong Muadphet <sawangpongm@gmail.com>
Date:   Mon Aug 12 15:51:22 2024 +0700

    Initial commit

  • HEAD จะชี้ ไปยัง develop , release/1.0.0 เป็นการ merge ล่าสุด

Git workshop2

สร้าง Repository บน github

กรอกข้อมูล

ยังไม่ต้อง Add a README file option จะทำให้ ได้ Reposity ที่ว่างๆ ต่อมา github จะแสดงค่า ค่า setup เพื่อให้เราไปสร้าง git remote ในเครื่อง logo

สำหรับ สร้าง repo ใหม่

echo "# git_lab1" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/opendevbook/git_lab1.git
git push -u origin main

หามี Repository อยู่ แล้วก็ให้ใช้คำสั่งต่อไปนี้

git remote add origin https://github.com/opendevbook/git_lab1.git
git branch -M main
git push -u origin main
  • git remote add origin add remote repository
  • git branch -M main เปลี่ยนชือ branch ปัจจุบัน เป็น main โดย -M flag จะเป็นการ fore ให้เปลี่ยนชื่อ
  • git push -u origin main ทำการ push local repository ไปยัง remote repository ใน branch ชื่อเดียวกัน กับ local และ -u flag ทำหน้า บอกกับ git ว่า origin repository จะทำหน้าที่เป็น upstream

่ก่อนการ Apply คำสั่ง

หลังการสั่งคำสั่ง

คำว่า upstream repository (origin/main) หมายถึง repository ทำหน้าเก็บ Code ที่เป็น code หลัก และทำหน้าที่ sync กับ code ใน local git

Git Fork model

ทดลองการ Fork repository python

Fork https://github.com/python/cpython repository กดปุ่ม Fork

กด create fork

copy repo และ clone มายัง local repo

ให้เรา copy

$ git clone https://github.com/opendevbook/cpython.git
$ cd cpython
$ git branch -r

เปลี่ยน owner ให้เป็นของเรา

เพิ่ม upstream repository

$ git remote -v
origin  https://github.com/opendevbook/cpython.git (fetch)
origin  https://github.com/opendevbook/cpython.git (push)

$ git branch -v

$ git remote add upstream https://github.com/python/cpython
  • เพิ่มที่เก็บโค้ดต้นฉบับ (upstream) เป็น remote ในที่เก็บโค้ดของคุณ

git fetch upstream

$ git fetch upstram

merge upstram เข้ากับ main ของ local

$ git merge upstream/main
  • ผสานการเปลี่ยนแปลงจากสาขา main ของ upstream เข้ากับสาขาในเครื่องของคุณ

ดู commit log ของสาขา upstream

$ git log upstram/main