“ git pull” หรือ“ git merge” ระหว่างมาสเตอร์และสาขาการพัฒนา


243

ฉันมีmasterสาขาและdevelopสาขาสำหรับทำงานเกี่ยวกับการเปลี่ยนแปลงเล็กน้อย ฉันต้องรวมการเปลี่ยนแปลงจากmasterเข้าdevelopด้วยกัน แต่ในที่สุดจะรวมทุกอย่างdevelopเข้าmasterด้วยกัน ฉันมีกระบวนการทำงานที่ต่างกันสองประการในใจ:

  1. git pull origin masterเข้าสู่developสาขา
  2. git merge masterเข้าสู่developสาขา

วิธีใดดีที่สุดในการทำเช่นนี้และเพราะเหตุใด


18
การอ่านที่แนะนำ: nvie.com/posts/a-successful-git-branching-model
Alex Brasetvik

2
git pull= git fetch+git merge FETCH_HEAD
Yousha Aleayoub

คำตอบ:


104

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

กฎง่ายๆถ้าคุณผลักสาขาให้กำเนิดอย่าใช้ rebase ให้ใช้การผสานแทน


ยังปลอดภัยหรือไม่ที่จะทำการรีบูทและgit push origin rebasedBranch --forceซื้อคืนภาคเอกชน? ผู้ใช้คนเดียวคือตัวฉันเอง
k0pernikus

ใช่ถ้าคุณเป็นผู้ใช้คนเดียวแน่นอนว่ามันปลอดภัย ฉันใช้ git push - บังคับตลอดเวลาเมื่อฉันเป็นผู้ใช้คนเดียว :)
Tyler Rick

3
ฉันก้องคำเตือนของ Eric แม้ว่ามันจะโอเคที่จะรีบูทรีโมตสาขาของคุณเองเช่นกัน เล่นกับทั้ง rebase และผสานและคุณจะเข้าใจข้อดีข้อเสียของแต่ละคนและเรียนรู้ว่าจะใช้เมื่อใด
Ian Lotinsky

บทความที่ดีเกี่ยวกับการใช้การรีบูตแม้กระทั่งการรวมกันหลังจากการแก้ไขข้อขัดแย้ง: github.com/everpix/Everpix-Intelligence
Ian Lotinsky

@IanLotinsky ลิงก์ของคุณไม่ได้ชี้ไปที่บทความเรื่องการรีบูต ลองดู แต่คุณยังมีลิงก์ที่ถูกต้องอยู่หรือไม่ :)
Daniel Serodio

347

เวิร์กโฟลว์นี้ทำงานได้ดีที่สุดสำหรับฉัน:

git checkout -b develop

... ทำการเปลี่ยนแปลง ...

... มีการอัปเดตข้อมูลแจ้งเตือนหลัก ...

... ยอมรับการเปลี่ยนแปลงเพื่อพัฒนา ...

git checkout master
git pull

... นำการเปลี่ยนแปลงเหล่านั้นกลับมาพัฒนา ...

git checkout develop
git rebase master

... ทำการเปลี่ยนแปลงเพิ่มเติม ...

... มุ่งมั่นที่จะพัฒนา ...

... รวมพวกเขาเป็นหลัก ...

git checkout master
git pull
git merge develop

2
นี่คือวิธีที่ฉันทำงานด้วยและฉันคิดว่ามันใช้ได้ดี มีสิ่งหนึ่งที่ฉันจะไม่ทำ แต่เป็นและที่เป็นทางขวาก่อนสุดท้ายgit pull git merge developจุดประสงค์ของสิ่งนั้นคืออะไร?
crdx

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

1
@ a1an ไม่ แต่ถ้าคุณไม่ทำแล้วการเปลี่ยนแปลงจะย้ายไปที่สาขาหลักและคอมไพล์จะไม่ยอมให้คุณดึงจนกว่าพวกเขาจะได้กระทำ
elemjay19

5
@crdx โอกาสที่สาขาอื่นจะถูกรวมเข้ากับ Remote Master ก่อนที่คุณจะรวมสาขาของคุณเข้ากับ Local Master คุณดึงและนำการเปลี่ยนแปลงต้นแบบระยะไกลไปยังสำเนาต้นแบบภายในเครื่องของคุณ นี่คือวิธีที่ฉันเข้าใจ
Tarun

12
git pull --rebase origin masterในสาขาการพัฒนาของคุณเร็วขึ้นเล็กน้อย
Nathan Lilienthal

24

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


10
คำแนะนำที่ดีสมมติdevelopว่าไม่ได้แชร์กับคนอื่น
Karl Bielefeldt

1
@KarlBielefeldt หากdevelop จะใช้ร่วมกันกับผู้ร่วมสมทบอื่น ๆ วิธีการที่เราจะอัปเดตdevelopเมื่อโปรแกรมแก้ไขด่วนบางส่วนถูกผลักโดยตรงไปยังmaster? เราควรทำการผสานกันgit checkout master && git pull --rebase && git checkout develop && git merge masterหรือไม่? ฉันแสดงความคิดเห็นเกี่ยวกับคำตอบที่ได้รับการโหวตสูงสุดข้างต้นซึ่งรวมถึงรายละเอียดข้อกังวลนี้
modulitos

5

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

> git clone git://<remote_repo_path>/ <local_repo>
> cd <local_repo>
> git checkout -b develop
....do a lot of work on develop
....do all the commits
> git pull origin master
> git rebase master develop

ขั้นตอนข้างต้นจะช่วยให้มั่นใจได้ว่าสาขาการพัฒนาของคุณจะอยู่ด้านบนของการเปลี่ยนแปลงล่าสุดจากสาขาหลักเสมอ เมื่อคุณพัฒนาสาขาเสร็จแล้วและจะถูกเปลี่ยนเป็นการเปลี่ยนแปลงล่าสุดในต้นแบบคุณสามารถรวมมันกลับคืนได้:

> git checkout -b master
> git merge develop
> git branch -d develop

1

กฎง่ายๆคือ:

rebaseสำหรับสาขาที่มีชื่อเดียวกัน , mergeมิฉะนั้น

ตัวอย่างสำหรับชื่อเดียวกันจะเป็นmaster, และorigin/masterotherRemote/master

หากdevelopมีอยู่เฉพาะในที่เก็บข้อมูลในเครื่องเท่านั้นและจะขึ้นอยู่กับการคอมมิทล่าสุดorigin/masterคุณควรเรียกมันmasterและทำงานที่นั่นโดยตรง มันทำให้ชีวิตของคุณง่ายขึ้นและนำเสนอสิ่งต่าง ๆ ตามที่เป็นจริง: คุณกำลังพัฒนาบนmasterสาขาโดยตรง

ถ้าdevelopใช้ร่วมกันก็ไม่ควร rebased บนเพียงรวมกลับเข้ามาด้วยmaster คุณกำลังพัฒนาใน--no-ff และมีชื่อแตกต่างกันเพราะเราต้องการให้พวกเขาแตกต่างและแยกออกจากกัน ไม่ทำให้พวกเขาเหมือนกันกับdevelopmasterdeveloprebase

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