@ Mark Longair ตอกหมุดในคำตอบของเขาที่นี่แต่ฉันต้องการเพิ่มข้อมูลเชิงลึกเพิ่มเติม
ที่เกี่ยวข้องและตอบคำถามของวิธีการทำลายคำขอการดึงขนาดใหญ่ (PR) โดยเฉพาะอย่างยิ่งเมื่อการโจมตีของคุณไม่สามารถทำได้เนื่องจากการรวมต้นแบบอย่างน้อยหนึ่งอย่างเข้ากับ feature_branch ของคุณ
สถานการณ์ของฉัน:
ฉันสร้างรายได้feature_branch30 ครั้งและเปิดคำขอดึง (PR) บน GitHub เพื่อรวมเข้าmasterกับ สาขาmasterเปลี่ยนไปเป็นตันใต้ฉันและได้รับ 200 คอมมิชชันที่ฉันfeature_branchไม่มี เพื่อแก้ไขข้อขัดแย้งที่ฉันทำgit checkout feature_branchและgit merge masterรวมmasterการเปลี่ยนแปลงของฉันเข้าfeature_branchด้วยกัน ฉันเลือกที่จะmergeเป็นมากกว่าrebaseอาจารย์คนล่าสุดดังนั้นฉันจะต้องแก้ไขข้อขัดแย้งเพียงครั้งเดียวแทนที่จะเป็น 30 ครั้ง (สำหรับแต่ละครั้งที่ฉันทำ) ฉันไม่ต้องการที่จะสควอช 30 คอมมิชชันของฉันเป็น 1 ก่อนจากนั้นรีบูตเข้าสู่ล่าสุดmasterเพราะอาจทำให้ GitHub ตรวจสอบประวัติความคิดเห็นใน PR ได้ ดังนั้นฉันจึงรวมต้นแบบเข้ากับสาขาคุณลักษณะของฉันและแก้ไขข้อขัดแย้ง 1 ครั้ง ทุกอย่างเป็นไปด้วยดี อย่างไรก็ตามการประชาสัมพันธ์ของฉันใหญ่เกินไปสำหรับเพื่อนร่วมงานของฉันที่จะตรวจสอบ ฉันต้องการแยกมันออก ฉันไปสควอช 30 คอมมิชชันและ OH NO! พวกเขาอยู่ที่ไหน? พวกเขาทั้งหมดผสมกับmaster's 200 กระทำที่ผ่านมาตอนนี้เพราะผมรวมmasterเข้าของฉันfeature_branch! ฉันจะทำยังไงดี?
git cherryการใช้งานในกรณีที่คุณต้องการพยายามgit cherry-pickทำคอมมิท:
git cherry เพื่อช่วยเหลือ (เรียงลำดับ)!
หากต้องการดูข้อผูกพันทั้งหมดที่อยู่ในfeature_branchแต่ไม่masterสามารถทำได้:
git checkout feature_branch
git cherry master
หรือฉันสามารถตรวจสอบการกระทำจากสาขาใดก็ได้โดยไม่ต้องทำให้มั่นใจว่าฉันจะมาfeature_branchเป็นคนแรกโดยทำgit cherry [upstream_branch] [feature_branch]เช่นนี้ อีกครั้งการตรวจสอบนี้เพื่อดูการกระทำที่มีอยู่feature_branchแต่ไม่ได้อยู่ในupstream_branch( masterในกรณีนี้):
git cherry master feature_branch
การเพิ่ม-vยังแสดงบรรทัดหัวเรื่องข้อความการกระทำ:
git cherry -v master
การไพพ์ไปที่ "การนับจำนวนคำ" "-lines" ( wc -l) นับจำนวนการคอมมิตที่มี:
git cherry master | wc -l
คุณสามารถเปรียบเทียบจำนวนนี้กับจำนวนการกระทำที่แสดงใน GithHub PR ของคุณเพื่อให้รู้สึกดีขึ้นเกี่ยวกับการรู้ว่าใช้งานได้git cherryจริง นอกจากนี้คุณยังสามารถเปรียบเทียบ git hash ทีละรายการและดูว่าตรงกันระหว่างgit cherryและ GitHub โปรดทราบว่าgit cherryจะไม่นับรวมการกระทำที่คุณรวมmasterเข้าด้วยกันfeature_branchแต่จะเป็น GitHub ดังนั้นถ้าคุณจะเห็นความแตกต่างเล็ก ๆ ในการนับค้นหา GitHub ประชาสัมพันธ์กระทำหน้าสำหรับคำว่า "ผสาน" git cherryและคุณอาจจะเห็นว่าเป็นผู้กระทำผิดที่ไม่ได้แสดงใน Ex: กระทำบรรดาศักดิ์"สาขาผสาน 'ต้นแบบ' ลง feature_branch"จะปรากฏขึ้นใน GitHub ประชาสัมพันธ์ git cherry master feature_branchแต่ไม่เมื่อคุณเรียกใช้ นี่เป็นสิ่งที่ดีและคาดหวัง
ดังนั้นตอนนี้ฉันมีวิธีการค้นหาสิ่งที่แตกต่างฉันอาจต้องการเชอร์รี่เลือกลงบนสาขาฟีเจอร์ใหม่เพื่อแยกความแตกต่างนี้: ฉันสามารถใช้git cherry master feature_branchในพื้นที่หรือดูข้อผูกพันใน GitHub PR
วิธีการสควอชสามารถช่วยได้ - หากเราสามารถสควอชเท่านั้น
ทางเลือกอย่างไรจะแยกความแตกต่างใหญ่ของฉันคือการสควอชทั้งหมด 30 กระทำของฉันเป็นหนึ่งในแพทช์ที่ลงในสาขาคุณลักษณะใหม่นุ่มรีเซ็ตแพทช์กระทำแล้วใช้git guiการเพิ่มไฟล์ชิ้นโดยไฟล์ก้อนโดยก้อนหรือ ทีละบรรทัด เมื่อฉันได้รับคุณสมบัติย่อยหนึ่งฉันสามารถกระทำสิ่งที่ฉันได้เพิ่มจากนั้นตรวจสอบสาขาใหม่เพิ่มมากขึ้นกระทำยืนยันตรวจสอบสาขาใหม่ ฯลฯ จนกว่าฉันจะมีคุณสมบัติใหญ่ของฉันแยกออกเป็นคุณสมบัติย่อยหลายอย่าง . ปัญหาคือว่า 30 คอมมิชชันของฉันถูกรวมกับอีก 200 คอมมิทจากคนอื่นเนื่องจากฉันgit merge masterเป็นของฉันfeature_branchดังนั้นการรีบูตจึงเป็นไปไม่ได้เพราะฉันต้องร่อนผ่าน 230 คอมมิตเพื่อสั่งซื้อใหม่และสควอช 30 คอมมิชชันของฉัน
วิธีใช้ไฟล์ปะแก้แทนการบีบที่ง่ายกว่ามาก:
การแก้ไขคือการรับไฟล์ปะแก้ที่มี "สควอช - เทียบเท่า" จากทั้งหมด 30 คอมมิทของฉันทำการแพทช์มันลงบนทางแยกใหม่ของmaster(ฟีเจอร์ย่อยสาขาใหม่) และทำงานจากที่นั่นดังนี้:
git checkout feature_branch
# ensure I have the latest changes from master merged into feature_branch
git merge master
# Obtain a patch file, which is the equivalent of a squash of my 30 commits into 1 commit:
git diff master..feature_branch > ~/mypatch.patch
git checkout master
# Create a new, sub-feature branch
git checkout -b feature_branch2
# Patch the 30 commit patch file onto it:
git apply ~/mypatch.patch
ตอนนี้ฉันมีโปรแกรมปะแก้ 30 รายการของฉันทั้งหมดที่นำไปใช้ในเครื่อง แต่ไม่มีสเตจและไม่มีข้อผูกมัด
ตอนนี้ใช้git guiเพื่อเพิ่มไฟล์ chunks และ / หรือบรรทัดและแยก PR ใหญ่ของคุณหรือ "diff":
โปรดทราบว่าถ้าคุณไม่ได้คุณสามารถติดตั้งในอูบุนตูกับgit guisudo apt install git-gui
ตอนนี้ฉันสามารถเรียกใช้git guiและเริ่มเพิ่มไฟล์ chunks และ / หรือบรรทัด (โดยการคลิกขวาในโปรแกรม git GUI) และแยกการกระทำของฟีเจอร์ 30 คอมมิตเป็นสาขาย่อยตามที่อธิบายไว้ด้านบนเพิ่มซ้ำยอมรับแล้วฟอร์กกิ้ง สาขาฟีเจอร์ใหม่และทำซ้ำรอบนี้จนกว่าการเปลี่ยนแปลงทั้งหมดจะถูกเพิ่มไปยังฟีเจอร์ย่อยและฟีเจอร์ 30 คอมมิตของฉันก็แยกออกเป็นฟีเจอร์ย่อย 3 หรือ 4 ฉันสามารถเปิดการประชาสัมพันธ์แยกต่างหากสำหรับฟีเจอร์ย่อยเหล่านี้ได้ในตอนนี้และพวกเขาจะสามารถตรวจสอบได้ง่ายขึ้น
อ้างอิง:
- สร้างไฟล์ patch หรือ diff จาก git repository และใช้กับ git repository อื่น