Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

Git Stash

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 ของเรา (แสดงด้วยสัญลักษณ์ –) และเราได้เพิ่มบรรทัด ลงในไฟล์ index.html ของเรา (แสดงโดย เครื่องหมาย +)

บทสรุป

คำสั่ง git stash เก็บการเปลี่ยนแปลงที่คุณทำกับ codebase ไว้ชั่วคราว เมื่อพร้อมแล้ว คุณสามารถกลับมาใช้การเปลี่ยนแปลงที่คุณทำกับ codebase ได้

บทช่วยสอนนี้กล่าวถึงพื้นฐานของการ stashing ใน Git และวิธีที่คุณสามารถใช้คำสั่ง git stash เพื่อใช้คุณสมบัติ Git stashing ตอนนี้คุณมีความรู้ที่จำเป็นในการเริ่มเก็บโค้ดอย่าง Git pro แล้ว!