git resetคือทั้งหมดที่เกี่ยวกับการย้ายHEAD, และโดยทั่วไปสาขาเตะ
คำถาม: โครงสร้างและดัชนีการทำงานเป็นอย่างไร?
เมื่อการจ้างงานกับ--soft, การเคลื่อนไหวHEADHEADส่วนใหญ่มักจะอัปเดตเตะสาขาและมีเพียง
สิ่งนี้แตกต่างจากcommit --amend:
- มันไม่ได้สร้างคอมมิตใหม่
- มันสามารถย้าย HEAD ไปยังคอมมิตใด ๆ ได้ (เช่น
commit --amendเดียวกับการไม่ย้าย HEAD ในขณะที่อนุญาตให้ทำการคอมมิตปัจจุบันซ้ำ)
เพิ่งพบตัวอย่างของการรวม:
- การผสานแบบคลาสสิก
- การผสานทรีย่อย
ทั้งหมดเป็นหนึ่งเดียว (ปลาหมึกยักษ์เนื่องจากมีการรวมสาขามากกว่าสองสาขา) ทำการผสาน
Tomas "wereHamster" Carneckyอธิบายในบทความ "Subtree Octopus merge" :
- คุณสามารถใช้กลยุทธ์การผสานทรีย่อยได้หากคุณต้องการรวมโปรเจ็กต์หนึ่งเข้ากับไดเร็กทอรีย่อยของโปรเจ็กต์อื่นและต่อมาให้โปรเจ็กต์ย่อยเป็นปัจจุบันอยู่เสมอ เป็นอีกทางเลือกหนึ่งสำหรับ git submodules
- กลยุทธ์การรวมปลาหมึกสามารถใช้เพื่อผสานสามสาขาขึ้นไป กลยุทธ์ปกติสามารถรวมสาขาได้เพียงสองสาขาและหากคุณพยายามรวมมากกว่านั้นคอมไพล์ก็จะกลับไปที่กลยุทธ์ปลาหมึกโดยอัตโนมัติ
ปัญหาคือคุณสามารถเลือกกลยุทธ์เดียวเท่านั้น แต่ฉันต้องการรวมทั้งสองเข้าด้วยกันเพื่อให้ได้ประวัติที่สะอาดซึ่งที่เก็บทั้งหมดได้รับการอัปเดตแบบอะตอมเป็นเวอร์ชันใหม่
ฉันมีซูเปอร์โปรเจ็กต์ขอเรียกมันว่าprojectAและโปรเจ็กต์ย่อยprojectBที่ฉันรวมเป็นไดเร็กทอรีย่อยของprojectA.
(นั่นคือส่วนที่ผสานทรีย่อย)
ฉันยังคงรักษาความมุ่งมั่นในท้องถิ่นไว้เล็กน้อย
ProjectAมีการปรับปรุงอย่างสม่ำเสมอมีรุ่นใหม่ทุกสองสามวันหรือสัปดาห์และมักจะขึ้นอยู่กับรุ่นเฉพาะของ projectBprojectA
เมื่อฉันตัดสินใจที่จะปรับปรุงโครงการทั้งสองผมไม่เพียงดึงจากprojectAและเป็นที่จะสร้างสองกระทำในสิ่งที่ควรจะมีการปรับปรุงอะตอมของโครงการทั้งหมดprojectB
แต่ฉันจะสร้างการผสานเดียวกระทำซึ่งรวมprojectA,projectBและกระทำท้องถิ่นของฉัน
ส่วนที่ยุ่งยากที่นี่เป็นที่นี่คือการผสานปลาหมึก (สามหัว) แต่projectBจะต้องมีการควบรวมกิจการกับกลยุทธ์ของทรีย่อย นี่คือสิ่งที่ฉันทำ:
# Merge projectA with the default strategy:
git merge projectA/master
# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master
ที่นี่ผู้เขียนใช้ a reset --hardและจากนั้นread-treeเพื่อเรียกคืนสิ่งที่การผสานสองครั้งแรกได้ทำกับแผนผังการทำงานและดัชนี แต่นั่นคือสิ่งที่reset --softสามารถช่วยได้:
ฉันจะทำซ้ำการผสานทั้งสองนี้ซึ่งได้ผลเช่นแผนผังการทำงานและดัชนีของฉันคือ สบายดี แต่ไม่ต้องบันทึกการกระทำทั้งสองนี้?
# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}
ตอนนี้เราสามารถดำเนินการแก้ปัญหาของ Tomas ต่อได้:
# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD
# And finally do the commit:
git commit
ดังนั้นทุกครั้ง:
- คุณพอใจกับสิ่งที่คุณจบลง (ในแง่ของโครงสร้างการทำงานและดัชนี)
- คุณไม่พอใจกับการกระทำทั้งหมดที่พาคุณไปที่นั่น:
git reset --soft คือคำตอบ
git reset --soft: stackoverflow.com/questions/6869705/…