รวมคำสั่ง Git ที่มักใช้งานบ่อย

18-ม.ค.-19

คัมภีร์เทพ IT

หากคุณพอมีพื้นฐานของ Git Workflow และคุ้นเคยกับคำสั่งบางอย่างมาบ้างแล้ว เช่น add, commit, push, pull เชื่อว่าบทความนี้น่าจะเป็นประโยชน์กับคุณอย่างยิ่ง เพราะบทความนี้ได้ รวมคำสั่ง Git ที่มักใช้งานบ่อย มาให้คุณได้นำไปใช้งานได้ดีขึ้นและเพื่อแก้ไขข้อผิดพลาดบางอย่าง อีกทั้งยังจะช่วยให้คุณเชี่ยวชาญการใช้งาน Git มากขึ้นด้วย

# Scenario with add

หากคุณแค่ต้องการ add file เฉพาะนามสกุลที่ต้องการใน staging area ของคุณ แน่นอนว่าคุณสามารถ file ทั้งหมดได้ทีละ file แต่คุณสามารถใช้ *.<extension_name> เพื่อเรียก file ที่มีนามสกุลตามที่ต้องการ โดยในตัวอย่างนี้จะเป็นการ add file ของ Python

หากคุณแค่ต้องการ add file เฉพาะนามสกุลที่ต้องการ และต้องการระบุ directory สามารถใช้คำสั่งในตัวอย่างนี้ได้ ในตัวอย่างด้านล่าง จะเป็นการ add file ของ Python จาก sub directory ของ models/ directory

# Scenario with clean

คุณต้องการสร้าง file หรือ folder ใหม่ภายใน branch แต่ตอนนี้คุณไม่ต้องการ file หรือ folder เหล่านั้นอีกแล้ว คุณจำเป็นต้อง clean Working tree ของคุณ ซึ่งพวกมันเหล่านี้เป็น untracked file ใน Git

*(untracked file คือ file ที่คุณยังไม่ได้ add เข้าไปโดยใช้คำสั่ง git add)

เพื่อให้ Working tree ของคุณ clean คุณสามารถเรียกใช้คำสั่งในข้อนี้ได้ จากตัวอย่าง คำสั่งนี้จะลบ file และ directory ทั้งหมดที่ไม่ได้ถูก tracked โดย git

หากคุณต้องการดู untracked file (ที่คาดว่าจะถูก remove) ก่อนที่มันจะถุก remove คุณสามารถเรียกใช้คำสั่งนี้ได้

# Scenario with rm

ตอนนี้คุณต้องการ delete ตัว tracked file ของคุณ สามารถใช้คำสั่งต่อไปนี้

หาก file ของคุณอยู่ใน staging area คุณต้องเพิ่ม force flag เข้าไปด้วย

คุณต้องการ delete file ออกจากเฉพาะ git repository แต่ไม่ต้องการ delete จาก file system ของคุณ สามารถใช้คำสั่งนี้ได้

# Scenario with branch

หากคุณพิมพ์ ชื่อ branch ผิดพลาด หรือต้องการเปลี่ยน ชื่อ branch คุณสามารถใช้คำสั่งนี้เพื่อเปลี่ยน ชื่อ branch

หากคุณต้องการเปลี่ยน ชื่อ branch ตัวปัจจุบันของคุณ สามารถใช้คำสั่งนี้

แต่หากคุณได้ push branch เข้าไปโดยใช้ชื่อเก่าไปแล้ว คุณจะมีขั้นตอนเพิ่มเติมที่ต้องทำอีกเล็กน้อย โดยคุณต้อง delete branch เก่าออกจาก remote ก่อน แล้วค่อย push branch ใหม่เข้าไปแทน

คุณต้องการ push ตัว local branch code ของคุณ แต่ชื่อของ local branch มันไม่ตรงกันกับชื่อของ remote repository branch คุณสามารถแก้ไขด้วยการใช้คำสั่งนี้

# Scenario with log

หากคุณต้องการดู commit history สามารถใช้คำสั่ง git log ได้ ซึ่งจากคำสั่งนี้มันจะแสดงข้อมูลออกมาจำนวนมาก แต่หากคุณต้องการดูเพียงแค่ commit id และ message สามารถใช้คำสั่งต่อไปนี้

คำสั่ง git log –oneline จะแสดงข้อมูลตามลักษณะ ที่เห็นด้านล่างนี้

จากตัวอย่างด้านบน ตัวอักษร 7 ตัวแรก คือ shorthand commit id จากนั้นจะเป็น commit message การที่ commit id มีลักษณะเป็นแบบ shorthand(ชวเลข) ก็เพราะ ตัว commit id แบบเต็มๆ จะเป็น อักขระเลขฐานสิบหกจำนวน 40 ตัว ซึ่งเป็นแบบ 160-bit SHA-1 hash หากสังเกตจากรูปด้านบนตรง Head -> master นั่นหมายความว่า เรากำลังอยู่ที่ master branch

หากคุณต้องการจะดู commit message ของ author ที่ต้องการ สามารถดูคำสั่งจากตัวอย่างนี้ สมมติว่า ชื่อของ author คือ John Doe

# Scenario with stash

หากคุณกำลังอยู่ใน branch หนึ่ง แล้วกำลังทำการเปลี่ยนแปลงบางอย่างอยู่ หากคุณต้องการเห็น output หรือ code ของ branch นั้นโดยการ “ซ่อน” สิ่งที่เปลี่ยนแปลง คุณสามารถใช้คำสั่ง stash และมันจะทำให้ working tree ของคุณ clean ขึ้น

แต่หากคุณต้องการ restore code ที่ซ่อนไว้ล่าสุดให้กลับมาใหม่ สามารถใช้คำสั่งนี้

แต่ถ้าคุณไม่ต้องการดึง code ที่ซ่อนไว้กลับมาอีก คุณสามารถใช้คำสั่งนี้

หากคุณมีการเปลี่ยนแปลง file ผิด branch ไป คุณสามารถซ่อนการเปลี่ยนแปลงนั้น จากนั้นก็ checkout ออกไปยัง branch ที่คุณต้องการได้ ด้วยการใช้คำสั่ง git stash pop ที่นั่น จากนั้นการเปลี่ยนแปลงดังกล่าวจะไปอยู่ใน branch ที่คุณต้องการ

# Scenario with checkout

หากคุณต้องการ switch หรือ “เปลี่ยน” ไปทำงานยัง branch อื่นๆ คุณสามารถเรียกใช้คำสั่งต่อไปนี้

หากคุณได้เปลี่ยนแปลง file ไปแล้วใน branch ปัจจุบันของคุณ คุณต้องแน่ใจว่าได้ stash หรือ commit การเปลี่ยนแปลงแล้ว เพราะถ้าคุณไม่ได้ stash หรือ commit การเปลี่ยนแปลงนั้น มันจะส่งผลไปถึง branch ที่คุณ switch ไปด้วย ซึ่งคุณคงไม่ต้องการแบบนั้น

คุณมี  branch ชื่อ development  และคุณต้องการสร้าง branch จาก development และ switch ไปที่ branch ใหม่โดยตรง คุณสามารถใช้คำสั่งต่อไปนี้

คุณสามารถ checkout โดยใช้ commit id ได้ เพื่อความปลอดภัยคุณสามารถใช้ shorthand commit id ถ้า Project ของคุณไม่ได้ใหญ่มาก

* นี่อาจทำให้เกิดปัญหา detached head ใน git ได้ เพราะโดยทั่วไป Head จะทำการ refer ไปยัง commit (ล่าสุด) ที่อยู่ใน branch ปัจจุบัน แต่ถ้า Head ดันเกิดชี้ไปที่ commit อื่นที่ไม่อยู่ใน branch นั้น อาจทำให้เกิดปัญหา detached head ได้ เรียกง่ายๆ คือ  Head ชี้ไปที่ commit เก่าที่ checkout revision มาแก้ไข ซึ่งปกติจะแก้ไขไม่ได้ เพียงแค่สำรวจดูได้เท่านั้น

คุณต้องการพัฒนา feature จาก detached head state นั้น คุณจะต้องสร้าง branch จาก state นี้และเริ่มพัฒนา feature ได้จากที่นั่น

# Scenario with commit

หากคุณเพิ่ง add commit message เข้าไป แต่มานึกได้ว่า มีการพิมพ์ผิดพลาดใน commit นั้น หรือต้องการแก้ไขให้ commit message นั้นอ่านเข้าใจมากขึ้น คุณสามารถใช้คำสั่งนี้ได้

หากคุณ add file บาง file หรือแก้ไข bug แต่ไม่ต้องการ add commit message ใดๆ คุณสามารถใช้คำสั่ง --no-edit

* สิ่งหนึ่งที่คุณควรระลึกไว้เสมอคือ เมื่อคุณแก้ไข commit ล่าสุด จะมีการ rewrite ตัว commit history ด้วย นั่นหมายความว่า commit id จะเปลี่ยนแปลงไปตามการแก้ไข commit

หากคุณทำการ push code ของคุณลงไปใน remote repository แล้ว และคุณเพิ่งมานึกได้ว่าคุณต้องแก้ไข commit message ด้วย หลังจากการแก้ไขคุณจะต้องบังคับให้ push สมมติว่าชื่อ remote คือ origin คุณสามารถใช้คำสั่งนี้ได้

# Scenario with reset

หากคุณต้องการยกเลิกการ commit ล่าสุด คุณสามารถใช้ git reset ในการยกเลิก commit เหล่านั้น โดยคุณสามารถใช้ git reset ร่วมกับ 3 flags ได้ดังนี้คือ –soft, --mixed, --hard

สมมติว่าคุณต้องการยกเลิกการเปลี่ยนแปลงจนถึง two.txt ซึ่งมี commit id คือ 96b037c ทีนี้ลองเรียกใช้คำสั่ง git reset แบบ –soft flag

ด้วยคำสั่ง git reset –soft จะทำการตัดการ refer ไปยัง commit ทั้งหมดที่อยู่หลังจาก commit id ชื่อ 96b037c โดย file จะยังไม่ถูกลบ แต่จะไปอยู่ใน staging area

* การไม่มี path ที่ refer ไปยัง commit ต่างๆ เรียกว่า orphaned commit ซึ่งจะสามารถค้นพบและ restore คืนได้โดยใช้คำสั่ง git reflog ปกติ Git จะทำการลบ orphaned commit หลังจากที่ run internal garbage collector แล้ว ด้วยค่า default แล้ว Git จะถูกตั้งค่าให้ run garbage collector ทุกๆ 30 วัน

ดังนั้น เมื่อคุณ run คำสั่ง git status คุณจะเห็นผลลัพธ์ดังนี้

หากคุณ run คำสั่ง run git log –oneline คุณจะเห็นว่า commit ก่อนหน้านี้ จะถูกลบออกไปแล้ว

ถ้าคุณ run คำสั่ง reset ด้วย –mixed แล้ว commit ของคุณจะกลายเป็น orphaned commit และ file จะไม่อยู่ใน staging area แล้ว แต่ยังคงอยู่ใน file system หากคุณไม่ได้ระบุ flag ใดๆ ในคำสั่ง reset แล้ว git จะใช้ --mixed flag เป็นตัว default

หากคุณ run คำสั่ง git status คุณจะเห็นผลลัพธ์ดังนี้

หากคุณต้องการลบ file อย่างถาวร คุณสามารถใช้คำสั่ง reset ด้วย --hard flag

สำหรับแนวทางปฏิบัติที่เหมาะสมคือ ครั้งแรกคุณควรใช้คำสั่ง reset ด้วย --soft flag ก่อนแล้วดูว่า file ไหนจะได้รับผลกระทบอะไรบ้าง แต่ถ้าคุณแน่ใจว่าไม่ต้องการมันแล้ว คุณสามารถใช้คำสั่ง reset ด้วย --hard flag

คุณไม่ควรใช้คำสั่ง git reset <commit-id> หลังจากที่ <commit-id> นั้นถูก push ไปยัง public repository แล้ว เพราะการ remove commit ออกไป อาจส่งผลกระทบและสร้างปัญหาต่อคนอื่นๆ ในทีมที่กำลังทำงานอยู่

# Scenario with revert

หากคุณกำลังทำงานอยู่ใน public repository และคุณต้องการยกเลิกการ commit คุณสามารถเรียกใช้คำสั่งนี้ได้

หลังจากใช้คำสั่งด้านบนแล้ว คุณสามารถตรวจสอบ file ที่ได้รับผลกระทบโดยใช้คำสั่ง git status จากนั้นคุณสามารถ commit ด้วยคำสั่ง git commit -m "commit-message"

การใช้คำสั่ง git revert จะไม่เกิด orphaned commit มันจะยกเลิกการเปลี่ยนแปลงของ commit id ที่ถูก reverted

สมมติว่า คุณต้องการ revert การ commit ครั้งล่าสุด และหลังจากการ revert แล้ว status จะเป็นดังรูปด้านล่าง

ก่อนการ commit ล่าสุด six.txt file ไม่ได้ถูกเพิ่มเข้าไป ดังนั้นมันจึงถูกลบและ five.txt จะถูกเปลี่ยนกลับไปอยู่ในสถานะก่อนหน้า ณ ตอนนี้หลังจากการ commit แล้ว commit history ของคุณจะเป็นแบบนี้

หากคุณต้องการ revert หลายๆ commit แบบเป็นช่วง พร้อมๆ กัน คุณสามารถใช้คำสั่งนี้ได้

แต่หากคุณต้องการ revert หลายๆ commit แบบไม่เป็นช่วง ก็ให้คุณระบุทีละ commit id ไปเลย

# Scenario with cherry-pick

หากคุณกำลังทำงานอยู่ที่ branch และคุณก็ต้องการ commit บางอย่าง (เช่น bug fix commit) จาก branch หนึ่งมายัง branch ปัจจุบัน คุณสามารถใช้ cherry-pick เพื่อ commit ใน branch ปัจจุบัน รวมทั้งยังช่วยในการการ commit ผิด branch อีกด้วย

ก่อนอื่นคุณต้องเปลี่ยนไปยัง branch ที่มีการ commit ก่อน จากนั้นให้ copy commit id ของการ commit นั้นแล้ว switch กลับไปยัง branch ที่คุณกำลังทำงานอยู่ จากนั้น run คำสั่งดังกล่าว เพื่อทำการ commit ใน branch ที่คุณกำลังทำงานอยู่

คำสั่ง git cherry-pick เปรียบเหมือน การที่คุณ copy บางอย่างจาก folder หนึ่งไป paste ในอีก folder หนึ่งนั่นเอง นั่นคือ มันจะไม่ delete commit จาก branch เดิม และใน branch ที่เป็นปลายทาง ก็จะเป็น commit id ใหม่

หวังว่า คำสั่ง git เหล่านี้จะเป็นประโยชน์กับคนที่ใช้งาน git อยู่เป็นประจำนะครับ

ที่มา:  https://medium.com/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความล่าสุด