ปรับปรุง
git squash-all
ผมได้ทำนามแฝง
ตัวอย่างการใช้ : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Caveat : อย่าลืมแสดงความคิดเห็นมิฉะนั้นจะใช้ข้อความยืนยันเริ่มต้น "เริ่มต้นใหม่"
หรือคุณสามารถสร้างนามแฝงด้วยคำสั่งต่อไปนี้:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
หนึ่งในสายการบิน
git reset $(git commit-tree HEAD^{tree} -m "A new start")
หมายเหตุ : ที่นี่ " A new start
" เป็นเพียงตัวอย่างอย่าลังเลที่จะใช้ภาษาของคุณเอง
TL; DR
ไม่จำเป็นต้องสควอชใช้git commit-tree
ในการสร้างเด็กกำพร้ากระทำและไปกับมัน
อธิบาย
สร้างการส่งคำสั่งเดียวผ่าน git commit-tree
อะไรgit commit-tree HEAD^{tree} -m "A new start"
คือ:
สร้างวัตถุการยอมรับใหม่ตามวัตถุต้นไม้ที่ให้ไว้และปล่อยวัตถุการยอมรับใหม่ใน stdout ข้อความบันทึกถูกอ่านจากอินพุตมาตรฐานยกเว้นว่าจะได้รับตัวเลือก -m หรือ -F
การแสดงออกHEAD^{tree}
หมายถึงวัตถุต้นไม้ที่สอดคล้องกับHEAD
คือปลายของสาขาปัจจุบันของคุณ เห็นต้นไม้วัตถุและมอบวัตถุ
รีเซ็ตสาขาปัจจุบันเป็นการกระทำใหม่
จากนั้นgit reset
เพียงรีเซ็ตสาขาปัจจุบันไปยังวัตถุการยอมรับที่สร้างขึ้นใหม่
วิธีนี้จะไม่มีการสัมผัสอะไรในพื้นที่ทำงานและไม่จำเป็นต้องมีการรีบูท / สควอชซึ่งทำให้เร็วจริงๆ และเวลาที่ต้องการนั้นไม่เกี่ยวข้องกับขนาดพื้นที่เก็บข้อมูลหรือความลึกประวัติ
รูปแบบ: Repo ใหม่จากเทมเพลตโครงการ
สิ่งนี้มีประโยชน์ในการสร้าง "การเริ่มต้นยอมรับ" ในโครงการใหม่โดยใช้ที่เก็บอื่นเป็นเทมเพลต / archetype / seed / โครงกระดูก ตัวอย่างเช่น:
cd my-new-project
git init
git fetch --depth=1 -n https://github.com/toolbear/panda.git
git reset --hard $(git commit-tree FETCH_HEAD^{tree} -m "initial commit")
วิธีนี้หลีกเลี่ยงการเพิ่ม repo เทมเพลตเป็นรีโมท ( origin
หรืออย่างอื่น) และยุบประวัติของ repo เทมเพลตลงในการคอมมิทเริ่มต้นของคุณ