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

Basic Git part 6

Git Ignore

ก่อนจะขึ้นเรื่อง git ignore ขอทบทวนและเล่าถึงรายละเอียดของ part ก่อนหน้าทั้งหมดที่ผ่านมาก่อนเน๊อะ

คิดว่าหลายคนคงได้ทดสอบ git แบบง่ายๆนี้ด้วยตัวเองทั้งหมดแล้ว ยินดีและดีใจกับพวกเราด้วย ที่ได้ร่วมปูพื้นฐานนี้ไปพร้อมกันนะครับ ส่วนไหนที่ผิดพลาดอย่างไร ก็ชี้แนะมาได้ตลอดเวลาเน้อ

สำหรับหัวข้อ git basic ณ
https://git-scm.com/book/id/v2/Git-Basics-Recording-Changes-to-the-Repository
นั้นประกอบด้วย
1. checking the status of your files
2. tracking new files
3. staging modified files
4. short status
5. ignoring files
6. viewing your staged and unstaged changes
7. committing your changes
8. skipping the staging area
9. removing files
10. moving files

checking the status of your file
ก็คือคำสั่ง

git status

เมื่อเราใช้คำสั่งนี้หลังจาก clone หรือว่า commit ไฟล์ทั้งหมดลงถัง repository เป็นที่เรียบร้อยแล้ว เราอาจพบกับ message แบบนี้


หมายความว่า working directory ของเรานั้น clean แล้วเรียบร้อย กล่าวคือ ไม่มีไฟล์ใดๆที่เราจะติดตาม track อีกแล้ว (ไม่มีการแก้ไขไฟล์เกิดขึ้น)

โดยสำหรับไฟล์ใดๆที่เราเพิกเฉยไม่ต้องการให้ git สนใจมัน git ก็จะมองพวกนั้นเป็น untracked ไฟล์นะครับ

ทดลองสร้างไฟล์ขึ้นมาใหม่ชื่อ profile.html



เห็นไหมอย่างนี้คือ profile.html อยู่ในสถานะ untracked ไฟล์นะครับ

เพื่อนๆอาจยังไม่ชินกับคำว่า tracked กับ untracked กล่าวคือ ไฟล์ใหม่ใดๆที่เกิดขึ้นโดยตั้งใจหรือไม่ได้ตั้งใจก็ตามใน working directory จะมีเพียงสองสถานะเท่านั้นคือ tracked กับ untracked นั่นหมายความว่า untracked คือไฟล์ที่ไม่เคยมี snapshot เป็นของตัวเองหรือกล่าวได้ว่าไม่เคยอยู่ใน staging area มาก่อนเลย ก็สมเหตุผล ดังนั้นเมื่อมีไฟล์ใหม่เกิดขึ้น เราต้องตัดสินใจว่าจะสร้าง snapshot ให้กับมันหรือเปล่า แน่นอนว่าหากเราต้องการให้ git มาดูแลมัน เราก็ต้องทำ ด้วยการ tracked มันด้วยคำสั่ง git add ในที่นี้ก็

git add profile.html

จากสถานะ untracked จะวิ่งสู่สถานะ staged ดังภาพด้านล่าง



ยังผลให้ไฟล์ใดๆที่ถูก tracked ไปแล้วจะมี snapshot เป็นของตัวเอง และสามารถเป็นไปได้ในอีก 3 สถานะต่อไปนี้ในอนาคต คือ unmodified, modified หรือ staged

ซึ่งไฟล์ที่ถูกทำ snapshot ก็จะไปอยู่ในสถานะ staged ณ สถานที่ staging area รอคอยให้เรา commit แก่ git

ทีนี้มาดูในแง่ที่เราไป clone ถังอื่นมาเป็นถังเราก่อน ไฟล์จากถังอื่นนั้นจะกลายเป็นไฟล์ในถังเรา กล่าวคือทำสำเนาทั้งถังมาเลย ในกรณีนี้ทุกไฟล์ในถังจะอยู่ในสถานะ unmodified (เพราะผ่านการ tracked มาแล้ว) เมื่อเราไปแก้ไขมันก็จะกลายเป็น modified และเมื่อเราใช้ git add ก็จะกลับเข้าไปใน staging area อยู่ในสถานะ staged อีกครา ดูภาพประกอบด้านล่าง



เอาล่ะผมขอข้ามไปพูดหัวข้อที่ 5. (ignoring files) เลยนะครับ เพราะว่า 2, 3 นั้นผมพูดไปมากแล้ว ส่วน 4 เป็นเรื่องสถานะอย่างย่อ ส่วนตัวคิดว่าสถานะอย่างเต็มรูปแบบนั้นอธิบายได้เข้าใจดีอยู่แล้ว ดังนั้นขอข้ามไปก่อน

ignoring files
เขาว่าบางไฟล์เราไม่ต้องการให้ git มาสนใจ ซึ่งไฟล์เหล่านั้นอยู่ในสถานะ untracked  ด้วยเหตุนี้ git มีทางออกให้ ด้วยการให้เราสร้างไฟล์ขึ้นมา และให้ตั้งชื่อตามนี้

.gitignore

มาดูรายละเอียดปลีกย่อยเล็กน้อย


ตัวอย่างนี้ *.[oa] คือ ไฟล์ใดๆก็ตามที่ลงท้ายด้วย
.o หรือ .a
ส่วน *~ คือ ไฟล์ใดๆก็ตามที่ลงท้ายด้วยเครื่องหมาย ~


แรกเลยคือ บรรทัดว่าง หรือบรรทัดที่ขึ้นต้นด้วยเครื่องหมาย # นั้น git จะไม่สนใจว่าต้องไป ignored กล่าวคือใช้เขียน comment

ใช้มาตราฐาน glob patterms ในการบอก ignore

เริ่มต้น patterns ด้วย forward slash ได้ (/) เพื่อหลีกเลี่ยง recursivity

ลงท้าย patterns ด้วย forward slash ได้ (/) เพื่อกำหนดเป็น directory

ใช้เครื่องหมาย ! เพื่อใช้ยกเว้นบางกรณีที่ได้ ignore ไฟล์ในกลุ่มใดๆ

ขี้เกียจแปลแล้ว มันชัดเจนในความหมายทุกประการ ดังนั้นดูเลย


มาๆ ตัวอย่างต่อไปนี้ผมอยากจะเผิกเฉยไฟล์ home.html

สมมติผมมีไฟล์เพิ่ม ชื่อ home.html


แต่ผมไม่ต้องการให้ git มาสนใจมัน คือผมไม่ต้องการ track มันน่ะ ผมก็สร้าง .gitignore ไฟล์ขึ้นมา

พิมพ์

echo > .gitignore


บอกมันว่าไม่เอา home.html นะ


จากนั้นพิมพ์ git status


เห็นไหม git ไม่ในใจ home.html แล้ว (แต่ไปสนใจ .gitignore แทนเอิ๊กๆ) ส่วน profile.html สีเขียวนั่นคือเรายังไม่ได้ commit ต่อจากขั้นตอนก่อนหน้านี้

ผมขอทิ้งคำถามไว้ตรงนี้ให้เพื่อนๆคิดเล่นๆว่า เราควรจะ track เจ้า .gitignore ให้ git รู้จักหรือไม่ครับ เพื่อที่มันจะได้หายไป (?) จากสายตาของเรา ควรหรือไม่ควรครับ?

***เพิ่มเติม คิดแบบหลักการและเหตุผลขั้นพื้นฐาน
จริงๆเรื่องการ ignore นี้มีให้ปวดสมองพอสมควร แต่ในเมื่อเราเริ่มต้น ก็ขอให้เราคิดแบบเด็กฝึกหัด เรายังไม่โปร ดังนั้นคำตอบของคำถามที่ว่า git มองเห็น .gitignore นั้นไม่แปลก เพราะ git สามารถทำงานได้กับไฟล์ทุกประเภทอยู่แล้ว (เคยกล่าวไปแล้วตั้งแต่เริ่มต้น) คำตอบแสนง่ายก็คือว่า .gitignore นี้เราประสงค์ให้ git ไม่ไปสนใจไฟล์ใดๆก็ตามที่เราต้องการ ไม่ให้เอาไปเก็บไว้ใน git repository หรือก็คือไม่ต้องสร้าง index ให้ หรือก็คือไม่ต้องการ snapshot ไฟล์เหล่านี้

ดังนั้น project เราควรสะอาดที่สุด ก็ไม่จำเป็นต้องเพิ่ม .gitignore นี้เข้าไปในสารบบของ git ครับ เพราะแต่ละครั้งที่ตั้งใจจะ ignore ไฟล์อะไรก็ตาม มักจะมีเหตุผลส่วนตัวอยู่ไม่มากก็น้อย ไหนจะเรื่องของ environment อีกที่ต่างกัน ดังนั้นปล่อยมันให้เป็น untracked นั่นแหละ

ตัวอย่างเช่นผมต้องการ ignore ไฟล์ชื่อ home.html ถามว่าไฟล์นี้สำหรับผมแล้วสำคัญกับ project ไหม คำตอบก็คือ ไม่เลย เพราะถ้าสำคัญคงจะ track มันไปแล้ว ถูกไหม

และในทางเดียวกันถ้าผม track เจ้า .gitignore นี้เข้าไปใน git โดยมีคำประกาศว่าไม่เอา home.html ติดไปด้วย แล้วเพื่อนๆเครื่องอื่นไปดูด git ของผมมาทำงานต่อ เจ้า .gitignore นี้ก็ติดมาด้วย แถมบอกด้วยว่าไม่เอา home.html (ถ้ามันทำงานนะ) อย่างนี้จะดีหรือ?

อะหะ ยกเว้นเสียแต่ว่า git repository นี้เป็นของที่ทีมคุยกันแล้วว่าจะทำอะไร มีไฟล์อะไรบ้าง ดังนั้น track เจ้า .gitignore นี้ไปด้วยเลย เครื่องอื่นๆใน environment เดียวกันจะได้ใช้ไฟล์นี้ร่วมกันไงล่ะ ก็ว่าไปตามท้องน้ำนะ

ลองถาม google เกี่ยวกับเรื่องนี้โดยพิมพ์

.gitignore showing in git status

แล้วดูว่าชาวบ้านเขาติดปัญหาเช่นเดียวกับข้อสงสัยของเราหรือไม่

เรื่องหน้าคือ git branching ครับ สวัสดีจ้า

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

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