วิธีการทำให้สาขา git ซิงค์กับมาสเตอร์


275

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

มีสองสาขาหนึ่งเรียกว่าต้นแบบและเป็นหนึ่งเรียกว่าmobiledevicesupport ฉันต้องการให้ mobiledevicesupport เป็นสาขาต่อเนื่องที่จะถูกผสาน / ซิงค์กับสาขาหลักเมื่อใดก็ตามที่ mobiledevicesupport มีความเสถียร สิ่งนี้จะรวมการเปลี่ยนแปลงจาก mobiledevicesupport เข้ากับ master แต่ยังนำการเปลี่ยนแปลงทั้งหมดจาก master เข้าสู่ mobiledevicesupport เพื่อให้สาขาสามารถทำงานต่อไปได้และคุณสมบัติที่ปรับปรุงหรือแก้ไข สิ่งนี้ต้องการทำงานกับที่เก็บส่วนกลางและผู้พัฒนาหลายคน

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

ขอบคุณทุกคนช่วยชื่นชมมาก

อัปเดต 1: ถ้าฉันจะรวมมาสเตอร์เข้ากับ mobiledevicesuices และ mobiledevice support เป็น master ฉันจะได้รับคอมมิชชันที่ทำซ้ำในทั้งสองสาขาหรือไม่ หรือคอมไพล์ฉลาดพอที่จะคิดออกว่าฉันได้ดึงการเปลี่ยนแปลงล่าสุดจากสาขา A ไปยังสาขา B และเพิ่มการผสานกระทำ C ถึงสาขา B และฉันได้ดึงการเปลี่ยนแปลงล่าสุดจากสาขา B เป็นสาขา A และเพิ่มการผสานกระทำ D ถึงสาขา หรือไม่ A

ฉันกำลังจะโพสต์รูปภาพ แต่ฉันไม่มีชื่อเสียงเพียงพอสำหรับมันดังนั้นฉันเดาว่าภาพประกอบต่อไปนี้จะต้องทำ สองสาขาทำงานอย่างต่อเนื่องโดยมีการรวมกันไปทั้งสองทิศทางบ่อยครั้ง สิ่งสำคัญที่ฉันไม่แน่ใจเกี่ยวกับคือวิธี git จะเล่นออกกระทำและจะเติมทั้งสองสาขาด้วยความมุ่งมั่นจากสาขาอื่นในการรวมหรือจะสะอาด ฉันเคยใช้การ rebase มาก่อน แต่ดูเหมือนว่าจะจบสาขาและวางคอมมิชชันทั้งหมดลงในต้นแบบหรือฉันทำผิด ขอบคุณสำหรับความช่วยเหลือจนถึงตอนนี้

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L

1
หากคุณเป็นเช่นฉันกำลังมองหาวิธีการทำกับลูกค้า GitHub : help.github.com/articles/merging-branches
cregox

1
คำถามนี้ช่วยชีวิตฉันไว้นานหลายศตวรรษ ขอบคุณสำหรับความพยายามอย่างยิ่งในการสละเวลาเพื่อตั้งคำถามที่ยอดเยี่ยมนี้ @Mr เอเสเคียล
DJphy

ในกรณีที่คุณทำงานด้วยส้อมคุณต้องทำตามhelp.github.com/articles/syncing-a-fork
koppor

คำตอบ:


416

ใช่แค่ทำ

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

เพื่อให้ mobiledevicesupport ซิงค์กับมาสเตอร์

จากนั้นเมื่อคุณพร้อมที่จะรวบรวมอุปกรณ์สนับสนุนเป็นหลักก่อนอื่นผสานในต้นแบบดังกล่าวข้างต้นแล้ว ...

git checkout master
git merge mobiledevicesupport
git push origin master

และนั่นมัน

สมมติฐานที่นี่คือ mobilexxx เป็นสาขาหัวข้อที่มีงานที่ยังไม่พร้อมที่จะเข้าสู่สาขาหลักของคุณ ดังนั้นควรรวมเข้ากับปรมาจารย์เมื่อมีการสนับสนุนอุปกรณ์อยู่ในที่ที่ดี


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

1
คุณจะมี "การรวมคอมมิชชัน" ค่อนข้างน้อยส่วนหลักคือพยายามแก้ไขความแตกต่างระหว่างสาขาของคุณ หากคุณกังวลเกี่ยวกับสิ่งนั้นและคุณเป็นคนเดียวที่ใช้สาขาให้ทำ "git rebase master" แทนที่จะเป็น "git merge master" และอย่าผลักดันพันธะสัญญาของสาขาระยะไกล ถ้าคุณทำคุณจะพบว่าตัวเองกำลังทำสิ่งต่างๆมากมาย (git push --force) ไปที่จุดเริ่มต้น / mobiledevicesupport เพราะคุณกำลังจะไป (อาจ) ส่งเสมอไม่ว่าจะเป็นประวัติของการกระทำที่ไม่ตรงกับสิ่งที่ สาขาระยะไกลมี รายละเอียดเพิ่มเติมได้ที่นี่git-scm.com/book/en/Git-Branching-Rebasing
concept47

ฉันเชื่อว่านี่เป็นคำตอบที่ถูกต้องมันฟังดูเหมือนสิ่งที่ฉันต้องการ ฉันเพิ่มภาพประกอบด้านบนเพื่อให้ชัดเจนขึ้นเล็กน้อย แต่ถ้าสิ่งที่คุณพูดนั้นเป็นความจริงสิ่งนี้ควรจะเป็นไปตามที่ฉันต้องการ ขอบคุณ.
นาย EZEKIEL

2
อ่านจะเข้าใจว่าทำไมนี้ไม่ได้เป็นคำแนะนำที่ดีโดยเฉพาะอย่างยิ่ง: kentnguyen.com/development/visualized-git-practices-for-team/... ที่เขียนโดยผู้ดูแล Git ดังนั้นจึงอาจยุติธรรมที่จะบอกว่าเขารู้ว่าสิ่งที่เขาพูดเกี่ยวกับเรื่องนี้โดยเฉพาะ
Dan Molding

2
สิ่งนี้ทำให้เกิดความยุ่งเหยิงของประวัติศาสตร์ดูคำตอบของฉันทำผ่านการรีบูต
Gob00

43

git rebase <remote>/masterเมื่อใดก็ตามที่คุณต้องการที่จะได้รับการเปลี่ยนแปลงจากต้นแบบเข้าไปในสาขาการทำงานของคุณทำ หากมีข้อขัดแย้งใด ๆ แก้ไขพวกเขา

เมื่อสาขาการทำงานของคุณพร้อม rebase git push <remote> HEAD:masterอีกครั้งแล้วทำ สิ่งนี้จะอัปเดตสาขาหลักบนรีโมต (repo ส่วนกลาง)


3
อะไรคือข้อดี / ข้อเสียของการทำเช่นนี้แทนที่จะเป็นเหมือนคำตอบที่ยอมรับ?
Hampus Ahlgren

33
เสนจนกว่าคุณจะใช้เวลา 5 ชั่วโมงในนรก rebase
IcedDante

21
นี่เป็นความจริงเฉพาะเมื่อสาขาของคุณอยู่ในที่เก็บส่วนตัว อย่ารีบาวน์สิ่งที่ถูกผลักขึ้น นี่คือเหตุผล: git-scm.com/book/en/v2/…
Kleag

3
ปัญหาเกี่ยวกับการ rebasing ถูกเขียนใหม่ของประวัติศาสตร์คือว่า rebased กระทำของ Shas มีการเปลี่ยนแปลงและทำให้คุณไม่สามารถพึ่งพาการส่งออกของ git branch --contains <commit>(เช่น)
jnns

13

แนวทางของ concept47 นั้นเป็นวิธีที่ถูกต้อง แต่ฉันแนะนำให้รวมกับตัวเลือก --no-ff เพื่อให้ประวัติการกระทำของคุณชัดเจน

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master

9

ใช่ฉันเห็นด้วยกับวิธีการของคุณ ในการรวมอุปกรณ์เคลื่อนที่สนับสนุนเป็นหลักคุณสามารถใช้

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

ในทำนองเดียวกันคุณสามารถผสานหลักใน mobiledevicesupport

ถามหากการรวมข้ามเป็นปัญหาหรือไม่

ตอบ: ขึ้นอยู่กับความมุ่งมั่นในสาขามือถือ * และสาขาหลักจากการซิงค์ครั้งล่าสุด ใช้ตัวอย่างนี้: หลังจากการซิงค์ครั้งสุดท้ายการกระทำต่อไปนี้เกิดขึ้นกับสาขาเหล่านี้

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

ทีนี้สมมติว่าการคอมมิท B ทำการเปลี่ยนแปลงไฟล์ a.txt และคอมมิท D ทำการเปลี่ยนแปลงบางอย่างกับ a.txt ให้เราดูที่ผลกระทบของการดำเนินการแต่ละอย่างของการรวมกันตอนนี้

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

ขณะนี้มีการรวมสองประเภทที่เป็นไปได้

  1. กรอไปข้างหน้าอย่างรวดเร็ว
  2. True merge (ต้องใช้ความพยายามด้วยตนเอง)

Git จะพยายามทำการผสาน FF ก่อนและหากพบว่าความขัดแย้งใด ๆ จะไม่สามารถแก้ไขได้โดย git มันล้มเหลวในการผสานและขอให้คุณรวม ในกรณีนี้การส่งข้อความใหม่จะเกิดขึ้นซึ่งรับผิดชอบการแก้ไขข้อขัดแย้งใน a.txt

ดังนั้นบรรทัดล่างคือการผสานข้ามไม่ใช่ปัญหาและท้ายที่สุดคุณต้องทำและนั่นคือสิ่งที่หมายถึงการซิงค์ ทำให้มือของคุณสกปรกในการรวมสาขาก่อนที่จะทำอะไรในการผลิต


1
ดังนั้นการผสมข้ามเช่นนี้จะไม่เป็นปัญหา?
นาย EZEKIEL

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

3

คำตอบที่ได้รับการยอมรับผ่าน git merge จะทำให้งานเสร็จ แต่ปล่อยให้ยุ่งวุ่นวายทำงานอย่างถูกต้องควรจะ 'rebase' ผ่านขั้นตอนต่อไปนี้ (สมมติว่าคุณต้องการให้สาขาฟีเจอร์ของคุณอยู่ใน sycn กับการพัฒนาก่อนที่จะทำ )

1 git fetchจากสาขาฟีเจอร์ของคุณ (ตรวจสอบให้แน่ใจว่าสาขาฟีเจอร์ที่คุณกำลังทำงานนั้นเป็นข้อมูลล่าสุด)

2 git rebase origin/develop

3 หากความขัดแย้งใด ๆ เกิดขึ้นแก้ไขพวกเขาทีละคน

4 ใช้git rebase --continueเมื่อจัดการข้อขัดแย้งทั้งหมดแล้ว

5 git push --force


1
นี่เป็นทั้งยากต่อการอ่านและเข้าใจยาก โปรดอัปเดตคำตอบของคุณและใช้รหัสที่เหมาะสมเพื่อแยกความคิดเห็นของคุณออกจากคำสั่ง
not2qubit

2

คุณกำลังคิดในทิศทางที่ถูกต้อง ผสานหลักกับ mobiledevicesupport อย่างต่อเนื่องและรวม mobiledevicesuices กับ master เมื่อ mobiledevicesupport มีความเสถียร นักพัฒนาแต่ละคนจะมีสาขาของตัวเองและสามารถรวมเข้าและออกจากทั้งในระดับปริญญาโทหรือมือถืออุปกรณ์สนับสนุนขึ้นอยู่กับบทบาทของพวกเขา

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