สาขา Git แตกต่างกันหลังจาก rebase


114

ฉันได้เปลี่ยนสาขาในประเทศซึ่งได้รับการผลักดันแล้ว

Git กำลังให้คำแนะนำว่าสาขาและระยะไกลของฉันแตกต่างกันและ:

"และมีการกระทำที่แตกต่างกัน 109 และ 73 รายการตามลำดับ"

การผลักดันสาขาของฉันจะแก้ไขปัญหานี้หรือไม่นั่นคือสิ่งนี้คาดว่าจะเกิดขึ้นหลังจาก rebase หรือไม่


ฉันมีปัญหาเดียวกัน เราสามารถพูดได้ไหมว่า "วิธีที่ถูกต้อง" คือการ rebase สาขาท้องถิ่นแล้วผลักดันเท่านั้น
Mher Didaryan

คำตอบ:


155

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

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

TL; DR - หากคุณไม่ได้ทำงานร่วมกันให้ผลักดันสาขาโดยใช้ push -f หากคุณเป็นเช่นนั้นให้รีเซ็ตสาขาเป็นสถานะก่อนหน้าและรวมในสาขาต้นทางแทน


2
"เนื่องจากคุณได้ผลักดันสาขาไปแล้วคุณจึงควรรวมในสาขาต้นทาง" - ทำไมถึงเป็นเช่นนั้น
hammett

1
ประโยคแรกของ @ แฮมิลตันเวอริสซิโมเจสัน: "เมื่อคุณสร้างสาขาใหม่คุณต้องเขียนคอมมิตใหม่สำหรับคอมมิตใด ๆ ที่อยู่เหนือคอมมิตในสาขาที่คุณกำลังรีเบต" แม้ว่าการเปลี่ยนแปลงที่จับได้ในคอมมิต "ด้านบน" จะมีเนื้อหาเชิงตรรกะเหมือนกัน แต่การเปลี่ยนแปลงเหล่านี้จะถูกนำไปใช้กับฐานอื่นดังนั้นจึงเป็นการคอมมิตที่แตกต่างกันด้วยแฮชที่ต่างกัน หากนักพัฒนารายอื่นกำลังทำงานจากสาขาก่อนรีเบตการทำ git push -f จะรบกวนเวิร์กโฟลว์ของพวกเขาอย่างมาก ดังนั้นเนื่องจากสาขานี้ได้รับการผลักดันให้เป็นแหล่งสาธารณะเขาจึงควรรวมเข้าด้วยกัน
awolf

4
คุณสามารถใช้ push --force-with-rent ได้เช่นกันหากคุณไม่แน่ใจว่ามีใครผลักดันบางสิ่งไปแล้วหรือไม่
คอนโซล

1
@ jason-lebrun ข้อเสียของการรวมการเปลี่ยนแปลงต้นน้ำที่คุณสามารถเขียนทับงานของคุณเองโดยไม่มีการเตือนไม่ใช่หรือ? ตรวจพบข้อขัดแย้งในการผสานในลักษณะเดียวกับเมื่อทำการ rebasing หรือไม่ ตัวอย่างเช่นถ้าฉันลบส่วนออกจากไฟล์ในสาขาของฉันเพราะไม่จำเป็นอีกต่อไป แต่มีคนอื่นทำการเปลี่ยนแปลงเล็กน้อยกับส่วนเดียวกันบนต้นน้ำเช่นการลบช่องว่างบางส่วนหรือการดำเนินการค้นหา / แทนที่ส่วนกลางจะไม่ทำ การรวมที่ด้านบนของสาขาของฉันแทนที่การลบของฉันด้วยเวอร์ชันที่เปลี่ยนแปลงเล็กน้อยหรือไม่
Chris Bloom

1
การรวมสาขาอื่นเป็นของคุณไม่ใช่ความคิดที่ไม่ดีใช่ไหม เช่นการผสานต้นแบบเข้ากับสาขาฟีเจอร์นั่นจะไม่สร้างคอมมิตใหม่สำหรับสิ่งนั้นหรือไม่? จะไม่ส่งผลให้มีการคอมมิตพิเศษเมื่อฟีเจอร์นี้แตกแขนงออกไปหากผสานเป็นมาสเตอร์ในภายหลัง?
รอส

55

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

เพื่อให้ปัญหาของคุณได้รับการแก้ไขคุณต้องเขียนทับสาขาระยะไกลของคุณ:

git push -f origin experiment

http://git-scm.com/book/ch3-6.html

คำอธิบาย:

ดูว่าในภาพนี้ไม่ได้ใส่ C3 เป็น C3 หลัง rebase แต่เป็น C3 ' นี่เป็นเพราะมันไม่ใช่ C3 อย่างแน่นอน แต่มีการเปลี่ยนแปลงรหัสทั้งหมด

Rebase

ในภาพอื่น ๆ นี้คุณจะเห็นภาพของสิ่งที่ rebase เห็นเมื่อเกี่ยวข้องกับรีโมตและเหตุใดจึงมีการเบี่ยงเบน

แยกและดันคอมไพล์

ไม่ว่าในกรณีใดหลังจากที่คุณทำการกดบังคับระบบจะแจ้งให้คุณทราบว่าได้ทำการ (บังคับให้อัปเดต) คุณควรจะสบายดี ณ จุดนั้น

ชำระเงินที่ลิงค์ด้านบนและค้นหา "git push --force" คุณจะเห็นคำอธิบายโดยละเอียดมากขึ้น


3
ได้. ฉันเดาว่านี่ช่วยแก้ปัญหาได้ แต่แรงผลักอาจไม่ทำงานเมื่อคุณทำงานร่วมกับในทีมเมื่อการผลักดันของคุณอาจเขียนทับงานล่าสุดที่ผู้อื่นผลักดัน ฉันถูกไหม?
Hari Krishna Ganji

มันอาจไม่มีเอฟเฟกต์ที่ต้องการ ตรวจสอบให้แน่ใจว่าคุณผสานการเปลี่ยนแปลงของคุณแบบ "กรอไปข้างหน้า" ก่อนที่จะทำการรีเบส
mimoralea

1

ฉันประสบความสำเร็จกับ rebase diverge สำหรับการผลักดันโดยทำสิ่งต่อไปนี้:

git checkout mybranch
git pull
git push origin mybranch

การดึงแก้ไขความแตกต่าง

ก่อนที่จะดึง

Your branch and 'origin/mybranch' have diverged,
and have 2 and 1 different commit(s) each, respectively.

เอาท์พุท PULL

ผสานโดยเรียกซ้ำ mypath / myfile.py | 12 +++++++++++ - เปลี่ยน 1 ไฟล์, แทรก 11 ครั้ง (+), ลบ 1 ครั้ง (-)

หลังจากดึง

สาขาของคุณนำหน้า 'origin / mybranch' 3 คอมมิต

หลังจากผลักดัน

mybranch อยู่ข้างหน้า 3 สาขา แต่ยังคงมีข้อความการผสานคำขอดึงแบบเปิดที่เพิ่มเข้าไปในประวัติการกระทำผสานสาขา mybranch ของรีโมตลงใน mybranch

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

ตามที่คนอื่น ๆ กล่าวไว้ให้หลีกเลี่ยง rebase หากคุณมีคำขอดึงแบบเปิดอยู่แล้ว ฉันกำลังยกตัวอย่างนี้เป็นสิ่งที่เหมาะกับฉัน


1

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

  1. สาขาหลักกำลังพัฒนา
  2. คุณชำระเงินคุณสมบัติสาขาใหม่/ doing_stuff
  3. สมาชิกในทีมผลักดันความมุ่งมั่นใหม่ที่จะพัฒนา

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

  1. คุณลักษณะการชำระเงิน git / doing_stuff
  2. git rebase พัฒนา
  3. การชำระเงิน git พัฒนา
  4. คุณลักษณะ git rebase / doing_stuff

rebase จากขั้นตอนที่ 2 จะนำการคอมมิตที่ขาดหายไปเข้าสู่ฟีเจอร์ / การทำ _stuff ดังนั้นเมื่อขั้นตอนที่ 4 มาพร้อมกันนั้นจะเป็นข้อมูลล่าสุดและไม่จำเป็นต้องสร้างคอมมิตใหม่สำหรับการเปลี่ยนแปลง

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

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