ฉันมีสองสาขาจากเจ้านายของฉัน:
- v2.1 : (รุ่น 2) ฉันทำงานมาหลายเดือนแล้ว
- wss : ที่ฉันสร้างเมื่อวานนี้เพื่อเพิ่มหนึ่งคุณลักษณะเฉพาะให้กับเจ้านายของฉัน (กำลังการผลิต)
มีวิธีการคัดลอกเมื่อวานนี้มุ่งมั่นจาก wss เพื่อ v2.1?
ฉันมีสองสาขาจากเจ้านายของฉัน:
มีวิธีการคัดลอกเมื่อวานนี้มุ่งมั่นจาก wss เพื่อ v2.1?
คำตอบ:
คุณควรมีเวิร์กโฟลว์ที่ให้คุณทำสิ่งนี้ได้ทั้งหมดโดยการรวม:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (wss)
ดังนั้นสิ่งที่คุณต้องทำคือการและgit checkout v2.1
git merge wss
หากมีเหตุผลบางอย่างที่คุณไม่สามารถทำเช่นนี้และคุณไม่สามารถใช้rebase คอมไพล์ที่จะย้ายสาขา WSS ของคุณไปยังสถานที่ที่เหมาะสมคำสั่งที่จะคว้าเดียวกระทำจากที่ไหนสักแห่งและใช้มันที่อื่น ๆ เป็นคอมไพล์เชอร์รี่เลือก git cherry-pick <SHA of commit to cherry-pick>
เพียงตรวจสอบสาขาที่คุณต้องการใช้มันในและวิ่ง
วิธีการรีบูตอาจช่วยคุณได้:
หากประวัติของคุณมีลักษณะเช่นนี้:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (v2-only) - x - x - x (wss)
คุณสามารถใช้git rebase --onto v2 v2-only wss
เพื่อย้าย wss โดยตรงไปยัง v2:
- x - x - x (v2) - x - x - x (v2.1)
|\
| x - x - x (v2-only)
\
x - x - x (wss)
จากนั้นคุณสามารถผสาน! หากคุณจริงๆจริงๆจริงๆไม่สามารถรับไปยังจุดที่คุณสามารถผสานคุณยังสามารถใช้ rebase อย่างมีประสิทธิภาพจะหลายเชอร์รี่หยิบในครั้งเดียว:
# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase
หมายเหตุ: เหตุผลที่ใช้งานพิเศษบางอย่างเพื่อทำสิ่งนี้คือมันกำลังสร้างการคอมมิตซ้ำในที่เก็บของคุณ นี่ไม่ใช่สิ่งที่ดีจริงๆ - จุดรวมของการแยกและการรวมที่ง่ายคือการสามารถทำทุกอย่างได้โดยการคอมมิชชันที่เดียวและรวมเข้ากับทุกที่ที่ต้องการ การทำซ้ำหมายถึงเจตนาที่จะไม่รวมสาขาทั้งสอง (ถ้าคุณตัดสินใจว่าคุณต้องการภายหลังคุณจะได้รับความขัดแย้ง)
git-svn-id
อ้างอิงที่ไม่ถูกต้องก่อนนำdcommit
กลับมาอีกครั้ง แม้ว่าฉันอาจจะได้ออกจากขั้นตอนเชอร์รี่เลือกและเพียงใช้ rebase ด้วยตัวเอง
ใช้
git cherry-pick <commit>
เพื่อนำไปใช้<commit>
ที่คุณสาขาในปัจจุบัน
ฉันเองอาจจะตรวจสอบความมุ่งมั่นที่ฉันเลือกgitk
และเชอร์รี่เลือกพวกเขาด้วยการคลิกขวาที่รายการส่งมอบตรงนั้นแทน
หากคุณต้องการอัตโนมัติมากขึ้น (ด้วยอันตรายทั้งหมด) และสมมติว่ากระทำทั้งหมดตั้งแต่เมื่อวานเกิดขึ้นกับ wss คุณสามารถสร้างรายการการกระทำโดยใช้git log
( --pretty
โดย Jefromi แนะนำ)
git log --reverse --since=yesterday --pretty=%H
ดังนั้นทุกอย่างเข้าด้วยกันสมมติว่าคุณใช้ bash
for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
git cherry-pick $commit
done
หากมีบางอย่างผิดพลาดที่นี่ (มีศักยภาพมากมาย) คุณกำลังมีปัญหาเนื่องจากการดำเนินการกับการชำระเงินสดดังนั้นควรเลือกใช้เชอร์รี่หรือหยิบใช้การรีบูทตามที่ Jefromi แนะนำ
git rebase
ในคำตอบของฉันนั้นแข็งแกร่งกว่า โดยเฉพาะอย่างยิ่งการใช้ลูป for เช่นนี้หากหนึ่งใน cherry-picks ล้มเหลวมันจะยังคงพยายามทำส่วนที่เหลือทั้งหมด นี่คือ ... ไม่ดีมากสมมุติว่า
git
คำตอบที่ง่ายและตรงไปตรงมาแก้ปัญหาแทนที่จะเดินผ่านความซับซ้อนของคอมไพล์เพื่อพิสูจน์ว่าผู้ตอบรู้ได้ดีเพียงใด
git cherry-pick
: ใช้การเปลี่ยนแปลงที่นำเสนอโดยบางคอมมิทที่มีอยู่
สมมติว่าเรามีสาขาAพร้อม (X, Y, Z) เราจำเป็นต้องเพิ่มกระทำเหล่านี้ไปยังสาขาB เราจะใช้การcherry-pick
ดำเนินการ
เมื่อเราใช้cherry-pick
เราควรเพิ่มกระทำในสาขาBในลำดับเดียวกับที่กระทำจะปรากฏในสาขา
cherry-pick สนับสนุนช่วงของการคอมมิต แต่ถ้าคุณรวมการคอมมิทในช่วงนั้นมันจะซับซ้อนมากขึ้น
git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z
ตัวอย่างของเวิร์กโฟลว์:
เราสามารถใช้cherry-pick
กับตัวเลือก
-e or - edit : ด้วยตัวเลือกนี้ git cherry-pick จะช่วยให้คุณแก้ไขข้อความยืนยันก่อนที่จะส่งข้อมูล
-n หรือ - no-commit : โดยปกติคำสั่งจะสร้างลำดับของการคอมมิท แฟล็กนี้ใช้การเปลี่ยนแปลงที่จำเป็นในการเลือกเชอร์รี่แต่ละรายการที่กำหนดไว้กับแผนผังการทำงานของคุณและดัชนีโดยไม่ทำการคอมมิตใด ๆ นอกจากนี้เมื่อใช้ตัวเลือกนี้ดัชนีของคุณไม่จำเป็นต้องตรงกับ HEAD Cherry-pick ทำกับสถานะเริ่มต้นของดัชนีของคุณ
ที่นี่น่าสนใจบทความcherry-pick
เกี่ยวกับ
คุณสามารถสร้างโปรแกรมแก้ไขจากข้อผูกพันที่คุณต้องการคัดลอกและใช้โปรแกรมแก้ไขกับสาขาปลายทาง
git format-patch <revision range>
git am *.patch
checkout
สาขาอื่น
หรือถ้าคุณอยู่ด้านผู้ประกาศน้อยคุณสามารถทำสิ่งที่ฉันใช้ ใน deploy_template มีความมุ่งมั่นที่ฉันต้องการคัดลอกบนต้นแบบของฉันเป็นปรับใช้สาขา
git branch deploy deploy_template
git checkout deploy
git rebase master
สิ่งนี้จะสร้างการปรับใช้สาขาใหม่ (ฉันใช้ -f เพื่อเขียนทับการปรับใช้สาขาที่มีอยู่) บน deploy_template จากนั้นรีบูตสาขาใหม่นี้ไปยังมาสเตอร์
สำหรับกรณีที่เรียบง่ายเพียงแค่คัดลอกการกระทำล่าสุดจากสาขา wss ไปยัง v2.1 คุณสามารถคว้ารหัสการกระทำ ( git log --oneline | head -n 1
) และทำ:
git checkout v2.1
git merge <commit>
คำสั่ง cherry-pick สามารถอ่านรายการการคอมมิทจากอินพุตมาตรฐาน
คำสั่ง cherry-picks กระทำโดยผู้ใช้ John ที่มีอยู่ในสาขา "พัฒนา" แต่ไม่ได้อยู่ในสาขา "ปล่อย" และดำเนินการตามลำดับเวลา
git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin