ใช้การเปลี่ยนแปลงจาก branch b เป็น a โดยไม่ต้องรวมหรือเพิ่มคอมมิต


89

สถานการณ์ของฉันคือฉันมีสาขาหนึ่งที่ฉันได้ทำการปรับปรุงครั้งใหญ่ในกระบวนการสร้าง (สาขา A) และอีกสาขาหนึ่งฉันกำลังทำงานกับฟีเจอร์ที่ไม่เกี่ยวข้อง (สาขา B) ตอนนี้เมื่อฉันแฮ็คที่สาขา B ฉันต้องการดึงสิ่งที่ฉันเขียนในสาขา A เพราะฉันต้องการสร้างที่เร็วและง่ายขึ้น อย่างไรก็ตามฉันไม่ต้องการ "สร้างมลพิษ" ให้กับสาขา B ของฉันเพียงแค่เพิ่มการเปลี่ยนแปลงจาก branchA เป็นการเปลี่ยนแปลงที่ไม่มีการจัดเตรียม

สิ่งที่ฉันได้ลอง (เมื่อยืนอยู่บน branchB):

git merge --no-commit branchA

ใช้ไม่ได้เพราะทำให้คุณอยู่ในการผสาน ถ้าไม่เป็นเช่นนั้นมันจะสมบูรณ์แบบ

git checkout branchA -- .

ไม่ได้ผลเนื่องจากใช้การเปลี่ยนแปลงระหว่าง branchA..branchB และไม่ใช่การเปลี่ยนแปลง master..branchA

มีอะไรอีกไหม

แก้ไข: ใช่การเปลี่ยนแปลงในสาขา A มีข้อผูกพัน ในตัวอย่างนี้มีเพียงสาขาเดียวที่มีการปรับปรุงบิลด์ แต่อาจมีมากถึง N สาขาที่มีการปรับปรุงบิลด์ที่ฉันต้องการใช้ในขณะที่ทำงานกับสาขาฟีเจอร์


การเปลี่ยนแปลงใน A มีความมุ่งมั่นแล้วหรือยัง?
Theolodis

คำตอบ:


155

ฉันต้องทำบางอย่างที่คล้ายกันและสามารถแก้ไขได้โดยการเพิ่ม--squashคำสั่งผสาน

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes

4
สิ่งนี้ควรมีคำอธิบายเกี่ยวกับสิ่งที่ทำเช่นกัน ขั้นตอนความแตกต่างของการเปลี่ยนแปลงจาก branchA ไปยังสาขาปัจจุบันของคุณ
KareemElashmawy

สมมติว่าฉันเพิ่งรวมรหัสจาก branchA เป็น master แต่ฉันลืมบางอย่างและต้องการเพิ่มโค้ด / การเปลี่ยนแปลงอีกสองสามอย่างในการผสานรวมนี้โดยไม่แสดงเป็นการผสานรวมอื่นในประวัติคอมไพล์ วิธีนี้จะใช้ได้ไหม
Sushmit Sagar

@Sushmit ฉันคิดว่าคุณสามารถทำได้git commit —amendและมันจะต่อท้ายการเปลี่ยนแปลงใหม่ในการกระทำครั้งสุดท้ายฉันแค่ไม่แน่ใจว่ามันใช้ได้ผลหรือไม่
guilffer

1
ฉันไม่คิดว่า - ไม่จำเป็นต้องมีข้อผูกมัดที่นี่? ควรเป็นค่าเริ่มต้น
Petter

11

cherry-pick -n ควรทำในสิ่งที่คุณต้องการ แต่ฉันไม่แน่ใจว่าทำไมคุณถึงต้องการให้การปรับปรุงบิวด์เป็นการเปลี่ยนแปลงที่ไม่มีขั้นตอนซึ่งทำให้หลาย ๆ อย่างยากขึ้น (เช่นการรวมการเปลี่ยนแปลงอื่น ๆ กับไฟล์ที่แก้ไขหรือการเปลี่ยนอะไรก็ตาม)

ในตัวอย่างนี้มีเพียงสาขาเดียวที่มีการปรับปรุงบิลด์ แต่อาจมีมากถึง N สาขาที่มีการปรับปรุงบิลด์ที่ฉันต้องการใช้ในขณะที่ทำงานกับสาขาฟีเจอร์

ในกรณีนั้นฉันจะสร้างสาขาใหม่ C ซึ่งคุณรวมจากทั้ง A และ B (และสาขาอื่น ๆ ที่มีการปรับปรุงการสร้าง) ยอมรับการเปลี่ยนแปลงในสาขาคุณลักษณะ B จากนั้นรวมเข้ากับสาขา C ซึ่งตอนนี้มีการปรับปรุงโครงสร้างและการเปลี่ยนแปลงสาขาคุณลักษณะเพื่อให้คุณสามารถทดสอบร่วมกันได้ หากคุณต้องการเปลี่ยนแปลงเพิ่มเติมให้ทำในสาขาที่เหมาะสมไม่ใช่ C จากนั้นรวมเป็น C ดังนั้นอย่าเปลี่ยนแปลงอะไรในสาขา C เพียงแค่ใช้เพื่อรวมการเปลี่ยนแปลงจากสาขาอื่น

นั่นหมายความว่าคุณสามารถใช้คุณสมบัติทั้งหมดของ Git ในสาขา C แทนที่จะเล่นกลการเปลี่ยนแปลงที่ไม่ได้ผูกมัดในทรีสกปรก


UseCase for cherry-pick -n: ฉันสร้างสำเนาโค้ดที่ใช้งานได้โดยเพิ่มหลาย ๆ อย่างลงในที่สุ่ม ตอนนี้ฉันต้องการทำความสะอาดโค้ดของฉันก่อนที่จะยอมรับสาขาของฟีเจอร์นี้ ดังนั้นฉันจึงเปลี่ยนไปใช้สาขาชั่วคราวทำการเปลี่ยนแปลงทั้งหมด กลับมาที่สาขาคุณลักษณะcherry-pickที่คอมมิต มีวิธีที่ดีกว่านี้หรือไม่?
Tejas Kale

6

คุณควรจะเลือกคอมมิชชันของเชอร์รี่ได้ ( -nเพื่อหลีกเลี่ยงการกระทำในทันที)


-n ไม่ได้ผล มันบอกว่าไม่มีตัวเลือก -m เนื่องจากการเลือกเชอร์รี่ล้มเหลว
Alejandro Sanz Díaz

5

ฉันไม่แน่ใจ 100% ว่าฉันเข้าใจมันอย่างชัดเจน แต่ในกรณีของฉันฉันเพิ่งสร้างแพตช์ต่างระหว่างสาขาแล้วใช้เส้นทางนี้กับสาขา B

สาขาภายใน A:

 git diff branchA..branchB > patch.diff
 git apply patch.diff

4

ฉันไม่แน่ใจว่าเข้าใจข้อกำหนดของคุณ

git reset HEAD~1คุณสามารถเรียกใช้การผสานแล้วโทร


ลำดับต่อไปนี้ควรเล่นทุกกระทำระหว่างmasterและด้านบนของbranchA branchBคอมมิตที่ใช้ไปแล้วbranchBจะถูกข้ามไป

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip

นั่นเป็นการเพิ่มไฟล์ลงในพื้นที่การแสดงละครของ git ซึ่งฉันไม่ต้องการ นอกจากนี้ดูเหมือนว่าจะทำงานได้ดีก็ต่อเมื่อสาขาทั้งหมดแตกแขนงจากการกระทำเดียวกันในสาขาหลัก มิฉะนั้นความแตกต่างที่ไม่ได้อยู่ใน range master..branchA จะถูกนำมาใช้
Björn Lindqvist

@ BjörnLindqvist: ลบ--softตัวเลือกถ้าคุณไม่ต้องการให้มีการเปลี่ยนแปลงในพื้นที่จัดฉาก คุณช่วยวาดกราฟวิธีการตั้งค่าสาขาของคุณได้ไหม
LeGEC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.