Saturday, 2 June 2012

What Git ? Why Git ? (Episode 1)

Git คือซอฟต์แวร์ในกลุ่มของ Version Control ประเภท Open Source อีกทางเลือกหนึ่ง มีจุดเด่นในเรื่องของความเร็ว และความสามารถในการใช้งานแบบ Offline (ไม่ต้องเชื่อมต่อ Network ก็ยังสามารถใช้งานได้) เนื่องจากมีการออกแบบให้ใช้งาน Local Repository ทำให้การทำงานส่วนใหญ่ ไม่จำเป็นต้องพึ่งพาการใช้งาน Network ทำให้ Developer สามารถใช้งาน Git ได้ทุกที่ ถึงแม้ไม่มี Network ก็ตาม และการออกแบบดังกล่าวยังช่วยส่งผลให้ Git สามารถทำงานได้อย่างรวดเร็ว เพราะในการใช้งานโดยทั่วๆไม่มีความจำเป็นต้องติดต่อไปยัง Server แต่ก็ยังมีบาง Feature ที่ยังต้องการ Network เพื่อการใช้งาน อย่างเช่นการใช้งาน Git ในแบบ Remote ซึ่งจะมีการ Push หรือ Pull ข้อมูลระหว่างเครื่องของเรากับ Remote Repository

Data Flow แสดงการทำงานของ Git

Git ได้รับการออกแบบและพัฒนาขึ้นโดย Linus Torvalds เพื่อใช้เป็นเครื่องมือในการ Share และควบคุม Source Code ในช่วงของการพัฒนา Linux Kernel ชื่อของ Git มีที่มาจากคำ Slang ในภาษาอังกฤษ หมายถึง คนงี่เง่า หรือคนที่ไม่น่าคบหา

ปัจจุบันมี Website ที่ให้บริการในการเก็บ Source Code ในรูปแบบของ Git Repository อยู่หลายที่ด้วยกัน อาทิเช่น Google Code, GitHub, SourceForge เป็นต้น


Snapshots, Not Differences

ความแตกต่างที่สำคัญระหว่าง Git กับ Version Control ตัวอื่นๆในปัจจุบัน ก็คือแนวคิดในเรื่องการเก็บข้อมูล ซึ่ง Version Control ที่มีอยู่ในปัจจุบัน (CVS, Subversion, Perforce, Bazaar) จะเก็บข้อมูลโดยเริ่มจาก List ของ Files ต้นฉบับ จากนั้นก็จะคอยเก็บบันทึกการเปลี่ยนแปลงที่เกิดขึ้นในแต่ละ Version (หรือที่เรียกว่า Delta) ดังที่แสดงในภาพข้างล่าง

แสดงรูปแบบการบันทึกการเปลี่ยนแปลงของ Version Control ที่ใช้อยู่ทั่วไปในปัจจุบัน


แต่ Git ไม่ได้คิดเช่นนั้น แนวคิดที่ Git นำมาใช้ในการจัดการกับ Data มีความแตกต่างออกไป Git มองว่า Data ณ ขณะใดขณะหนึ่งนั้นเป็นเหมือนกับ Snapshot ของระบบ File System ทุกครั้งที่เราสั่ง Commit (เป็นการสั่ง Save State) Git ก็จะทำการจัดเก็บ Snapshot ของ File ที่มีการเปลี่ยน ณ ขณะนั้น (เก็บทั้ง File ไม่ได้มีการจัดเก็บเพียงแค่ส่วนที่เปลี่ยนแปลง) และทำการจัดเก็บ pointer ที่เป็นตัว reference ไปถึง Snapshot นั้นๆ Git จะไม่เก็บ Snapshot ของ File ที่ไม่ได้มีการเปลี่ยนแปลง แนวคิดการบันทึกการเปลี่ยนแปลงในรูปแบบของ Snapshot สามารถแสดงได้ดังภาพข้างล่าง

แนวคิดของ Git ในการจัดเก็บการเปลี่ยนแปลงของ File ในแบบ Snapshot

ซึ่งแนวคิดที่แตกต่างจาก Version Control ทุกตัวที่มีในปัจจุบัน ทำให้ Git เป็น Next Generation ของ Version Control ในยุคปัจจุบัน

The Three States

Git แบ่ง File ออกเป็น 3 สถานะด้วยกัน คือ Commited, Modified และ Staged  สำหรับ File ที่อยู่ในสถานะ Commited หมายความว่า File นั้นถูกจัดเก็บลงใน Local Database เรียบร้อยแล้ว สำหรับ File ที่อยู่ในสถานะ Modified หมายความว่า File นั้นมีการเปลี่ยนแปลง และยังไม่ได้ถูกจัดเก็บลงใน Local Database และสำหรับ File ที่อยู่ในสถานะ Staged หมายความว่า File ที่มาการเปลี่ยนแปลงนั้นอยู่ในสภาวะเตรียมพร้อมที่จะเข้าสู่การ Commit ในครั้งถัดไป ซึ่งจากสถานะดังกล่าว สามารถใช้อธิบายถึง การแบ่งโครงสร้าง Directory ของ Git Project ซึ่งได้แก่ Git Directory, Working Directory และ Staging Area

Working directory, staging area, and git directory

Git Directory ก็คือ Directory ที่ Git ใช้ในการจัดเก็บ Metadata และ Database สำหรับ Project ซึ่งถือว่าเป็นส่วนที่สำคัญที่สุดของ Git และในเวลาที่เราทำการ Clone จาก Repository นึง ไปยังอีก Repository นึง File ทั้งหมดในบริเวณนี้นี่เองที่จะถูก Copy ข้ามไป

Working Directory ก็คือ Directory หลักที่เราใช้เก็บ Source Code ซึ่ง File ที่ปรากฎใน Directory นี้จะมาจากการ Checkout จาก Git Project (ใน Git Project เราสามารถ Check Out เพื่อนำ File ออกมา โดยยสามารถ Check Out จาก Version ไหนก็ได้ที่เรามีการบันทึกไว้)

Staging Area ก็คือ Directory สำหรับเก็บ Files ที่จะรอสำหรับการ Commit ในครั้งถัดไป Git จะ Commit เฉพาะ Files ที่อยู่ใน Directory นี้เท่านั้น (Directory นี้จะอยู่ภายใน Git Directory) สำหรับ Files ที่อยู่ในบริเวณนี้ บางครั้งเราก็เรียกว่า Index

Git Workflow
สำหรับ Workflow การทำงานกับ Git สรุปคร่าวๆ ได้ตามขั้นตอนดังต่อไปนี้

1. เราแก้ไข Files ที่อยู่ใน Working Directory
2. จากนั้นเราจะทำการ Add Files ที่มีการเปลี่ยนแปลงเข้าสู่ Staging Area
3. ขั้นตอนถัดมา เราจะทำการ Commit  เพื่อให้ Git ทำการเก็บ Snapshop ของ Files ที่อยู่ใน Staging 

สำหรับบทความนี้ค่อนข้างจะยาว ขอจบแค่นี้ก่อนแล้วกันนะครับ สำหรับในตอนต่อไป ผมจะมาเล่าให้ฟังในเรื่องของการติดตั้ง Git บน Windows และการใช้งาน Git Command ทั่วๆไป ยังไงก็ติดตามอ่านแล้วกันนะครับ

แหล่งที่มา
http://en.wikipedia.org/wiki/Git_%28software%29
http://git-scm.com

No comments:

Post a Comment