ฉันใหม่กับคอมไพล์และฉันพยายามที่จะเข้าใจความแตกต่างระหว่างสควอชและการรีบูต ตามที่ฉันเข้าใจแล้วว่าคุณเล่นสควอชเมื่อทำการ rebase
ฉันใหม่กับคอมไพล์และฉันพยายามที่จะเข้าใจความแตกต่างระหว่างสควอชและการรีบูต ตามที่ฉันเข้าใจแล้วว่าคุณเล่นสควอชเมื่อทำการ rebase
คำตอบ:
ทั้งสองgit merge --squash
และgit rebase --interactive
สามารถผลิตกระทำ "แบน"
แต่พวกเขาตอบสนองวัตถุประสงค์ที่แตกต่าง
จะสร้างการส่งข้อมูลบีบอัดบนสาขาปลายทางโดยไม่ทำเครื่องหมายความสัมพันธ์ผสานใด ๆ
(หมายเหตุ: มันไม่ได้สร้างความมุ่งมั่นทันที: คุณต้องการเพิ่มเติมgit commit -m "squash branch"
)
สิ่งนี้มีประโยชน์ถ้าคุณต้องการที่จะทิ้งสาขาของแหล่งที่มาอย่างสมบูรณ์ไปจาก (schema นำมาจากคำถาม SO ):
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
ถึง:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
แล้วลบtmp
สาขา
หมายเหตุ: git merge
มี--commit
ตัวเลือก--squash
แต่ก็ไม่สามารถนำมาใช้กับ มันเป็นไปไม่ได้ที่จะใช้--commit
และ--squash
รวมกัน
ตั้งแต่ Git 2.22.1 (ไตรมาสที่ 3 ปี 2019) ความไม่ลงรอยกันนี้ทำให้ชัดเจน:
ดูกระทำ 1d14d0c (24 พฤษภาคม 2019) โดยVishal Verma (reloadbrain
)
(ผสานโดยJunio C Hamano - gitster
-ในการกระทำ 33f2790 , 25 กรกฎาคม 2019)
merge
: ปฏิเสธ--commit
ด้วย--squash
ก่อนหน้านี้เมื่อ
--squash
มีการให้บริการ 'option_commit
' ก็ถูกส่งไปอย่างเงียบ ๆ สิ่งนี้น่าประหลาดใจสำหรับผู้ใช้ที่พยายามจะแทนที่พฤติกรรมที่ไม่ส่งมอบสควอชโดยใช้--commit
อย่างชัดเจน
git/git
builtin/merge.c#cmd_merge()
ตอนนี้รวมถึง:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
ซ้ำบางส่วนหรือทั้งหมดของคุณมุ่งมั่นในฐานใหม่ช่วยให้คุณสควอช (หรือเมื่อเร็ว ๆ นี้ "แก้ไข" ดูคำถามนี้SO ) ไปที่:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
หากคุณเลือกที่จะสควอชกระทำทั้งหมดของtmp
(แต่ตรงกันข้ามmerge --squash
คุณสามารถเลือกที่จะเล่นซ้ำบางส่วนและบีบคนอื่น ๆ )
ดังนั้นความแตกต่างคือ:
squash
ไม่ได้แตะสาขาต้นทางของคุณ ( tmp
ที่นี่) และสร้างการคอมมิทเดียวที่คุณต้องการrebase
ช่วยให้คุณดำเนินการในสาขาต้นทางเดียวกัน (ยังtmp
) ด้วย:
tmp
กระทำที่ถูกแบน
G
จะได้เป็นตัวแทนของเนื้อหาเดียวกันกว่าเพราะการเปลี่ยนแปลงการแนะนำให้รู้จักg
X
git merge --no-ff temp
แทนคุณgit merge --squash temp
ก็จะได้รับประวัติของเมสไซเออร์ แต่คุณสามารถทำสิ่งต่างgit revert e
ๆ ได้ง่ายขึ้น มันเป็นเรื่องยุ่ง แต่ประวัติศาสตร์ที่ซื่อสัตย์และเป็นประโยชน์และสาขาหลักยังคงสะอาดอยู่พอสมควร
git bisect
หรือgit blame
เมื่อใช้บ่อยเกินไป (เช่นในgit pull --no-ff
: stackoverflow.com/questions/12798767/ … ) ยังไม่มีวิธีการหนึ่งซึ่งเป็นเหตุผลที่บทความนี้อธิบายถึงสามวิธี ( stackoverflow.com/questions/9107861/ … )
การรวมกระทำ: รักษาทุกการกระทำในสาขาของคุณและแทรกพวกเขาด้วยการกระทำในสาขาฐาน
ผสานสควอช: เก็บการเปลี่ยนแปลง แต่ละเว้นการกระทำของแต่ละบุคคลจากประวัติศาสตร์
Rebase: สิ่งนี้จะย้ายสาขาฟีเจอร์ทั้งหมดเพื่อเริ่มต้นที่ส่วนปลายของมาสเตอร์มาสเตอร์โดยรวมการคอมมิตใหม่ทั้งหมดในมาสเตอร์
เพิ่มเติมเกี่ยวกับที่นี่
ผสานสควอชผสานต้นไม้ (ลำดับของการคอมมิท) เป็นคอมมิทเดียว นั่นคือมันsquashesเปลี่ยนแปลงทั้งหมดที่ทำในnกระทำเป็นหนึ่งกระทำ
การรีบูตเป็นฐานอีกครั้งนั่นคือการเลือกฐานใหม่ (กระทำแม่) สำหรับต้นไม้ บางทีคำศัพท์ทางการค้าสำหรับเรื่องนี้ชัดเจนกว่า: พวกเขาเรียกมันว่าการปลูกถ่ายเพราะมันเป็นเพียงแค่: การเลือกพื้นดินใหม่ (การกระทำของผู้ปกครองราก) สำหรับต้นไม้
เมื่อทำการรีบูตแบบโต้ตอบคุณจะได้รับตัวเลือกให้เลือกสควอชเลือกแก้ไขหรือข้ามการคอมมิทที่คุณจะทำการรีบูต
หวังว่าชัดเจน!
เริ่มจากตัวอย่างต่อไปนี้:
ตอนนี้เรามี 3 ตัวเลือกในการรวมการเปลี่ยนแปลงของฟีเจอร์ย่อยเป็นสาขาหลัก :
การรวมกระทำ
จะเก็บประวัติการกระทำของสาขาฟีเจอร์ทั้งหมดและย้ายไปไว้ในสาขาหลัก
จะเพิ่มการกระทำจำลองแบบพิเศษ
Rebase และ merge
จะผนวกประวัติการคอมมิชชันทั้งหมดของฟีเจอร์ด้านหน้าสาขาหลัก
จะไม่เพิ่มการกระทำหลอกตา
สควอชและผสาน
จะจัดกลุ่มสาขาคุณลักษณะทั้งหมดให้เป็นหนึ่งการกระทำจากนั้นผนวกที่ด้านหน้าของสาขาหลัก
จะเพิ่มการกระทำจำลอง
คุณสามารถดูด้านล่างว่าสาขาหลักจะดูแลสาขาแต่ละสาขาอย่างไร
ในทุกกรณี:
เราได้อย่างปลอดภัยสามารถลบสาขาคุณลักษณะ
G
ถูกc--d--e--f--g
แบนด้วยกันไหม?