วิธีการรีบู๊ตสาขาในพื้นที่ด้วยต้นแบบระยะไกล


934

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

ตอนนี้ฉันต้องรีบาวด์สาขา RB ของฉันให้เป็นremote_repoปรมาจารย์

ทำอย่างไร คำสั่งอะไรที่จะพิมพ์ไปยังสถานี?


14
สำหรับฉันคำถามนี้คลุมเครือเหมือน "กับ" อาจหมายถึงการรีบูตในทิศทางใดทิศทางหนึ่ง ดูคำตอบที่ฉันเห็นว่ามีความตั้งใจที่จะลดสาขาของคุณไปยังต้นแบบระยะไกลไม่ใช่วิธีอื่น ๆ ฉันพูดถึงมันในกรณีที่มีใครบางคนปฏิบัติตามคำตอบด้านล่างและย้อนกลับสิ่งที่พวกเขาต้องการ
Glenn Lawrence

8
@GlennLawrence ฉันคิดว่ามันจะดีกว่าที่จะแก้ไขคำถามเดิมกว่าที่จะเพิ่มความคิดเห็น นอกจากนี้ยังสนับสนุนโดย stackoverflow นอกจากนี้การรีบูตมาสเตอร์ไปยัง RB อาจจะล้มเหลวอยู่ดีเพราะ RB ขึ้นอยู่กับประวัติของมาสเตอร์
daniel kullmann

คำตอบ:


1245

ก่อนอื่นดึงต้นแบบใหม่จากที่เก็บข้อมูลต้นน้ำจากนั้นรีสาขางานของคุณบนนั้น:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

อัปเดต : โปรดดูคำตอบของ Paul Draperสำหรับวิธีที่กระชับยิ่งขึ้นในการทำเช่นเดียวกัน - เวอร์ชัน Git ล่าสุดให้วิธีที่ง่ายกว่าในการทำคำสั่งสองคำสั่งด้านบน


16
นี่เป็นคำตอบเดียวที่จริง ๆ แล้วสิ่งที่ถาม
kayaker243

5
@ kayaker243 ไม่มันเหมือนกับคำตอบของ Paul Drapers แต่ในระยะยาวฉันคิดว่า
erik

7
@erik โปรดทราบว่า Paul Draper เขียนคำตอบของเขาประมาณครึ่งปีหลังจากความคิดเห็นของ kayaker243 (และเกือบสองปีหลังจากคำตอบนี้)
Frerich Raabe

3
ฉันได้รับต่อไปนี้: Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.ดูเหมือนว่าgit pullเป็นสิ่งจำเป็นอื่น ถูกต้องหรือว่าฉันพลาดบางสิ่งที่นี่?
Dror

2
@RGC ไม่git rebase masterจะไม่ทำงานเหมือนกับคำสั่งที่สอง ( git rebase origin/master) เนื่องจากmasterและorigin/masterอาจชี้ไปที่คอมมิทที่ต่างกัน (โดยเฉพาะเมื่อคำสั่งแรกคือgit fetch originซึ่งอาจแก้ไขorigin/master)
Frerich Raabe

814
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]

19
(เทียบเท่ากับคำตอบของ Frerich)
Paul Draper

12
ไม่แตกต่างจากคำตอบของ Frerich เล็กน้อยในกรณีนี้จะยอมรับการเปลี่ยนแปลงจากต้นแบบต้นกำเนิดไปยังต้นแบบท้องถิ่น (pull vs. fetch)
Jimmy Huch

7
ไม่ในคำตอบของ Frerich การลดระดับจะแก้ไขเจ้านายท้องถิ่น pull --rebase เป็นสิ่งเดียวกันกับการดึงข้อมูลตามด้วย rebase
adhominem

9
FYI คุณสามารถทำรายการคืนเงินแบบโต้ตอบกับgit pull --rebase=interactive origin master
emmby

14
@adhominem - ฉันตรวจสอบเอกสารgit-pullและฉันไม่เห็นสิ่งใดที่สนับสนุนการอ้างสิทธิ์ว่ามีการแก้ไขต้นแบบในเครื่อง ถ้าฉันในสาขาที่มีชื่อdevและเรียกใช้git pull --rebase origin masterเพียงสาขาเป็นไปได้ที่แก้ไขไม่ได้dev เอกสารธงกล่าวว่าจะพยายามและไม่มีอะไรที่เกี่ยวกับการปรับเปลี่ยนสาขาติดตามท้องถิ่น master--rebaserebase the current branch on top of the upstream branch after fetching
Reinstate Monica 2331977

226

หลังจากยอมรับการเปลี่ยนแปลงสาขาของคุณให้ชำระเงินmasterและดึงข้อมูลเพื่อรับการเปลี่ยนแปลงล่าสุดจาก repo:

git checkout master
git pull origin master

จากนั้นชำระเงินที่สาขาและรีบูตการเปลี่ยนแปลงของคุณในmaster:

git checkout RB
git rebase master

... หรือสองคำสั่งสุดท้ายในหนึ่งบรรทัด:

git rebase master RB

เมื่อพยายามดันกลับไปorigin/RBคุณอาจได้รับข้อผิดพลาด หากคุณกำลังทำงานเพียงคนเดียวRBคุณสามารถบังคับให้ทำดังนี้:

git push --force origin RB

... หรือดังต่อไปนี้หากคุณได้ตั้งค่า git อย่างเหมาะสม:

git push -f

4
เมื่อพยายามดันกลับไปที่จุดเริ่มต้น / RB คุณอาจได้รับข้อผิดพลาด หากคุณเป็นคนเดียวที่ทำงานกับ RB คุณสามารถคอมไพล์ push --force ต้นกำเนิด RB ได้ แหล่งที่มา: stackoverflow.com/questions/8939977/…
Joey Baruch

1
อ่า .... ฉันมีอย่างนี้ "RB" ของฉันถูกรีบูทอย่างถูกต้อง แต่ฉันได้รับข้อผิดพลาดที่ไม่สิ้นสุดเมื่อพยายามผลักดันหลังจากรีบูต นอกเหนือจากการผลัก - บังคับกำเนิด RB - มีวิธี "ดีกว่า" (ไม่บังคับ) ทำหรือไม่ ฉันแค่พยายามเข้าใจการรับรู้ gits ที่นี่ - และล้มเหลว
Motti Shneor

2
@ MottiShneor ไม่ไม่มีวิธีที่ดี หากมีคนอื่นผลักดันให้สาขาในเวลานั้นการเปลี่ยนแปลงของพวกเขาจะหายไป! หากคุณต้องการเป็นคนดีกับคอมไพล์คอมมิชชันประวัติคุณควรรวมมาสเตอร์ในสาขาของคุณซึ่งปลอดภัย (คุณสามารถทำได้git pushโดยไม่ต้อง-f)
daniel kullmann

109

หมายเหตุ:หากคุณมีความรู้ในวงกว้างเกี่ยวกับการรีบูตแล้วให้ใช้ซับด้านล่างหนึ่งอันเพื่อการรีเฟรชอย่างรวดเร็ว วิธีแก้ปัญหา: สมมติว่าคุณทำงานสาขาและคุณเป็นคนเดียวที่ทำงานอยู่

git fetch && git rebase origin/master

แก้ไขข้อขัดแย้งทดสอบรหัสกระทำและผลักดันการเปลี่ยนแปลงใหม่ไปยังสาขาระยะไกล

                            ~:   For noobs   :~

ขั้นตอนต่อไปนี้อาจช่วยทุกคนที่ยังใหม่กับgit rebaseและต้องการที่จะทำโดยไม่ต้องยุ่งยาก

ขั้นตอนที่ 1:สมมติว่าไม่มีข้อผูกมัดและการเปลี่ยนแปลงที่จะเกิดขึ้นกับ YourBranch ณ จุดนี้ เรากำลังเยี่ยมชม YourBranch

git checkout YourBranch
git pull --rebase

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

ขั้นตอนที่ 2:แก้ไขข้อขัดแย้งที่เกิดขึ้น

ขั้นตอนที่ 3:

git checkout master
git pull --rebase

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

ขั้นตอนที่ 4:แก้ไขข้อขัดแย้งใด ๆ ที่นำเสนอ

ขั้นตอนที่ 5:

git checkout YourBranch
git rebase master

เกิดอะไรขึ้น? การลดลงของต้นแบบเกิดขึ้น

ขั้นตอนที่ 6:แก้ไขข้อขัดแย้งหากมีข้อขัดแย้ง ใช้git rebase --continueเพื่อรีบูตต่อไปหลังจากเพิ่มข้อขัดแย้งที่ได้รับการแก้ไข คุณสามารถใช้git rebase --abortเพื่อยกเลิกการยกเลิกเมื่อใดก็ได้

ขั้นตอนที่ 7:

git push --force-with-lease 

เกิดอะไรขึ้น? ผลักดันการเปลี่ยนแปลง YourBranch ระยะไกลของคุณ --force-with-leaseจะทำให้แน่ใจว่ามีการเปลี่ยนแปลงอื่น ๆ ที่เข้ามาสำหรับ YourBranch จากนักพัฒนาอื่น ๆ ในขณะที่คุณทำการรีบูทหรือไม่ สิ่งนี้มีประโยชน์มากกว่าการใช้กำลังดัน ในกรณีที่มีการเปลี่ยนแปลงใด ๆ ที่เข้ามาจากนั้นเรียกพวกเขาเพื่อปรับปรุง YourBranch ท้องถิ่นของคุณก่อนที่จะผลักดันการเปลี่ยนแปลง

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

YAHOOOO ... ! คุณทำสำเร็จแล้วด้วยการรีบูต

คุณอาจกำลังมองหา:

git checkout master
git merge YourBranch

เมื่อไหร่และเพราะเหตุใด ผสานสาขาของคุณเป็นหลักหากมีการเปลี่ยนแปลงโดยคุณและผู้พัฒนาร่วมอื่น ๆ ซึ่งทำให้ YourBranch ทันสมัยกับเจ้านายเมื่อคุณต้องการทำงานในสาขาเดียวกันในภายหลัง

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~

สิ่งนี้มีไว้สำหรับ: "ดึงการเปลี่ยนแปลงล่าสุดทั้งหมดจากมาสเตอร์และมาสเตอร์ rebases บนมาสเตอร์ล่าสุด" rebase master ในต้นแบบหรือไม่ คุณไม่จำเป็นต้องดึงเจ้านายคนล่าสุดใช่ไหม
John Little

@ JohnLittle ขอบคุณที่ชี้ให้เห็น Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!ผมหมายถึง ฉันจะอัปเดตคำอธิบายของฉัน
bh4r4th

21

ขั้นตอนที่ 1:

git fetch origin

ขั้นตอนที่ 2:

git rebase origin/master

ขั้นตอนที่ 3: (แก้ไขหากมีข้อขัดแย้งใด ๆ )

git add .

ขั้นตอนที่ 4:

git rebase --continue

ขั้นตอนที่ 5:

git push --force

5
ไม่มีคำอธิบายเกี่ยวกับสาขาที่จะเริ่มต้น ไม่ใช่คำตอบที่ดี
Karl Morrison

12

1. อัปเดตปริญญาโทก่อน ...

git checkout [master branch]
git pull [master branch]

2. ตอนนี้ rebase ที่มาสาขากับสาขาหลัก

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

ถ้า Branch branch ยังไม่มีอยู่ใน remote ให้ทำดังนี้:

git push -u origin [source branch]

"และ voila ... "


ฉันชอบธรรมชาติของคำตอบนี้ทีละขั้นตอน มันช่วยแยกแยะสิ่งที่เกิดขึ้นอย่างแน่นอน
Dave Liu

6

git fetch origin master:master ดึงมาสเตอร์เวอร์ชันล่าสุดโดยไม่จำเป็นต้องตรวจสอบ

ดังนั้นสิ่งที่คุณต้องการคือ:

git fetch origin master:master && git rebase master 👌


ไม่git fetchอัปเดตหลักโดยไม่จำเป็นต้องตรวจสอบหรือไม่ ยกเว้นว่าการอัปเดตgit fetchจะไม่git mergeถูกต้องใช่ไหม ดังนั้นหากเราชำระเงินmasterจะไม่มีการอัปเดตล่าสุด ดังนั้นไม่ได้สั้นกว่าที่จะทำในขณะที่สาขาคุณลักษณะgit fetchแล้วgit rebase origin/master? เราทำไม่ได้git rebase masterเพราะจะพยายามลดจากmasterในพื้นที่ทำงานเราต้องorigin/masterได้รับจากคนที่ไม่จม แต่นั่งอยู่ในท้องถิ่น
Noitidart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.