Git เป็นหนึ่งใน Version Control ที่ได้รับความนิยมอย่างมากในปัจจุบัน สำหรับการทำ Version Control กับงานที่พัฒนาด้วย Visual Studio นั้น ทาง Microsoft ได้เพิ่มความสามารถให้ใช้งานร่วมกับ Git ได้ตั้งแต่ Visual Studio 2013 และได้ออก Plug-in สำหรับ Visual Studio 2012 ด้วย ซึ่งจะสามารถใช้งานได้กับ Visual Studio 2012 Update 3 ขึ้นไป
ส่วนการใช้งานกับ Visual Studio เวอร์ชั่นเก่ากว่านี้ สามารถใช้งานร่วมกับ Git Extensions ซึ่งรองรับ Visual Studio ตั้งแต่ 2005 ขึ้นไป และ Git Source Control Provider ซึ่งรองรับ Visual Studio ตั้งแต่ 2008 ขึ้นไป
สำหรับบทความตอนนี้ ขอแนะนำการใช้งาน Git ร่วมกับ Visual Studio เฉพาะการใช้งานกับ Visual Studio 2013 เท่านั้น โดยจะใช้ Visual Studio 2013 Update 4 นะครับ
แต่คิดว่าสำหรับ Visual Studio 2012 Update 3 ขึ้นไป ที่ลง Plug-in ก็สามารถทำงานได้เช่นเดียวกัน
ใครที่ใช้ Version เก่า อย่าเพิ่งน้อยใจ รอติดตามตอนต่อไปนะ
List of contents
Setting
สำหรับการตั้งค่าให้ Git บน Visual Studio 2013 ให้เป็น Source Control (Version Control นั่นแหล่ะ) นั้น ให้ไปที่เมนู TOOLS (1) > Options… (2)

ก็จะพบกับ Options dialog ให้เลือกไปที่เมนู Source Control > Plug-in Selection (1) แล้วเลือก Current source control plug-in เป็น Microsoft Git Provider (2) แล้วตอบ OK ไป

สำหรับการใช้งาน Git นั้น จะอยู่ในหน้าต่างที่ชื่อว่า Team Explorer (3) โดยสามารถเปิดมันขึ้นมาได้จากเมนู VIEW (1) > Team Explorer (2)

บนหน้าต่าง Team Explorer นั้น แถบบนสุดจะเป็น Toolbar menu มี Back, Next, Home, Connect to Team Projects, Refresh และ Search bar ตามลำดับ
หากคลิกที่ Connect to Team Projects จะกลับมายังหน้าดังรูปด้านล่าง
ส่วนตรงหมายเลข (1) เลือกคลิก จะมีเมนูขึ้นมาให้เลือก ซึ่งเป็นเมนูเดียวกับเมื่อเรากดปุ่ม Home (จะพูดถึงทีหลัง)
ส่วนหมายเลข (2) หากคลิกเข้าไป จะเป็นการเลือก Team Project จาก Team Foundation Server (เป็นหนึ่งใน Source Control ของ Microsoft) สำหรับใช้งานกับ Git ตรงนี้ไม่ได้ใช้งาน
สำหรับหมายเลข (3) คือส่วนที่แสดง Local Git Repositories ต่าง ๆ ที่เคยเปิดบน Visual Studio แล้ว (จากรูปจะยังไม่มีแสดงอยู่) และมีเมนูย่อย ๆ คือ New, Add, Clone ให้เราจัดการ Repo ได้จากตรงนี้เลย

เมื่อเรากดปุ่มเมนู Home (รูปบ้าน) จะมีตัวเลือกสำหรับ Git ด้วยกัน 4 เมนู คือ Changes, Branches, Unsynced Commits และ Settings

ในเมนู Settings จะมีเมนู Git Settings ให้เลือกอีกที

สำหรับ Git Settings หลัก ๆ จะใช้กำหนด User Name และ Email ของเรา ซึ่งจะถูกใช้ตอนเรา Commit นั่นเอง ซึ่งการกำหนดตรงนี้ จะเป็นการกำหนดที่ Global Config ของ Git นะครับ

ถ้าหากเครื่องที่ใช้งาน เคยใช้ Git มาก่อนแล้ว มี Git Config เดิมอยู่แล้ว ก็จะเป็น Config เดียวกันนั่นเอง
Git for new project
สำหรับการสร้าง Project ใหม่บน Visual Studio แล้วจะทำ Version Control ด้วย ตอน New Project ให้ติ๊กถูกตรง Add to source control ดังรูป

เมื่อ Visual Studio สร้าง Project ให้เสร็จ จะมี Choose Source Control Dialog ขึ้นมาให้เลือก ก็เลือกไปที่ Git (1) แล้วตอบ OK (2)

สังเกตุที่หน้าต่าง Output จะเห็นว่ามีการสร้าง Git Repository ให้ พร้อมเปิดมันขึ้นมา…

ในหน้าต่าง Team Explorer ส่วนของ Local Git จะแสดงรายการ Repository ที่เพิ่งสร้างขึ้นมาให้

เมื่อดับเบิ้ลคลิกไปที่ Repo จะแสดงรายการ Solution ที่อยู่ใน Repo ซึ่งเราสามารถดับเบิ้ลคลิกที่ Solution เพื่อเปิดมันขึ้นมาได้เลย

Git for exist project
สำหรับ Visual Studio Project เดิม ที่เคยสร้างไว้อยู่ก่อนแล้ว สามารถนำเข้า Git ได้โดยคลิกขวาที่ชื่อ Solution (1) ใน Solution Explorer แล้วเลือก Add Solution to Source Control… (2)

ก็จะพบกับ Choose Source Control Dialog ขึ้นมาให้เลือก เหมือนกับตอนสร้าง Project เลย… ก็เลือกไปที่ Git (1) แล้วตอบ OK (2)

เป็นอันเรียบร้อย… เหมือนกับหัวข้อที่แล้วแล้วล่ะ (ขี้เกียจอธิบายซ้ำ )
Changes
บน Solution Explorer จะแสดงสถานะของไฟล์ด้วย จากรูปด้านล่าง คือสถานะเพิ่มไฟล์ใหม่, ไฟล์ที่ Commit แล้ว และไฟล์ที่ถูกแก้ไขหลัง Commit ตามลำดับ



เมื่อเข้าไปที่เมนู Changes บนหน้าต่าง Team Explorer จะแสดงผลดังรูปด้านล่าง
ในจุดที่ (1) เราสามารถเปลี่ยน Branch ได้จากการคลิกที่ชื่อ Branch ถัดลงมาคือช่อง Commit message ส่วนปุ่ม Commit จะมีตัวเลือกได้อีกจากลูกศรลงด้านข้าง ว่าจะ Commit อย่างเดียว, Commit and Push หรือจะ Commit and Sync
จุดที่ (2) แสดงรายการไฟล์ที่เกิดการเปลี่ยนแปลงและพร้อมที่จะนำไป Commit (Staged Change นั่นเอง) เมื่อเรามีการแก้ไขไฟล์ใด ๆ จะถูกนำเข้ามาอยู่ในส่วนนี้ทันที ส่วนจุดที่ (3) จะเป็นส่วนที่จะไม่นำไป Commit ในครั้งนี้ (Unstaged Change) และจุดที่ (4) คือไฟล์ที่ไม่ได้เพิ่มเข้าสู่ Git หรือสถานะ Untracked นั่นเอง
เราสามารถคลิกเลือกไฟล์ แล้วลากข้ามไปมา เพื่อเปลี่ยนสถานะก่อนที่จะ Commit ได้เลย สะดวกดี

เมื่อทำการ Commit แล้ว จะแสดงให้เห็นดังรูปด้านล่าง

เราสามารถดูประวัติการ Commit ได้ โดยคลิกที่ Actions (1) ข้าง ๆ ปุ่ม Commit แล้วเลือก View History… (2)

ก็จะแสดงประวัติการ Commit ดังรูปด้านล่าง สามารถนำ Cursor ไปชี้เพื่อดูรายละเอียดของ Commit ในแต่ละจุดได้

หากดับเบิ้ลคลิกที่ Commit ใด ๆ บน History จะแสดงรายละเอียดบนหน้าต่าง Team Explorer

และไฟล์ที่มีการแก้ไข เราสามารถคลิกขวาที่ไฟล์ บน Solution Explorer หรือ Team Explorer ก็ได้ จะมีเมนู Compare with Unmodified… ให้เลือก

ก็จะแสดงหน้าต่าง Diff เปรียบเทียบไฟล์ที่เลือก โดยฝั่งซ้ายจะเป็นส่วนของ HEAD หรือจากใน Repo ที่เรา Commit ไปแล้ว ส่วนฝั่งขวาจะเป็นไฟล์ปัจจุบันที่มีการแก้ไข และด้านขวา จะมีรางแสดงส่วนของ Code ที่แสดงผลอยู่ พร้อมทั้งสีเพื่อบอกสถานะส่วนที่แก้ไข

Branches
สำหรับเมนู Branches บนหน้าต่าง Team Explorer นั้น จะมีเครื่องมือให้เราจัดการ Branch โดยในจุดที่ (1) จะแสดง Branch ปัจจุบัน สามารถสร้าง Branch ใหม่ด้วยเมนู New Branch และสามารถ Merge Branch ได้จากที่นี่
ส่วนในจุดที่ (2) Published Branches หรือ Branch ที่อยู่บน Remote Repository แล้ว และจุดที่ (3) Unpublished Branches ก็คือ Branch ที่ยังไม่ได้ Push ขึ้น Remote Repository หรือ Local Repository นั่นเอง

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

เมื่อ Merge เรียบร้อย และไม่มี Conflict ใด ๆ จะแสดงดังรูปด้านล่าง พร้อมทั้งเปลี่ยน Branch ปัจจุบัน ไปยัง Branch ปลายทางให้เลย

แต่ถ้าหากมี Conflict เกิดขึ้น จะมี Link ที่เขียนว่า Resolve the conflicts ให้คลิก


ใน Resolve Conflicts จะมีรายชื่อไฟล์ที่เกิด Conflicts แสดงอยู่ พร้อมสาเหตุ เมื่อคลิกที่ไฟล์ จะมีตัวเลือกให้เราจัดการกับ Conflict ที่เกิดขึ้นได้


หากคลิกไปที่ Compare Files จะแสดงหน้าต่าง Diff
จากรูปด้านล่าง ฝั่งซ้ายแสดง Code จาก Branch dev ส่วนฝั่งขวาแสดง Code จาก Branch master

หากคลิกไปที่ปุ่ม Merge จะแสดงหน้าต่าง Merge ขึ้นมา…


จากรูปด้านบน ในหน้าต่าง Merge จะแสดง Code จากทั้ง 2 Branch ในฝั่งซ้ายและขวา เราสามารถติ๊กถูกที่ด้านหน้าจุดที่เกิด Conflict โดยสามารถเลือกได้ว่าจะเอา Code จากฝั่งไหน หรือทั้งสองฝั่ง หรือไม่เอาเลยก็ได้ ส่วนด้านล่างจะเป็นการจำลองผลการ Merge
เมื่อเลือกได้แล้ว คลิกที่ปุ่ม Accept Merge ด้านบน ชื่อไฟล์ที่อยู่ในส่วนของ Conflicts ก็จะถูกย้ายอยู่ในส่วนของ Resolved แล้ว และเมื่อแก้ Conflict เรียบร้อยแล้ว จะมีปุ่ม Commit Merge ให้คลิก

ก็จะพาไปยังส่วนของ Change ให้เราใส่ Commit Message แล้วทำการ Commit ต่อไป

ด้านล่างเป็นหน้าต่าง History แสดงผลหลังจากทำการ Merge เรียบร้อยแล้ว

Unsynced Commits
เมนู Unsynced Commits ใช้สำหรับนำ Local Repository ของเรา ขึ้นไปเก็บไว้ที่ Remote Repository (Git Server) สำหรับตัวอย่างนี้ ผมเลือกใช้บริการของ GitHub.com ซึ่งให้บริการฟรี สำหรับ Public Repository
สำหรับการใช้งาน ให้ทำการสร้าง Repository เปล่า ๆ ไว้ที่ Remote Repository (ห้ามมี Commit ใด ๆ) แล้วนำ URL มาใส่ แล้วกดปุ่ม Publish ดังรูปด้านล่าง

ทำการยืนยันความเป็นเจ้าของ Remote Repository ด้วยการ Login ให้เรียบร้อย

เมื่อกำหนด Remote Repository เรียบร้อยแล้ว จะมีข้อความแจ้งดังรูปด้านล่าง โดย Branch ที่เราเลือกอยู่ในปัจจุบัน จะถูก Push ขึ้นไปที่ Server แล้ว และหน้า Unsynced Commits จะมีหน้าตาเปลี่ยนไป
โดยในส่วนที่ (1) จะใช้ทำการ Sync, Push, Pull ได้จากตรงนี้
จุดที่ (2) ส่วนของ Incoming Commits จะแสดงรายการ Commit ที่แตกต่างจาก Local Repository ของเรา โดยอัพเดตได้จากการ Fetch ส่วนจุดที่ (3) คือ Outgoing Commits จะแสดงรายการ Commit ที่เรายังไม่ได้ Push ขึ้น Server

สำหรับ Branch อื่น ๆ หากต้องการ Publish ขึ้น Server สามารถไปที่เมนู Branches ของหน้าต่าง Team Explorer แล้วคลิกขวา ที่ Branch ที่อยู่ในโซน Unpublished Branches แล้วเลือก Publish Branch ส่วนกรณี Branch ที่ Publish แล้ว สามารถเปลี่ยนเป็น Unpublish ได้เช่นกัน

รูปด้านล่าง เมื่อทำการ Publish Branch เรียบร้อย จะมีข้อความแจ้งให้ทราบ

สามารถเข้าไปดู Repository ที่ผม Push ไว้ได้ ที่ https://github.com/first087/VS2013-Test-Solution
สรุปนิดนึง… สำหรับ Git บน Visual Studio 2013 นั้น ยังมีฟีเจอร์ให้ใช้งานไม่ค่อยครบถ้วนนัก อย่างเช่นการติด Tag ยังไม่สามารถทำได้ การ Reset Branch ไปที่ Commit ต่าง ๆ ก็ยังทำไม่ได้ คาดว่าฟีเจอร์เหล่านี้ คงทะยอยอัพเดตเพิ่มเติมขึ้นมาใน Visual Studio 2013 Update ถัด ๆ ไป หรือ Version 2015 ไปเลย
สำหรับบทความแนะนำการทำ Version Control ด้วย Git บน Visual Studio 2013 ในตอนนี้ ก็ขอจบเพียงเท่านี้ สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ Use Visual Studio with Git
สำหรับบทความตอนต่อไป… จะแนะนำการใช้งานกับ Visual Studio ใน Version เก่า ๆ นะคร๊าบบบบบบ รอหน่อยนะ…