จากหนังสือ Git SCM :
บ่อยครั้งเมื่อคุณทำงานในส่วนของโครงการของคุณสิ่งต่าง ๆ อยู่ในสภาพที่ยุ่งเหยิงและคุณต้องการที่จะสลับสาขาเพื่อทำงานในสิ่งอื่น ปัญหาคือคุณไม่ต้องการทำงานที่ทำเพียงครึ่งหนึ่งเพื่อที่คุณจะได้กลับมาที่จุดนี้ในภายหลัง คำตอบของปัญหานี้คือคำสั่ง git stash
การจัดเก็บจะใช้เวลาสกปรกไดเรกทอรีการทำงานของคุณ - นั่นคือไฟล์ที่ถูกติดตามการแก้ไขและการเปลี่ยนแปลงการจัดฉาก - และบันทึกไว้ในกองของการเปลี่ยนแปลงที่ยังไม่เสร็จที่คุณสามารถนำไปใช้ใหม่ได้ตลอดเวลา
ให้คำอธิบายนี้ฉันจะบอกว่านี่เป็นรูปแบบการต่อต้าน คำอธิบายที่เรียบง่ายเกินไปของ Git Stash อาจเป็นได้ว่า "การตัดและวาง" ของการควบคุมแหล่งที่มา คุณนำไฟล์ที่มีการเปลี่ยนแปลงจำนวนมาก "ซ่อน" ไฟล์เหล่านั้นไว้ในปากกาจับด้านนอกเวิร์กโฟลว์การแยกสาขาของ Git แล้วนำการเปลี่ยนแปลงเหล่านั้นไปใช้กับสาขาอื่นในภายหลัง
การย้อนกลับไปอีกเล็กน้อยการมุ่งมั่นที่จะเป็นหลักคือรูปแบบการต่อต้านที่นี่ ใช้กิ่งไม้ นั่นคือสิ่งที่พวกเขาถูกออกแบบมาสำหรับ
จริงๆแล้วมันทำให้เรื่องนี้แย่ลง:
คุณสามารถตอกตะปูเกลียวเข้ากับผนังและมันจะจับภาพ แต่การใช้ไขควงเป็นสิ่งที่คุณควรทำ อย่าใช้ค้อนเมื่อไขควงนั่งอยู่ข้างคุณ
เกี่ยวกับการยอมรับรหัส "แตก"
ในขณะที่ต่อไปนี้เป็นความเห็นฉันได้มาจากความคิดเห็นนี้จากประสบการณ์
กระทำก่อนกำหนดและกระทำบ่อย ๆ ยอมรับรหัสที่ใช้งานไม่ได้ตามที่คุณต้องการ ดูประวัติการกระทำในท้องถิ่นของคุณเป็น "บันทึกคะแนน" ในขณะที่คุณแฮกบางสิ่ง เมื่อคุณทำชิ้นส่วนที่เป็นตรรกะแล้วให้คอมมิท แน่นอนว่ามันอาจทำลายทุกอย่าง แต่นั่นไม่สำคัญตราบใดที่คุณไม่ผลักดันสิ่งเหล่านั้น ก่อนที่จะผลักดันให้รีบูตและสควอชกระทำ
- สร้างสาขาใหม่
- แฮ็คแฮ็คแฮ็ค
- ส่งมอบรหัสที่ใช้งานไม่ได้
- ขัดรหัสและทำให้มันใช้งานได้
- ยอมรับรหัสการทำงาน
- Rebase และ Squash
- ทดสอบ
- ดันเมื่อผ่านการทดสอบ
สำหรับ OP แล้วเธรดข้อความ Linux kernal นี้อาจเป็นที่สนใจเพราะมันฟังดูเหมือนสมาชิกบางคนในทีมของ OP กำลังใช้ Git ในลักษณะที่คล้ายกัน
@RibaldEddie กล่าวในความคิดเห็นด้านล่าง:
ก่อนอื่นการซ่อนไม่ได้อยู่นอก "เวิร์กโฟลว์การแตกแขนง" เนื่องจากที่เก็บซ่อนใต้กิ่งนั้นเป็นเพียงอีกสาขาหนึ่ง
(มีความเสี่ยงที่จะเกิดความโกรธแค้นของหลาย ๆ คน)
ไลนัสกล่าวว่า:
ด้วย "git stash" คุณสามารถมีหลายสิ่งที่แตกต่างกันได้เช่นกัน แต่พวกเขาไม่ได้จัดคิวซึ่งกันและกัน - มันเป็นเพียงแพตช์อิสระที่คุณสุ่มเก็บเพราะมันไม่สะดวกในบางจุด
สิ่งที่ฉันคิดว่า @RibaldEddie พยายามที่จะพูดคือคุณสามารถใช้git stash
ในเวิร์กโฟลว์สาขาคุณลักษณะ - และนี่คือความจริง มันไม่ใช่การใช้git stash
สิ่งที่เป็นปัญหา git stash
มันคือการรวมกันของการกระทำที่จะโทและการใช้ นี่คือรูปแบบการต่อต้าน
ชี้แจง git rebase
จากความคิดเห็นของ @ RibaldEddie:
การรีบูตเป็นมากขึ้นเช่นการคัดลอกและยิ่งแย่ลงแก้ไขประวัติมุ่งมั่น
(เหมืองเน้น)
แก้ไขประวัติกระทำไม่ได้เป็นสิ่งที่ไม่ดีตราบใดที่มันเป็นท้องถิ่นกระทำประวัติศาสตร์ หากคุณ rebase ยอมรับว่าคุณได้ผลักแล้วคุณจะกำพร้าคนอื่นโดยใช้สาขาของคุณ นี้ไม่ดี.
ทีนี้สมมติว่าคุณทำหลายอย่างในระหว่างวัน ความมุ่งมั่นบางอย่างดี บางคน ... ไม่ค่อยดี git rebase
คำสั่งร่วมกับฉับกระทำของคุณเป็นวิธีที่ดีในการทำความสะอาดประวัติกระทำท้องถิ่นของคุณ เป็นการดีที่จะรวมในการกระทำเพื่อสาขาสาธารณะเพราะมันทำให้ประวัติศาสตร์การกระทำของสาขาที่ใช้ร่วมกันของคุณสะอาด หลังจากรีบูตคุณจะต้องทดสอบอีกครั้ง แต่ถ้าผ่านการทดสอบแล้วคุณสามารถผลักดันการทำความสะอาดหนึ่งครั้งแทนที่จะทำความสะอาดหลายครั้ง
มีเธรดเคอร์เนล Linux อีกอันที่น่าสนใจเกี่ยวกับประวัติการคอมมิท
อีกครั้งจาก Linus:
ฉันต้องการประวัติที่สะอาด แต่นั่นหมายถึง (ก) ประวัติที่สะอาดและ (ข)
ผู้คนสามารถ (และอาจจะควร) ลดต้นไม้ส่วนตัวของพวกเขา (งานของตัวเอง) นั่นคือการทำความสะอาด แต่อย่าใช้รหัสของคนอื่น นั่นคือ "ทำลายประวัติศาสตร์"
ดังนั้นส่วนประวัติศาสตร์จึงค่อนข้างง่าย มีกฎหลักเพียงข้อเดียวเท่านั้นและการชี้แจงเล็กน้อยหนึ่งข้อ:
คุณจะต้องไม่ทำลายประวัติศาสตร์ของคนอื่น คุณต้องไม่ลดการกระทำที่คนอื่นทำ โดยพื้นฐานแล้วหากมันไม่มีการลงชื่อเข้าใช้ของคุณมันเป็นการ จำกัด : คุณไม่สามารถรีบูตได้เพราะไม่ใช่ของคุณ
ขอให้สังเกตว่านี้จริงๆเป็นเรื่องเกี่ยวกับคนอื่น ๆประวัติศาสตร์ชนชาติอื่น ๆ ไม่เกี่ยวกับรหัส หากพวกเขาส่งข้อมูลให้คุณเป็นแพตช์ที่ส่งทางอีเมลและคุณใช้กับ "git am -s" แสดงว่าเป็นรหัสของพวกเขา แต่เป็น
ประวัติของคุณ
ดังนั้นคุณสามารถก้าวต่อไปในสิ่งที่ "git rebase" บนมันแม้ว่าคุณจะไม่ได้เขียนโค้ดตราบใดที่คอมมิทเองก็เป็นคนส่วนตัวของคุณ
การชี้แจงเล็กน้อยเกี่ยวกับกฎ: เมื่อคุณเผยแพร่ประวัติของคุณในเว็บไซต์สาธารณะบางแห่งคนอื่นอาจใช้มันและตอนนี้ก็ไม่ใช่ประวัติส่วนตัวของคุณอย่างชัดเจนอีกแล้ว
ดังนั้นการชี้แจงเล็ก ๆ น้อย ๆ ก็คือมันไม่ได้เกี่ยวกับ "ความมุ่งมั่นของคุณ" แต่ยังเกี่ยวกับความเป็นส่วนตัวกับต้นไม้ของคุณและคุณยังไม่ได้ผลักมันออกมาและประกาศออกมา
...
ตอนนี้ส่วน "สะอาด" ค่อนข้างละเอียดกว่านี้เล็กน้อยแม้ว่ากฎข้อแรกจะค่อนข้างชัดเจนและใช้งานง่าย:
เก็บประวัติของคุณเองให้อ่านได้
บางคนทำสิ่งนี้โดยการทำสิ่งต่างๆในหัวก่อนไม่ใช่การทำผิดพลาด แต่นั่นหายากมากและสำหรับพวกเราที่เหลือเราใช้ "git rebase" ฯลฯ ในขณะที่เราทำงานกับปัญหาของเรา
ดังนั้น "git rebase" จึงไม่ผิด แต่มันก็ถูกต้องถ้ามันเป็นต้นไม้คอมไพล์ของคุณเองมาก
อย่าเปิดเผยอึของคุณ
ซึ่งหมายความว่าหากคุณยังอยู่ในช่วง "git rebase" คุณจะไม่ดันออกมา หากยังไม่พร้อมคุณส่งแพตช์ไปรอบ ๆ หรือใช้ต้นไม้ git ส่วนตัว (เช่นเดียวกับ "การแทนที่ชุดข้อมูลแก้ไข") ซึ่งคุณไม่ได้บอกต่อสาธารณชนในวงกว้างเกี่ยวกับ
(เน้นที่เหมือง)
ข้อสรุป
ในตอนท้าย OP มีนักพัฒนาบางคนทำสิ่งนี้:
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
มีสองปัญหาที่นี่:
- นักพัฒนามุ่งมั่นที่จะต้นแบบ ล็อคสิ่งนี้ลงทันที จริงๆนี่เป็นปัญหาที่ใหญ่ที่สุด
- นักพัฒนาซอฟต์แวร์กำลังใช้งาน
git stash
และใช้งานgit pull
ต้นแบบอย่างต่อเนื่องเมื่อพวกเขาควรใช้สาขาคุณลักษณะ
ไม่มีอะไรผิดปกติกับการใช้งานgit stash
- โดยเฉพาะอย่างยิ่งก่อนการดึง - แต่การใช้git stash
ในลักษณะนี้เป็นรูปแบบการต่อต้านเมื่อมีเวิร์กโฟลว์ที่ดีขึ้นใน Git
พวกเขาใช้git stash
ปลาเฮอริ่งแดง มันไม่ใช่ปัญหา มุ่งมั่นที่จะเป็นปัญหาหลัก