เริ่มต้นทำงานกับ Git Command ตอนที่ 2

หลังจากที่เราทำความรู้จักกับ Git Command สำหรับการเริ่มต้น Project ใน ตอนที่  1 กันมาแล้ว ในตอนนี้เราจะทำการจัดการเรื่องของ staging หรือ การเปลี่ยนแปลงของ Source Code ซึ่งถือว่าเป็นส่วนที่ใช้งานกันบ่อยที่สุดในการทำงาน เพราะทุดวันเราต้องทำการ push หรือ pull code กันทุกวันอยู่แล้ว

ตอนนี้หลังจากที่เราได้ source code ที่ถูกเก็บอยู่ใน git repository แล้ว เมื่อมีการเปลี่ยนแปลง source code แล้ว สถานะของ file จะเป็น modified(ดูได้จากคำสั่ง git status) เราจะต้องทำการ commit เข้าไปใน repository ในเครื่องของเราก่อน โดยใช้คำสั่ง

ในคำสั่ง commit จะต้องทำการใส่ parameter “-m” เข้าไปด้วย เพื่อให้เวลากลับมาค้นหา revision หรือการเปลี่ยนแปลงต่างๆ จะได้แยกออกว่า สิ่งที่เรา commit เข้าไปเป็นการแก้ไขปัญหา หรือ เพิ่ม code ส่วนไหนเข้าไป

สิ่งที่สำคัญอีกอย่างก็คือเราจะทำการ commit ได้เราต้องทำการ add file เข้าไปใน repository ก่อนด้วยคำสั่ง git add เสมอ

หลังจากที่เราทำการ commit แล้วการเปลี่ยนแปลงของ source code จะเป็นแค่การเปลี่ยนแปลงของ repository ในเครื่องของเรา เท่านั้น ถ้าเราต้องการเอา code ขึ้นไป update บน server จะต้องใช้คำสั่ง

แต่ในกรณีที่เราต้องกาารที่จะถอยหลังกลับไปยัง version ที่อยู่ใน local repository เราจะใช้คำสั่ง

ในส่วนของชื่อไฟล์ เราจะต้องระวังเรื่องของตัวอักษรตัวใหญ่หรือตัวเล็กด้วย

และถ้าเราต้องการจะเอา Code ล่าสุดบน Server ลงมา update ในเครื่องของเราจะใช้คำสั่ง

ในกรณีที่ทำงานหลายคนอาจเกิด Confilct แล้วต้องการบังคับให้ update source code บน Server เป็น source code ของเราให้ใช้คำสั่ง

แต่ถ้าจะใช้ version ที่อยู่บน Server เป็น version ล่าสุด ให้ pull ลงมาแล้วก็ push ขึ้นไปใหม่

เริ่มต้นทำงานกับ Git Command ตอนที่ 1

สิ่งที่จำเป็นในการทำงานกับ Git ไม่ว่าจะเป็นการทำงานแบบ Command Line ด้วย Git bash หรือผ่านทาง GUI อย่าง Source Tree เราจำเป็นต้องเข้าใจการทำงานของ Git ก่อน ซึ่งในบทความนี้เราจะสอนใช้ command เพื่อให้เข้าใจกระบวนการทำงานทีละขั้นตอน เพื่อให้เราสามารถแก้ไขปัญหาได้ดีขึ้น

การทำงานกับ git เริ่มต้นได้จาก 2 กรณีด้วยกันคือ

  1. เริ่มต้นเขียน Code ใหม่ตั้งแต่ต้น (ยังไม่เคยอยู่ใน Repository ไหนมาก่อนเลย)
  2. เริ่มต้นจาก Code ที่มีอยู่แล้วใน Repository อาจมาจาก Github, Bitbucket หรือ git server ในองค์กร

การทำงานกับ git แบบเริ่มต้นเขียน Code ใหม่ตั้งแต่ตั้น

เริ่มต้นหลังจากที่เรามี source code เราจะเริ่มต้นทำงานด้วยคำสั่งแรกคือ

คำสั่งนี้จะเป็นการสร้าง folder ที่ชื่อว่า .git ให้เรา ซึ่งเราจะไม่มองไม่เห็น folder นี้เนื่องจากเป็น hidden folder

เนื่องจากการทำงานของ git เป็น distributed version control เลยทำให้มี 2 repository คือ local(อยู่ในเครื่องตัวเอง) และ remote(เครื่องที่เป็น server) เราต้องทำการระบุ remote repository เพื่อให้ git รู้ว่าเราจะเอา source code ไปเก็บไว้ที่ไหน(ถ้าทำงานคนเดียวก็ไม่ต้อง) โดยใช้คำสั่ง

หลังจากนี้ถ้าใช้่คำว่า origin ในคำสั่งของ git จะหมายถึง url ของ git repository

การทำงานกับ git แบบเริ่มต้นจาก Code ที่อยู่ใน repositoryอยู่แล้ว

การทำงานในลักษณะนี้จะต้องทำการดึง Code ที่อยู่บน Git Server มาไว้ในเครื่องของเรา ซึ่ง Git Server นั้นจะเป็นการใช้บริการแบบฟรีๆ จาก Github หรือ Bitbucket หรืออาจเป็นการติดตั้ง git server บนเครื่อง Server ใน network ของเราเองก็ได้

การทำงานจะเริ่มต้นจากการระบุว่า Git Repository ของเราอยู่ที่ไหน โดยใช้คำสั่ง

เมื่อทำการ clone ลงมาจาก server แล้วเราก็สามารถทำงานกับไฟล์ใน folder นี้ได้เหมือนกับที่เราสร้าง Code ขึ้นมาใหม่ตั้งแต่ต้น

หลังจากเราทำการ เริ่มต้นสร้าง folder .git ขึ้นมาแล้วไม่ว่าจะเป็นการใช้ git init หรือ git clone ก็ตามเราต้องทำการ add file ต่างๆ เข้าไปใน repository โดยใช้คำสั่ง

โดยถ้าเป็นครั้งแรกเราสามารถใช้เครื่องหมาย “.” ในการบอก git ให้ add ไฟล์ทั้งหมดใน folder นั้นเข้าไปใน repository

หลังจากนั้นให้ทำการตรวจสอบว่าไฟล์ของเราได้เข้าไปอยู่ใน repository แล้วรึยัง ให้ใช้คำสั่ง

เราจะเห็นได้ว่าไฟล์ไหน commited แล้วถ้ายังมีไฟล์ไหนอยู่ในส่วนของ untracking file แสดงว่าไฟล์นั้นยังไม่ถูก add เข้าไปใน repository

การใช้งาน Git เบื้องต้น ตอนที่ 1

Git logo

อันดับแรกต้องนิยามความหมายของ keywords ต่างๆ ดังนี้

  • Version Control
    คำนี้เป็นคำที่คงคุ้นหูกันมานานแล้ว หมายถึงการจัดการ Version ของเอกสารหรือ Source Code ซึ่ง Tools ที่มาจัดการเรื่องของ Version Control ที่เป็นที่นิยมมากที่สุดก็คือ SVN และ Git(ออกเสียงด้วย ก.ไก่ – กิ๊ต) ก็เป็นหนึ่่งในนั้น
  • Distributed Version Control 
    คำนี้เป็นคำนิยามของ Git ซึ่งเป็น Version Control ที่ถูก Distributed ออกไปยังเครื่อง Client ดังนั้นสิ่งที่ Git แตกต่างไปจาก SVN ข้อแรกก็คือเราจะสามารถจัดการ Version ในเครื่อง local ของเราเองได้ เราจะสามารถทำการ Track Change หรือการเปลี่ยนแปลง Version ในเครื่องของเราเอง โดยที่ไม่ต้องเกี่ยวข้องกับ Server ซึ่งจะทำให้เราสามารถบริหารจัดการ Source Code ของเราจนกว่าจะแน่ใจว่าใช้งานได้แน่นอนแล้ว ถึงจะ push (หรือการ Commit ใน SVN) ขึ้นไปบน Server
  • Configuration Management
    คำนี้อาจไม่ค่อยคุ้นหูซักเท่าไหร่ แต่ถ้าใครที่ศึกษาเรื่องของ Software Process ไม่ว่าจะเป็น ISO หรือ CMMI คงจะคุ้นหูกันดีแต่อาจมีบางคนยังสับสนว่า Configuration Management หมายถึงการทำ Version control ซึ่งไม่ถูกต้องเนื่องจาก Configuration Management เราจะหมายความถึง Process หรือกระบวนการมากกว่าวิธีการแต่ถ้าพูดถึงการจัดการเรื่องของ Version Control จะหมายถึง Tool มากกว่า ดังนั้น Version Control จะเป็นส่วนหนึ่งของ Configuration Management

SVN vs Git from Google Trends
SVN and Git situation
จากรูปเราจะเห็นว่า ยังไงในอนาคตข้างหน้าก็ต้องเป็น Git แน่นอน
ทีนี้เรามาดูความแตกต่างระหว่าง Git กับ SVN กัน

  1. Git เป็น Distributed Version Control อย่างที่พูดไปแล้วเลยทำให้สามารถจัดการ Version ในเครื่อง local ได้ด้วยแต่ SVN สามารถจัดการได้เฉพาะ Version บน Server เท่านั้น
  2. Git จะไม่มี Revision number เหมือนกับ SVN เพราะเนื่องจาก Git เป็น Distributed ดังนั้น Version ในเครื่องแต่ละเครื่องจะต่างกันเลยไม่สามารถนำมาอ้างอิงได้ เลยใช้ Hashed String มา Reference แทน
  3. Content  ใน Git จะมีการตรวจสอบความถูกต้องโดยทำการ Hash ตัว Content ด้วย SHA-1 Algorithm จะได้เลขฐาน 16 มา 40 ตัว ดังนั้นถ้า Data มีการสูญหายหรือเกิดการเปลี่ยนแปลงโดยที่ไม่ได้ทำการ Commit เราจะรู้ได้ทันที
  4. Git จะทำการเก็บการเปลี่ยนแปลงที่เกิดขึ้นในรูปของ Change Set ซึ่งแต่ละการเปลี่ยนแปลงที่เกิดขึ้นใน files ต่างๆ (อาจมากกว่า 1 file) เมื่อทำการแตก Branch ออก หรือต้องการ Commit จะสามารถลดส่วนของ Code ที่ไม่สามารถ merge ได้
  5. Git จะทำการเก็บ Content ไว้ใน .get Folder ด้วยซึ่งแตกต่างจาก SVN และ Tools ตัวอื่นๆ ที่จะเก็บเฉพาะ Meta-data ซึ่งอาจเป็นเหตุผลที่ทำให้ Git ทำงานได้เร็วกว่า Version Control ตัวอื่นๆ ซึ่งบาง project อาจเร็วกว่าถึง 100 เท่า (อันนี้เค้าโฆษณาไว้ ไม่รู้จริงรึเปล่า)

References:

http://boxysystems.com/index.php/5-fundamental-differences-between-git-svn/

http://armno.in.th/2012/02/26