วิธีการดูที่มุ่งมั่นในสาขาหนึ่งไม่ได้อยู่ในอื่น ๆ ?


180

ฉันมีสองสาขาdevelและnext. ใน devel ฉันมีจำนวนการคอมมิทที่มากหรือน้อย nextบางส่วนของการกระทำที่มีเชอร์รี่เลือกใน develนอกจากนี้ผมเพิ่มกระทำบางอย่างที่จะต่อไปที่มีการรวม

ตอนนี้ผมต้องการที่จะเห็นสิ่งที่ขาดหายไปในเพื่อให้สามารถทดสอบการเปลี่ยนแปลงในรายละเอียดก่อนที่จะนำพวกเขาไปnext nextคำถามของฉันคือตอนนี้ฉันจะดูได้อย่างไรว่าคอมมิทใดอยู่ในคอมdevelมิชชันต่อไป



ชื่อของคุณเป็นเรื่องเข้าใจผิดเล็กน้อยเนื่องจากสิ่งที่คุณต้องการเปรียบเทียบคือเคล็ดลับของทั้งสองสาขา และฉันมาที่นี่เพื่อหาทางออกที่สองเปรียบเทียบความแตกต่าง (แตกต่าง) ของสองสาขา
thebugfinder

ทำซ้ำหรือไม่: stackoverflow.com/questions/1710894/…
reinierpost

คำตอบ:


210

คำสั่งที่ใช้น้อยgit cherryแสดงให้เห็นถึงความมุ่งมั่นที่ยังไม่ได้รับเชอร์รี่ เอกสารสำหรับgit cherryอยู่ที่นี่แต่ในระยะสั้นคุณควรทำสิ่งต่อไปนี้

git checkout devel
git cherry next

... และดูผลลัพธ์แบบนี้:

+ 492508acab7b454eee8b805f8ba906056eede0ff
- 5ceb5a9077ddb9e78b1e8f24bfc70e674c627949
+ b4459544c000f4d51d1ec23f279d9cdb19c1d32b
+ b6ce3b78e938644a293b2dd2a15b2fecb1b54cd9

กระทำที่ขึ้นต้นด้วย+จะเป็นคนที่คุณยังไม่ได้nextเชอร์รี่เลือกเข้าไป ในกรณีนี้ฉันจะเลือกเฉพาะเชอร์รี่ที่เลือกแล้วจนถึงตอนนี้ คุณอาจต้องการเพิ่ม-vพารามิเตอร์ลงในgit cherryคำสั่งเพื่อให้ยังส่งออกบรรทัดหัวเรื่องของแต่ละกระทำ


เยี่ยมมากสิ่งที่ฉันต้องการ มันคงจะดีถ้าได้คำอธิบายสั้น ๆ เกี่ยวกับการทดสอบ แต่ฉันสามารถเขียนสคริปต์นี้ได้
Sascha Effert

29
คุณไม่จำเป็นต้องคุณก็สามารถทำได้git checkout devel git cherry next devel
Robin Winslow

21
“อาจต้องการเพิ่ม-v ? เชอร์รี่ได้โดยไม่ต้อง-vเป็นเหมือนการได้โดยไม่ต้องls ; -J-la
Slipp D. Thompson

1
และคุณจะไม่รู้วิธีที่cherryจะทำเครื่องหมายหรือแยกการกระทำที่เทียบเท่าคุณได้ไหม? cherryดูเหมือนว่าคำสั่งการวางท่อประปา แต่ไม่ปรากฏตัวเลือกมากมาย (ดูเหมือนจะ) สำหรับสิ่งที่ฉันกำลังอยู่ในขณะนี้git cherryให้ผลบวกกับฉัน แต่ @ sehe นั้นgit log --cherry-pickไม่รวมการคอมมิทที่เลือก / รีบูตก่อนหน้านี้
Slipp D. Thompson

เอกสารแสดงให้เห็นตัวอย่างคอนกรีต: git-scm.com/docs/git-cherry#_concrete_example
AMS

107

นอกจากนี้คุณสามารถใช้

git log --left-right --graph --cherry-pick --oneline devel...next

เพื่อรับรายการที่ดีของการกระทำที่แตกต่างกันจริงไม่ได้แชร์ระหว่างสาขา

คำผ่าตัดคือ --cherry-pick

--cherry-pick

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

อัปเดตตามที่กล่าวไว้ในความคิดเห็น git รุ่นล่าสุดได้เพิ่ม--cherry-mark:

--cherry-mark

เช่น --cherry-pick (ดูด้านล่าง) แต่ทำเครื่องหมายการกระทำที่เทียบเท่ากับ = แทนที่จะละเว้นพวกเขาและรายการที่ไม่เท่าเทียมกับ +


1
สิ่งนี้ไม่ได้ผลสำหรับฉัน git รุ่นของฉันไม่ทราบ - หนึ่งบรรทัดดังนั้นฉันจึงลบออก จากนั้นฉันก็ต้องแลกเปลี่ยนนักพัฒนาและต่อไปและมันก็ใช้ได้ ดีมาก!
Sascha Effert

@SaschaEffert: คุณไม่จำเป็นต้องเปลี่ยน devel และถัดไป (สังเกตว่ามีจุดสามจุดไม่ใช่สอง) ที่กล่าวว่าสิ่งต่าง ๆ อาจแตกต่างกันถ้าคุณใช้git รุ่นเก่า (?) แต่ในกรณีนี้คุณควรได้รับข้อผิดพลาดการตรวจสอบซ้ำในสามจุด
sehe

2
เพื่อความสนุกสนานผมทำงานออกมาว่า '...' (ความแตกต่างสมมาตร) ไวยากรณ์ Rev-แจงถูกเพิ่มเข้ามาในกรกฎาคม 2006และเอกสารประกอบให้มันได้รับการปรับปรุงในมิถุนายน 2008 ความสุขของโอเพ่นซอร์ส!
sehe

1
'gls - ผู้ปกครองคนแรก - เครื่องหมาย -cherry - ด้านซ้ายเท่านั้นพัฒนา ... ถัดไป' โดยที่ gls คือชื่อแทนบันทึกการคอมไพล์ของฉันที่มีการจัดรูปแบบทั้งหมด เครื่องหมายเชอร์รี่แสดงให้เห็นว่าทั้งเชอร์รี่เลือกและไม่ได้เลือกเชอร์รี่มุ่งมั่นที่จะพัฒนา แต่ทำเครื่องหมายพวกเขาแตกต่างกัน
angularsen

1
เพิ่ม - ไม่มีการรวมกันอาจจะดีกว่า
MervynYang

51

คุณอาจลองทำชุดย่อยบันทึก git:

git log --oneline devel ^next

4
นี่คือทางออกที่ดีที่สุดในความคิดของฉัน (@ sehe ของคำตอบนี้ยังแสดงให้เห็นว่ากระทำในครั้งต่อไปที่ไม่ได้อยู่ใน devel - ในบริบทของ OP มีไม่มี แต่ในเหมืองมี - ใช้--left-onlyจะได้รับดีกว่า) อย่างไรก็ตามสิ่งนี้สามารถปรับปรุงได้เล็กน้อยโดยการเพิ่ม--no-mergesการละเว้นการคอมมิชชันใด ๆ (เช่นถ้ามีการรวมฟีเจอร์หรือสาขาโปรแกรมแก้ไขด่วน (แยก) ในการพัฒนาและต่อไป แน่นอนว่าการพูดอย่างเคร่งครัดการแก้ไขข้อขัดแย้งในการรวมกันอาจสร้างความแตกต่างอื่น ๆ แต่นั่นไม่ใช่กรณี --no-mergesตัวเลือกที่สามารถเป็นประโยชน์นำไปใช้กับคำตอบอื่น ๆ ได้เป็นอย่างดี
Alex Dupuy

27

เกี่ยวกับ

git log next..devel

ผลลัพธ์นั้นคล้ายกับคำตอบของ Byran (คำสั่งที่แตกต่างกัน) แต่คำตอบของเราทั้งคู่จะให้คำมั่นสัญญาที่แตกต่างกันระหว่างกิ่งก้านสาขาเพียงแค่แสดงสิ่งที่อยู่ในสาขาเดียวและไม่ใช่สาขาอื่น


4
คุณสามารถละเว้นสาขาที่สองได้หากคุณอยู่ในสาขานั้น iegit log next..
jmaxyz

btw 'git log next..devel' แตกต่างจาก 'git log devel..next'
Eugene Kaurov

1

ในการรับรายการการคอมมิทที่ไม่ได้รวมอยู่ในสาขาการเปิดตัว (ถัดไป) คุณสามารถใช้:

git rev-list --reverse --pretty="TO_TEST %h (<%ae>) %s" --cherry-pick --right-only origin/release_branch...origin/development_branch | grep "^TO_TEST " > NotIntegratedYet.txt

ตรวจสอบgit-rev-listสำหรับข้อมูลเพิ่มเติม


คำสั่งของคำตอบนี้ขาดสาขาที่เป็นปัญหาเช่นnext...devel
Alex Dupuy

@AlexDupuy Yah มันเป็นคำตอบครึ่งสวย ตั้งแต่มันยังไม่ใช่คำตอบที่ง่ายและไม่ได้อธิบายว่าทำไมวิธีนี้จะดีกว่าผม-1ไอเอ็นจีมัน
Slipp D. Thompson

-1

@ 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 ฉันสามารถเปิดการประชาสัมพันธ์แยกต่างหากสำหรับฟีเจอร์ย่อยเหล่านี้ได้ในตอนนี้และพวกเขาจะสามารถตรวจสอบได้ง่ายขึ้น

อ้างอิง:

  1. สร้างไฟล์ patch หรือ diff จาก git repository และใช้กับ git repository อื่น

ฉันต้องการอ้างอิงคำตอบนี้วันนี้ แต่ไม่สามารถค้นหาได้อย่างรวดเร็ว โชคดีที่มันมี downvote เพื่อช่วยให้ฉันค้นหาได้ง่ายขึ้นดังนั้นการคลิกที่ไอคอนถ้วยรางวัลที่มุมบนขวาของหน้าจอก็แสดงให้เห็นว่าฉันเพิ่งแพ้ 2 คะแนนและคลิกที่ทำให้ฉันกลับมาที่นี่ได้ ตอนนี้อ้างอิงคำตอบของฉันเองที่นี่! หวังว่าฉันจะไม่ได้รับ downvotes อีกต่อไป แต่สำหรับ downvoter ขอบคุณสำหรับบริการที่ช่วยฉันโดยไม่ได้ตั้งใจ!
Gabriel Staples
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.