Stashing ช่วยให้คุณบันทึกโค้ดไว้ใช้ในภายหลังในที่เก็บ Git
เมื่อคุณทำงานกับที่เก็บ Git คุณสามารถเปลี่ยนแปลงไฟล์ที่คุณต้องการนำไปใช้กับ Git คอมมิตในภายหลังได้
นั่นคือสิ่งที่คำสั่ง git stash มีประโยชน์ Stashing ให้คุณบันทึกรหัสในสาขาการทำงานของคุณในภายหลัง ในบทช่วยสอนนี้ เราจะพูดถึงตัวอย่าง พื้นฐานของการ stash ใน Git และวิธีใช้คำสั่ง git stash
Git Stash คืออะไร
Stashing ช่วยให้คุณบันทึกโค้ดในไดเร็กทอรีและดัชนีการทำงานของคุณในภายหลัง บางครั้ง เมื่อคุณกำลังเขียนโค้ด คุณจะต้องบันทึกการเปลี่ยนแปลงที่คุณได้ทำไว้ แต่ไม่ต้องคอมมิตกับที่เก็บ
สถานการณ์หนึ่งที่อาจเกิดขึ้นคือการแก้ไขปัญหา สมมติว่ามีรายงานข้อบกพร่อง คุณกำลังดำเนินการใช้งานคุณลักษณะนี้อยู่แล้ว คุณอาจต้องการบันทึกการเปลี่ยนแปลงที่ทำไว้กับคุณลักษณะก่อนแล้วจึงแก้ไขข้อบกพร่อง
เนื่องจากรายงานข้อบกพร่องมีแนวโน้มที่จะมีความสำคัญเหนือกว่าคุณลักษณะที่คุณกำลังพัฒนา คุณต้องการแก้ไขจุดบกพร่องก่อน ก่อนส่งโค้ดที่เน้นคุณลักษณะไปยังที่เก็บ คุณไม่ต้องการให้การแก้ไขจุดบกพร่องและคุณลักษณะปรากฏในการคอมมิต เนื่องจากคอมมิตที่ใหญ่และซับซ้อนยิ่งขึ้นทำให้นักพัฒนารายอื่นอ่านประวัติของที่เก็บได้ยากขึ้น
กล่าวอีกนัยหนึ่ง stashing ช่วยให้คุณทำงานอย่างอื่นในที่เก็บ Git ได้โดยไม่ต้องละทิ้งหรือคอมมิตโค้ดที่มีอยู่
Stashing ช่วยให้คุณบันทึกหรือ “ซ่อน” การเปลี่ยนแปลงที่คุณทำกับไฟล์ไว้ใช้ในภายหลัง เมื่อจัดเก็บไฟล์แล้ว คุณสามารถทำอย่างอื่นได้ จากนั้น คุณสามารถกลับมาใช้การเปลี่ยนแปลงที่คุณซ่อนไว้กับโค้ดของคุณได้ในภายหลัง
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
Stashing เปลี่ยนไดเร็กทอรีการทำงานปัจจุบันไปเป็นการคอมมิตล่าสุด ซึ่งหมายความว่าการซ่อนโค้ดของเราไว้ทำให้เรามีไดเร็กทอรีการทำงานที่สะอาดซึ่งเราสามารถทำงานได้ การมีไดเร็กทอรีที่สะอาดหมายความว่าเราสามารถเปลี่ยนแปลงได้โดยไม่ต้องกังวลเกี่ยวกับข้อขัดแย้งในการผสาน นอกจากนี้เรายังไม่ต้องคิดเกี่ยวกับการจัดเรียงการเปลี่ยนแปลงที่เราทำระหว่างการคอมมิต
วิธีการซ่อนการเปลี่ยนแปลงใน Git
คำสั่ง git stash ใช้เพื่อซ่อนรหัสในภายหลัง เมื่อคุณเรียกใช้ git stash การเปลี่ยนแปลงที่คุณไม่ได้ส่งไปยังคอมมิตในไดเร็กทอรีการทำงานปัจจุบันของคุณจะถูกบันทึกไว้ในภายหลัง ซึ่งรวมถึงการเปลี่ยนแปลงแบบทีละขั้น (การเปลี่ยนแปลงที่เพิ่มไปยังพื้นที่จัดเตรียมโดยใช้ git add) และการเปลี่ยนแปลงที่ไม่จัดฉาก
นี่คือไวยากรณ์สำหรับคำสั่ง git stash:
git stash
สมมติว่าเรากำลังดำเนินการบนเว็บไซต์และโค้ดของเราถูกจัดเก็บไว้ในที่เก็บ Git
เราได้ทำการเปลี่ยนแปลงไฟล์ index.html และ index.js ในโค้ดของเรา เราต้องการซ่อนไฟล์เหล่านี้ไว้ในภายหลังในขณะที่เราแก้ไขข้อผิดพลาดในการออกแบบในไฟล์ index.html
หากต้องการดูการเปลี่ยนแปลง เราสามารถใช้คำสั่งสถานะ git ผลตอบแทนนี้ ในตัวอย่างของเรา:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html
นี่แสดงให้เราเห็นว่าเราได้สร้างไฟล์ใหม่ (index.js) และเราได้แก้ไขไฟล์ที่มีอยู่แล้ว (index.html) เราต้องการบันทึกการเปลี่ยนแปลงเหล่านี้ไว้ใช้ในภายหลังในขณะที่เราทำงานในส่วนอื่นของฐานรหัสของเรา ในการทำเช่นนั้น เราจะใช้คำสั่ง git stash:
git stash
รหัสของเราส่งคืน:
Saved working directory and index state WIP on master: 3b16026 feat: Launch new homepage
คำสั่ง git stash ได้บันทึกการเปลี่ยนแปลงที่เราทำกับที่เก็บของเราไว้ใช้ในภายหลัง ทีนี้ หากเรารันคำสั่ง git status อีกครั้ง เราจะเห็นว่าไม่มีอะไรให้คอมมิต:
On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
คำสั่ง git stash ได้บันทึกการเปลี่ยนแปลงที่เราทำกับที่เก็บของเราไว้ใช้ในภายหลัง ทีนี้ ถ้าเรารันคำสั่ง git status อีกครั้ง เราจะเห็นว่าไม่มีอะไรให้คอมมิต:
เมื่อโค้ดของคุณถูกเก็บถาวร ที่เก็บของคุณจะถูกเปลี่ยนกลับเป็นการคอมมิตก่อนหน้าโดยที่คุณไม่ได้ทำการเปลี่ยนแปลง การเปลี่ยนแปลงที่คุณทำกับรหัสของคุณได้รับการบันทึกไว้แล้ว สามารถใช้กับ codebase เมื่อคุณพร้อมโดยใช้คำสั่ง stash pop
ซ่อนการเปลี่ยนแปลงที่ไม่ได้ติดตาม
คำสั่ง git stash จะ stash เฉพาะการเปลี่ยนแปลงที่เกิดขึ้นกับไฟล์ กำลังติดตามอยู่ในที่เก็บ Git แล้ว . โดยค่าเริ่มต้น คำสั่ง stash จะไม่รวมการเปลี่ยนแปลงที่ไม่ได้ติดตาม
การเปลี่ยนแปลงแบบสเตจคือการเปลี่ยนแปลงที่เพิ่มไปยังพื้นที่การแสดงละคร การเปลี่ยนแปลงที่ไม่ได้จัดฉากที่ซ่อนไว้คือการเปลี่ยนแปลงที่ทำกับไฟล์ที่ติดตามโดย Git หากคุณเปลี่ยนไฟล์ใหม่ที่ Git ไม่ได้ติดตาม ไฟล์นั้นจะไม่ถูกเพิ่มไปยังที่เก็บ Git ไฟล์ที่ถูกละเว้นจะไม่ถูกเพิ่มไปยังที่เก็บสะสม
นี่เป็นการตั้งค่าเริ่มต้นที่ใช้เมื่อใช้คำสั่ง git stash หากคุณต้องการซ่อนไฟล์ที่ไม่ได้ติดตาม เช่น ไฟล์ใหม่ที่ยังไม่ได้จัดฉาก คุณสามารถใช้แฟล็ก -u นี่คือไวยากรณ์สำหรับแฟล็ก -u:
git stash -u
อีกทางหนึ่ง หากคุณต้องการรวมไฟล์ที่ถูกละเว้นไว้ในที่เก็บถาวร คุณสามารถใช้แฟล็ก -a นี่คือไวยากรณ์สำหรับแฟล็ก -a:
git stash -a
การใช้แฟล็ก -a จะบอก git stash ให้ซ่อนการเปลี่ยนแปลงในไฟล์ที่คุณละเว้น ไฟล์เหล่านี้เป็นไฟล์ที่กำหนดไว้ในไฟล์ .gitignore ในที่เก็บโค้ดของคุณ (ถ้าคุณมี)
ใช้การเปลี่ยนแปลงที่ซ่อนโดยใช้ git stash pop
คำสั่ง git stash pop ใช้เพื่อนำการเปลี่ยนแปลงที่ซ่อนไปใช้กับที่เก็บ สมมติว่าเราได้ตัดสินใจว่าเราต้องการใช้การเปลี่ยนแปลงที่ซ่อนไว้ที่เราได้ทำไว้ในตัวอย่างก่อนหน้านี้ เราสามารถทำได้โดยใช้คำสั่งนี้:
git stash pop
คำสั่ง git stash pop ส่งคืน:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html Dropped refs/stash@{0} (48afd55381cf43f2332f771349c7233fb99f80a6)
เมื่อรันคำสั่ง git stash pop การเปลี่ยนแปลงจาก stash ของเราจะนำไปใช้กับสำเนาการทำงานในเครื่องของที่เก็บของเรา คำสั่ง pop ใช้รหัสใน tash กับที่เก็บของคุณ จากนั้น ที่เก็บสะสมจะว่างเปล่า
คำสั่ง git stash pop จะส่งคืนรายการการเปลี่ยนแปลงที่คุณทำกับโค้ดของคุณ ซึ่งแสดงว่ามีอะไรอยู่ในที่ซ่อนของคุณ
คุณสามารถใช้คำสั่ง git stash Apply เพื่อใช้การเปลี่ยนแปลงที่คุณได้ทำกับโค้ดของคุณ คุณสามารถเก็บการเปลี่ยนแปลงเหล่านั้นไว้ในที่ซ่อนของคุณ เราสามารถเก็บการเปลี่ยนแปลงไว้ในที่ซ่อนของเราโดยใช้คำสั่งต่อไปนี้:
git stash apply
คำสั่งส่งคืน:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html
การนำการเปลี่ยนแปลงไปใช้ในหลายสาขา
การใช้การเปลี่ยนแปลงที่ซ่อนแบบเดียวกันนี้กับหลายสาขาใน codebase ของคุณเป็นกรณีการใช้งานที่ดีสำหรับคำสั่ง stash ตัวอย่างเช่น คุณอาจตัดสินใจใช้ที่เก็บสะสมกับสาขาเดียว จากนั้น คุณจะย้ายไปที่สาขาอื่นและใช้ที่เก็บเดียวกันเพื่อใช้การเปลี่ยนแปลงที่บันทึกไว้
คลังเก็บของหลายช่อง
คุณสามารถสร้างที่เก็บสะสมได้หลายรายการใน Git ซึ่งหมายความว่าสามารถเปลี่ยนแปลงไฟล์หนึ่งไฟล์และซ่อนไว้ในภายหลัง คุณเปลี่ยนแปลงไฟล์อื่นและจัดเก็บไว้ในที่เก็บแยกต่างหากได้
การติดตามคลังเก็บ
หากต้องการส่งคืนรายการที่เก็บในที่เก็บ คุณสามารถเรียกใช้คำสั่งต่อไปนี้:
git stash list
สมมติว่าเราต้องการดึงรายการที่เก็บถาวรทั้งหมดที่เราสร้างขึ้น เราสามารถทำได้โดยดำเนินการคำสั่งด้านบน คำสั่งนี้ส่งคืน:
stash@{0}: WIP on master: 3b16026 feat: Launch new homepage stash@{1}: WIP on master: 3b16026 feat: Launch new homepage
คำสั่ง git stash list ส่งคืนรายการที่เก็บของเรา
อย่างไรก็ตาม ที่เก็บถาวรเหล่านี้ใช้เฉพาะข้อความคอมมิตเริ่มต้นที่เชื่อมโยงกับที่เก็บ ซึ่งหมายความว่าเป็นการยากสำหรับเราที่จะติดตามว่าที่เก็บสะสมใดบ้างที่มีการเปลี่ยนแปลง เนื่องจากเรายังไม่ได้ระบุคำอธิบายเกี่ยวกับคลังเก็บของของเรา
สมมติว่าเราต้องการเพิ่มคำอธิบายไปยังที่เก็บใหม่ เราสามารถทำได้โดยใช้คำสั่งนี้:
git stash save "add new change to website"
คำสั่งส่งคืน:
Saved working directory and index state On master: add new change to website
แทนที่จะได้รับข้อความเริ่มต้นที่เกี่ยวข้องกับการคอมมิตครั้งล่าสุดของเรา ที่ซ่อนของเราได้รับมอบหมายข้อความของตัวเอง
การใช้ Stashes หลายอัน
คำสั่ง git stash pop ใช้ที่เก็บล่าสุดกับที่เก็บของคุณ (อันที่มีแท็ก stash@{0}) อย่างไรก็ตาม เมื่อคุณทำงานกับที่เก็บหลายอัน คุณอาจต้องการใช้ที่เก็บเฉพาะกับ codebase ของคุณ
คุณสามารถทำได้โดยระบุ ID เฉพาะที่เกี่ยวข้องกับที่เก็บสะสมที่คุณต้องการใช้กับ codebase ของคุณ สมมติว่าเราต้องการใช้ stash ที่เก็บไว้ที่ stash@{1} กับ codebase ของเรา เราสามารถทำได้โดยใช้คำสั่งนี้:
git stash pop stash@{2}
คำสั่งใช้การเปลี่ยนแปลงที่เก็บไว้ใน stash@{2} กับที่เก็บของเราและลบที่ซ่อน
การสร้างสาขาโดยใช้ Stash
Stashing เป็นวิธีการในการจัดเก็บการเปลี่ยนแปลงที่คุณทำกับ codebase อย่างสะดวกในขณะที่คุณดำเนินการเปลี่ยนแปลงอื่น
อย่างไรก็ตาม อาจมีบางครั้งที่ แทนที่จะรักษาที่เก็บสะสม คุณต้องการย้ายรหัสของคุณไปยังสาขาของตัวเอง
สถานการณ์นี้อาจเกิดขึ้นได้หากมีข้อขัดแย้งเกิดขึ้นเมื่อคุณรวมโค้ดของคุณ คุณอาจต้องการย้ายรหัสไปยังสาขาอื่น หากคุณกำลังทำการเปลี่ยนแปลงที่ใหญ่ขึ้นในฐานรหัส นั่นคือที่มาของคำสั่ง git stash branch
คุณสามารถใช้คำสั่ง git stash branch เพื่อสร้างแบรนช์ใหม่ที่จะใช้การเปลี่ยนแปลงใน stash ไวยากรณ์สำหรับคำสั่งนี้มีดังต่อไปนี้:
git stash branch <new-branch> <stash-id>
พารามิเตอร์ “new-branch” หมายถึง ID ของ branch ที่ควรสร้างขึ้น “stash-id” หมายถึง ID ของ stash ที่มีรหัสที่คุณต้องการใช้กับสาขาใหม่
สมมติว่าเราต้องการนำการเปลี่ยนแปลงจาก stash@{2} stash ไปใช้กับสาขาใหม่ที่ชื่อว่า “update-site” เราสามารถทำได้โดยใช้คำสั่งนี้:
git stash branch update-site stash@{2}
คำสั่งส่งคืน:
Switched to a new branch 'update-site' On branch update-site Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html Dropped stash@{2} (9a15b9cd20f8988937134d1267fafbea4c6a8647)
อันดับแรก คำสั่ง git stash branch จะสร้างสาขาใหม่สำหรับการเปลี่ยนแปลงที่ซ่อนของเรา การเปลี่ยนแปลงที่เราทำกับที่เก็บจะนำไปใช้กับสาขาใหม่ จากนั้นเราก็เปลี่ยนมาดูสาขานั้น สุดท้าย ที่ซ่อนของเราจะถูกลบออกเนื่องจากรหัสที่ซ่อนถูกบันทึกไว้ในสาขาของตัวเอง
ลบ Git Stash
เมื่อคุณใช้โค้ดใน stash แล้ว คุณสามารถใช้คำสั่ง git stash drop เพื่อลบ stash ได้ นี่คือไวยากรณ์สำหรับคำสั่ง git stash drop:
git stash drop <stash>
สมมติว่าเราต้องการวางที่ซ่อนด้วย ID stash@{2} เราสามารถทำได้โดยใช้คำสั่งนี้:
git stash drop stash@{2}
คำสั่งส่งคืน:
Dropped stash@{2} (82079798c950b053fac0efb7b1d5693864dc96e7)
หรือคุณสามารถใช้คำสั่ง git stash clear เพื่อลบที่เก็บถาวรทั้งหมดที่เกี่ยวข้องกับที่เก็บ ไวยากรณ์สำหรับคำสั่งนี้คือ:
git stash clear
คำสั่งนี้จะลบที่เก็บถาวรทั้งหมดในที่เก็บของเรา
การซ่อนไฟล์เฉพาะ
คำสั่ง git stash เก็บไฟล์ที่ติดตามทั้งหมดไว้ในไดเร็กทอรีการทำงานปัจจุบันของคุณโดยค่าเริ่มต้น อย่างไรก็ตาม ในบางกรณี คุณอาจตัดสินใจว่าต้องการซ่อนไฟล์เฉพาะหรือชุดของไฟล์
คุณสามารถซ่อนไฟล์เฉพาะได้โดยใช้คำสั่ง git stash push นี่คือไวยากรณ์สำหรับการใช้คำสั่งนี้:
git stash push -m "<message>" <file>
พารามิเตอร์ "ข้อความ" หมายถึงข้อความที่จะเชื่อมโยงกับที่เก็บของคุณ พารามิเตอร์ “file” คือชื่อของไฟล์ที่คุณต้องการซ่อน
สมมติว่าเราต้องการเพิ่มเฉพาะการเปลี่ยนแปลงที่เราทำกับไฟล์ index.html ในโค้ดของเราไปยังที่ซ่อน เราสามารถทำได้โดยใช้คำสั่งนี้:
git stash push -m "feat: changed index.html file" index.html
คำสั่งส่งคืน:
Saved working directory and index state On master: feat: changed index.html file
คำสั่งได้เพิ่มเฉพาะไฟล์ index.html ไปยังที่เก็บถาวรโดยมีข้อความยืนยัน "feat:เปลี่ยนไฟล์ index.html" ยังไม่ได้เพิ่มการเปลี่ยนแปลงอื่นๆ ทั้งหมดที่เราทำกับโค้ดของเรา
แสดงความแตกต่างระหว่าง Stashes
เมื่อคุณทำงานกับที่เก็บถาวร คุณอาจทำการเปลี่ยนแปลงหลายอย่างในฐานรหัสของคุณในหลาย ๆ การคอมมิต ก่อนที่คุณจะกลับไปที่โค้ดที่คุณซ่อนไว้
ตัวอย่างเช่น หากคุณซ่อนรหัสของคุณไว้และดำเนินการแก้ไขจุดบกพร่องต่อไป คุณอาจกดยืนยันสองสามคำสั่งเพื่อแก้ไขจุดบกพร่องก่อนที่คุณจะกลับไปที่รหัสที่ซ่อน ซึ่งหมายความว่าคุณอาจต้องการดูสรุปความแตกต่างระหว่างที่ซ่อนและการคอมมิตล่าสุดของรหัสของคุณ (เพื่อให้คุณรู้ว่าคุณเปลี่ยนแปลงอะไรไปบ้างตั้งแต่เก็บรหัสของคุณ)
หากต้องการดูความแตกต่างระหว่าง stash และการคอมมิตล่าสุด คุณสามารถใช้คำสั่ง git stash show ไวยากรณ์สำหรับคำสั่งนี้คือ:
git stash show <stash-id>
พารามิเตอร์ “stash-id” คือ ID ของ stash ที่คุณต้องการเปรียบเทียบการเปลี่ยนแปลงกับการคอมมิตล่าสุดของสาขาของคุณ สมมติว่าเราต้องการเปรียบเทียบโค้ดใน stash@{1} stash ของเรากับสถานะปัจจุบันของโค้ดของเรา เราสามารถทำได้โดยใช้คำสั่งนี้:
git stash show stash@{1}
คำสั่งส่งคืน:
index.html | 2 +- index.js | 0 2 files changed, 1 insertion(+), 1 deletion(-)
ผลลัพธ์นี้บอกเราว่าเราได้ทำการเปลี่ยนแปลงสองครั้งในโค้ดของเรา:การแทรกหนึ่งครั้งและการลบหนึ่งครั้ง หากเราต้องการดูความแตกต่างระหว่างไฟล์ของเรา เราสามารถเห็นความแตกต่างได้โดยใช้แฟล็ก -p stash ไวยากรณ์สำหรับแฟล็กนี้มีดังต่อไปนี้:
git stash show -p stash@{1}
คำสั่งดังกล่าว เมื่อดำเนินการ จะส่งกลับ:
diff --git a/index.html b/index.html index 4dd1ef7..e859c68 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -</div> +</html> diff --git a/index.js b/index.js new file mode 100644 index 0000000..e69de29
ผลลัพธ์นี้ช่วยให้เราเห็นการเปรียบเทียบโค้ดทั้งหมดในที่เก็บถาวรและการคอมมิตล่าสุดของสาขา ผลลัพธ์ข้างต้น เช่น บอกเราว่าเราได้ลบบรรทัด ออกจากไฟล์ index.html ของเรา (แสดงด้วยสัญลักษณ์ –) และเราได้เพิ่มบรรทัด