วันพุธที่ 6 กันยายน พ.ศ. 2560

Basic Git part 2

Git States and Location

ภาพต่อไปนี้เป็น vcs ที่ไม่ใช่ git ซึ่งเก็บความแตกต่างของไฟล์ที่เกิดการแก้ไขไว้เป็น version

***หมายเหตุ ภาพทั้งหมดที่จะนำมาประกอบบทความนี้ขอยกผลประโยชน์อันพึงได้ทั้งหมดแก่
https://git-scm.com/book/en/v2

ให้เทียบกับภาพต่อไปนี้ที่เป็น git ซึ่งเก็บ snapshot หรือจะเรียกว่า binary ของภาพก็ได้มั้ง สมมติสถานการณ์เดียวกัน เมื่อเราแก้ไขไฟล์ A เจ้า git ก็จะบันทึกว่า A1


และเพิ่มเป็น version 2 แต่พอ version 3 ไม่เกิดการแก้ไขไฟล์ A จึงเก็บเป็น reference แบบอ้างอิงไปยัง A1 (snapshot) แทนครับ

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

git นั้นใช้ถัง (repository) อย่างน้อย 1 ถังเสมอ ซึ่งอยู่ในเครื่องของเราเอง เรียกว่า local repository ยังจำกันได้ใช่ไหม การ commit ก็คือการโยนสิ่งที่ต้องการเก็บรักษาลงถังใบนี้ เมื่อไรก็ตามที่เราต้องการแชร์ข้อมูลในถังใบนี้ ก็ให้เรา push ไปไว้ถังอื่น (ซึ่ง online อยู่ใน internet สักที่หนึ่งใน server ใดๆ) ตัวอย่างเช่น GitHub ก็เป็นถังที่ online อยู่นั่นเอง

"Cloud ไหมพี่ เห็นเพื่อนๆใช้ git hub อยู่คับ" ครับผม

 "Commit คือการเก็บในlocal ก่อนใช่มั้ยครับ" ใช่ครับผม

"มองภาพ ว่า มีถังกลางserver ที่มีprogram หรือcode อยู่ ทุกคนเห็นA B C เมื่อA ดึงมาแก้ไขไฟล์ x แล้วcommit สิ่งที่แก้ก็จะอยู่ใน local ของA คนอื่นไม่เห็น จนกว่าA จะ push ขึ้นถังกลาง(server) มันจะกลายเป็นversion 2 ?" มันจะกลายเป็น version 2 ของถังกลาง ใช่ครับ

กลับมาเรื่องที่เราต้องอ่านต่อ ก็คือเรื่องของ states ของ git


มีใครจะอธิบายก่อนไหม?

"ตามที่ผมเข้าใจนะครับ เราจะ Checkout code มาจาก Git directory (Repository)
ลงมาที่ working directory ซึ่งก็คือเครื่องของเรา 
พอเราแก้ไขอะไรเสร็จ ก็จะไปอยู่ในส่วน Staging Area 
เรื่อง Stage ที่เข้าใจคือเวลาเราแก้ไขปุบ เซฟข้อมูลเสร็จ ก็เหมือนเป็นการมาร์กไว้ว่ามีการเปลี่ยนแปลง
รอการ Commit กลับไปที่ Git directory (Repository)" โอเคร ดีมากครับ

git นั้นมี 3 states กล่าวคือไฟล์ใดๆที่ git จะไปเกี่ยวข้องด้วยเนี่ย จะมี 3 states กับอีก 3 สถานที่
3 states ที่ว่าได้แก่
- committed
- modified
- staged

ตำรากล่าวว่า committed คือสถานะที่ว่าไฟล์ได้บรรจุจัดเก็บบันทึกอย่างดีแล้ว (ทั้งตัวต้นฉบับและตัว snapshot ทั้งหลาย) ไว้ในสถานที่ที่เรียกว่า git directory

modified คือไฟล์ถูกแก้ไขแค่นั้น สถานที่ที่มันจะถูกแก้ไขได้ก็คือ working directory
และ staged ก็คือสถานะที่ไปเอาไฟล์ในสถานะ modified มาทำเครื่องหมาย เตรียมขึ้นทะเบียนเป็น version ปัจจุบัน (มันรันเวอร์ชันไปเรื่อยๆ) ที่จะถูกนำไปเก็บรักษาไว้ใน git directory หรือก็คือไฟล์ที่จะถูกทำเป็น snapshot นั่นแหละ สถานที่ก็คือ staging area

ตกลงว่าภาพข้างต้นนั้นมีถึงพี่ใบ ???

ตามภาพข้างต้นเลยนะ ถังที่เคยกล่าวไว้มันคือ (local) repository หรือป่าช้า หรือแแหล่งเก็บไฟล์ของ git นั่นแหละครับ ตอบว่ามีแค่ 1 ถังเท่านั้น

ถ้าเกิดเราอ่านไปตามตำราที่เราแชร์กัน เราจะได้ว่า เรายุ้งอยู่กับ repository แค่ถังเดียวเท่านั้น ซึ่งเป็นถังที่เราจะ commit ไฟล์ที่อยู่ในสถานะ staged เข้าไป

โปรดอย่าได้สับสนกับถังซึ่งอยู่ใน internet นะครับ (repository ใน GitHub) ถังใบนี้เราแค่พูดถึงผ่านๆ ตอนนี้ยังไม่ต้องสนใจมากนัก

ผมอยากให้ดูละเอียดอีกนิด เขาใช้คำว่า working tree ซึ่งในตำราไทยไม่ได้แปลละเอียดนัก


working tree ก็คือสถานที่ที่เรียกว่า working directory หรือก็คือพื้นที่ทำงานของเรา ทีนี้เขาคุยต่ออีกว่า


ดันนั้นจึงรับประกันได้ว่า มันจะมีปม (หมายถึงแต่ละจุดที่ถูกทำ snapshot) ไว้ให้เราไต่กลับไปกลับมาได้ตลอด

จริงๆแล้วตัว staging area ก็คือไฟล์แค่ไฟล์เดียว ที่เก็บอยู่ใน git directory มันบรรจุข้อมูลสำคัญที่ทำให้เราทราบว่ากำลังต้องการจะ commit อะไรลงถัง ราวกับเป็น index ของประดาไฟล์ต่างๆนั่นแหละ

***หมายเหตุ ถ้าเราต้องการทำงานกับไฟล์หรือกับ project ที่ได้ copy ออกมาจากถัง เราเรียกว่าการ checkout ซึ่งก็คือการทำงานกับ 1 version อันนี้เป็นเรื่องของ git clone จะยังไม่ขอกล่าวถึงนะ

โอเค พอก่อนจ้า

ไม่มีความคิดเห็น:

แสดงความคิดเห็น