ดึงคอมมิตทั้งหมดจากสาขาผลักคอมมิตที่ระบุไปยังอีกอัน


104

ฉันมีสาขาดังต่อไปนี้:

  • master
  • production

และสาขาระยะไกลต่อไปนี้:

  • origin/master
  • origin/production

ฉันมีสคริปต์ที่ดึงข้อมูลorigin/masterสาขาและได้รับความแตกต่างของสิ่งที่เปลี่ยนแปลงไปจากการดึงข้อมูลล่าสุดของฉัน ( log -p master..origin/master) origin/masterแล้วฉันจะผสาน

คอมมิตที่พบจะถูกพุชไปยังเครื่องมือตรวจสอบโค้ด

ฉันต้องการที่จะผลักดันกระทำที่ประสบความสำเร็จ - และมีเพียงพวกเขา - origin/productionสาขาการผลิตและแล้วแน่นอนไป

ฉันจะทำเช่นนั้นได้อย่างไร?

นอกจากนี้ฉันยังมีสคริปต์ 2 สคริปต์ที่เรียกใช้: สคริปต์ที่ดึงข้อมูลจากorigin/masterพุชส่งรายละเอียดไปยังฐานข้อมูลและรวมและอีกอันที่ฉันกำลังเขียนอยู่ซึ่งจะต้องผลักดันการกระทำที่ประสบความสำเร็จ

ฉันต้องการให้สคริปต์ 2 ตัวนี้ทำงานในขณะที่หลีกเลี่ยงเงื่อนไขการแข่งขัน / ผสานความขัดแย้ง เนื่องจากฉันต้องการทำงานกับความมุ่งมั่นที่ระบุเท่านั้นอาจมีวิธีกำจัดการกระทำที่ฉันไม่ต้องการ?


คำว่า 'การกระทำที่ประสบความสำเร็จ' หมายความว่าอย่างไร
bdonlan

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

คำตอบ:


319

คำที่ฉันคิดว่าคุณกำลังมองหาคือ "เชอร์รี่เลือก" นั่นคือรับคอมมิตเดียวจากตรงกลางของสาขาหนึ่งและเพิ่มไปยังอีกอันหนึ่ง:

A-----B------C
 \
  \
   D

กลายเป็น

A-----B------C
 \
  \
   D-----C'

แน่นอนสิ่งนี้สามารถทำได้ด้วยคำสั่ง git cherry-pick

ปัญหาของการคอมมิตนี้คือคอมไพล์พิจารณาว่าจะรวมประวัติทั้งหมดไว้ข้างหน้า - ดังนั้นหากคุณมีสามข้อตกลงดังนี้:

A-----B-----C

และพยายามกำจัด B คุณต้องสร้างคอมมิตใหม่ทั้งหมดดังนี้:

A-----------C'

โดยที่ C 'มี SHA-1 ID ที่แตกต่างกัน ในทำนองเดียวกันเชอร์รี่เลือกคอมมิตจากสาขาหนึ่งไปยังอีกสาขาหนึ่งโดยพื้นฐานแล้วเกี่ยวข้องกับการสร้างแพทช์จากนั้นนำไปใช้จึงสูญเสียประวัติในลักษณะนั้นเช่นกัน

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

บางทีวิธีที่ดีกว่าในการจัดการเรื่องนี้คือการมีกิ่งก้านสาขาที่ละเอียดกว่านี้ นั่นคือแทนที่จะมีแค่ 'master' มี 'featureA', 'bugfixB' ฯลฯ ทำการตรวจสอบโค้ดในทุกสาขาพร้อมกัน - โดยที่แต่ละสาขาจะเน้นไปที่การทำเพียงสิ่งเดียว - แล้วรวมสิ่งนั้นเข้าไป สาขาเดียวเมื่อคุณทำเสร็จแล้ว นี่คือเวิร์กโฟลว์ที่คอมไพล์ออกแบบมาสำหรับและสิ่งที่ดีที่ :)

หากคุณยืนยันที่จะจัดการกับสิ่งต่าง ๆ ในระดับของแพตช์คุณอาจต้องการดูที่ดาร์ค - มันถือว่าที่เก็บเป็นชุดของแพตช์ดังนั้นการเก็บเชอร์รี่จึงกลายเป็นการดำเนินการขั้นพื้นฐาน อย่างไรก็ตามสิ่งนี้มีชุดปัญหาของตัวเองเช่นช้ามาก :)

แก้ไข: นอกจากนี้ฉันไม่แน่ใจว่าฉันเข้าใจคำถามที่สองของคุณเกี่ยวกับสองสคริปต์ บางทีคุณอาจอธิบายรายละเอียดเพิ่มเติมอาจเป็นคำถามแยกต่างหากเพื่อป้องกันไม่ให้สิ่งต่างๆสับสน?


เกี่ยวกับคำถามที่สองของฉันฉันแค่ต้องการให้แน่ใจว่ากระบวนการดึงข้อมูลการเปลี่ยนแปลง (สคริปต์ที่ 1) และการส่งคอมมิตที่กำหนดไปยังตำแหน่งอื่น (สคริปต์ที่ 2) สามารถทำงานได้โดยไม่ต้องมีเงื่อนไขการแข่งขัน / การรวมความขัดแย้งในขณะที่ทำงานกับสาขา แต่ในที่สุดฉันเดาว่ามันไม่สำคัญเพราะฉันสามารถรวม 2 สคริปต์เข้าด้วยกันดังนั้น 2 สคริปต์จึงไม่ทำงานพร้อมกัน :)
Sylvain

10
"การเปลี่ยนรหัสคอมมิตนี้จะทำให้ฟังก์ชันการรวมคอมไพล์แตกไปจากสิ่งอื่น ๆ " @bdonlan โปรดอธิบายว่าฟังก์ชันการรวมถูกเบรกอย่างไร หมายความว่าอย่างไร?
Narek

5
@Narek เขาอาจหมายความว่าการเปลี่ยนแปลงในการกระทำ C 'จะปะทะกับการเปลี่ยนแปลงเดียวกันในการกระทำ C เมื่อคุณจะรวมสาขาที่สอง นั่นเป็นผลมาจากการเสียประวัติเบื้องหลังการกระทำ C.
bytefu

1
"และพยายามกำจัด B" - ทำไมคุณถึงพยายามกำจัด B?
d512

3
@ user1334007 เขาหมายความว่าก่อนหน้านี้เคยเป็น ABC เนื่องจากเชอร์รี่เลือก C สาขาของคุณคือ AD-C 'ซึ่งไม่มี' B 'อีกต่อไป
AnneTheAgile

1

ฉันรู้ว่านี่เป็นคำถามเก่า แต่มีการอ้างถึงที่นี่: วิธีรวมคอมมิตเฉพาะใน Git

ดังนั้นคำตอบที่ใหม่กว่า: ใช้สาขาคุณลักษณะและดึงคำขอ

สิ่งนี้มีลักษณะอย่างไรโดยที่ fA เป็นการกระทำที่มีคุณลักษณะ A และ fB เป็นการกระทำที่มีคุณลักษณะ B

            fA   fC (bad commit, don't merge)
           /  \ /
master ----A----B----C
                \  /
                 fB

คำขอดึงเชื่อมโยงกับฟังก์ชันการทำงานของ GitHub แต่จริงๆแล้วทั้งหมดที่ฉันหมายถึงก็คือมีใครบางคนที่มีหน้าที่ในการรวมสาขาของฟีเจอร์เข้าด้วยกันเป็นหลัก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.