คอมมิต Git จะซ้ำกันในสาขาเดียวกันหลังจากทำการ rebase


131

ผมเข้าใจสถานการณ์ที่นำเสนอในโปร Git เกี่ยวกับมีดหมอ rebasing โดยทั่วไปผู้เขียนจะบอกวิธีหลีกเลี่ยงการกระทำที่ซ้ำกัน:

อย่าตั้งฐานใหม่ว่าคุณได้พุชไปยังที่เก็บสาธารณะ

ฉันจะบอกคุณเกี่ยวกับสถานการณ์เฉพาะของฉันเพราะฉันคิดว่ามันไม่ตรงกับสถานการณ์ Pro Git อย่างแน่นอนและฉันยังคงจบลงด้วยการกระทำที่ซ้ำกัน

สมมติว่าฉันมีสาขาที่อยู่ห่างไกลสองแห่งกับสาขาในพื้นที่:

origin/master    origin/dev
|                |
master           dev

ทั้งสี่สาขามีความมุ่งมั่นเดียวกันและฉันจะเริ่มพัฒนาในdev:

origin/master : C1 C2 C3 C4
master        : C1 C2 C3 C4

origin/dev    : C1 C2 C3 C4
dev           : C1 C2 C3 C4

หลังจากการกระทำสองสามครั้งฉันจะผลักดันการเปลี่ยนแปลงไปที่origin/dev:

origin/master : C1 C2 C3 C4
master        : C1 C2 C3 C4

origin/dev    : C1 C2 C3 C4 C5 C6  # (2) git push
dev           : C1 C2 C3 C4 C5 C6  # (1) git checkout dev, git commit

ฉันต้องกลับไปmasterแก้ไขด่วน:

origin/master : C1 C2 C3 C4 C7  # (2) git push
master        : C1 C2 C3 C4 C7  # (1) git checkout master, git commit

origin/dev    : C1 C2 C3 C4 C5 C6
dev           : C1 C2 C3 C4 C5 C6

และกลับไปที่devฉันปรับฐานการเปลี่ยนแปลงเพื่อรวมการแก้ไขด่วนในการพัฒนาจริงของฉัน:

origin/master : C1 C2 C3 C4 C7
master        : C1 C2 C3 C4 C7

origin/dev    : C1 C2 C3 C4 C5 C6
dev           : C1 C2 C3 C4 C7 C5' C6'  # git checkout dev, git rebase master

หากฉันแสดงประวัติของการคอมมิตด้วย GitX / gitk ฉันสังเกตเห็นว่าorigin/devตอนนี้มีคอมมิตที่เหมือนกันสองรายการC5'และC6'ซึ่งแตกต่างจาก Git ตอนนี้ถ้าฉันผลักดันการเปลี่ยนแปลงorigin/devนี่คือผลลัพธ์:

origin/master : C1 C2 C3 C4 C7
master        : C1 C2 C3 C4 C7

origin/dev    : C1 C2 C3 C4 C5 C6 C7 C5' C6'  # git push
dev           : C1 C2 C3 C4 C7 C5' C6'

บางทีฉันอาจไม่เข้าใจคำอธิบายทั้งหมดใน Pro Git ดังนั้นฉันต้องการทราบสองสิ่ง:

  1. เหตุใด Git จึงทำซ้ำการกระทำเหล่านี้ในขณะที่ rebasing มีเหตุผลพิเศษไหมที่ต้องทำแทนที่จะสมัครC5และC6หลังจากนั้นC7?
  2. ฉันจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร? จะฉลาดไหมที่จะทำ

คำตอบ:


87

คุณไม่ควรใช้ rebase ที่นี่การผสานอย่างง่ายก็เพียงพอแล้ว หนังสือ Pro Git ที่คุณเชื่อมโยงโดยพื้นฐานจะอธิบายสถานการณ์ที่แน่นอนนี้ การทำงานภายในอาจแตกต่างกันเล็กน้อย แต่ฉันเห็นภาพได้ดังนี้:

  • C5และC6ถูกดึงออกชั่วคราวdev
  • C7 ถูกนำไปใช้กับ dev
  • C5และC6จะถูกเล่นกลับด้านบนC7สร้างความแตกต่างใหม่และคอมมิตใหม่

ดังนั้นในของdevสาขาC5และC6มีประสิทธิภาพไม่อยู่: ตอนนี้พวกเขาและC5' C6'เมื่อคุณกดไปที่origin/devคอมไพล์จะเห็นC5'และC6'เป็นสิ่งที่กระทำขึ้นใหม่และใช้มันจนจบประวัติศาสตร์ หากคุณดูความแตกต่างระหว่างC5และC5'ในorigin/devคุณจะสังเกตเห็นว่าแม้ว่าเนื้อหาจะเหมือนกัน แต่หมายเลขบรรทัดอาจแตกต่างกันซึ่งทำให้แฮชของคอมมิตแตกต่างกัน

ฉันจะย้ำกฎ Git Pro: ไม่เคยกระทำ rebase ที่ได้เคยมีอยู่ที่ใดก็ได้ แต่พื้นที่เก็บข้อมูลในพื้นที่ของคุณ ใช้การผสานแทน


ฉันมีปัญหาเดียวกันฉันจะแก้ไขประวัติสาขาระยะไกลของฉันตอนนี้ได้อย่างไรมีตัวเลือกอื่นนอกเหนือจากการลบสาขาและสร้างใหม่ด้วยการเก็บเชอร์รี่หรือไม่?
Wazery

1
@xdsy: Jave ดูที่นี้และนี้
Justin ᚅᚔᚈᚄᚒᚔ

2
คุณพูดว่า "C5 และ C6 ถูกดึงออกจาก dev ชั่วคราว ... C7 ถูกนำไปใช้กับ dev" หากเป็นกรณีนี้เหตุใด C5 และ C6 จึงปรากฏก่อน C7 ในลำดับของการกระทำที่ต้นทาง / dev
KJ50

@ KJ50: เนื่องจาก C5 และ C6 ถูกผลักไปorigin/devแล้ว เมื่อdevถูก rebased ประวัติจะถูกแก้ไข (C5 / C6 ถูกลบชั่วคราวและนำไปใช้ใหม่หลังจาก C7) การแก้ไขประวัติของ repos แบบพุชโดยทั่วไปเป็นความคิดที่ไม่ดีจริงๆเว้นแต่คุณจะรู้ว่ากำลังทำอะไรอยู่ ในกรณีง่ายๆนี้ปัญหาสามารถแก้ไขได้โดยการผลักดันจากdevไปยังorigin/devหลังการ rebase และแจ้งให้คนอื่นorigin/devทราบว่าพวกเขาอาจจะมีวันที่เลวร้าย คำตอบที่ดีกว่าอีกครั้งคือ"อย่าทำอย่างนั้น ... ใช้การผสานแทน"
จัสตินᚅᚔᚈᚄᚒᚔ

3
สิ่งหนึ่งที่ควรทราบ: แฮชของ C5 และ C5 แตกต่างกันอย่างแน่นอน แต่ไม่ใช่เพราะหมายเลขบรรทัดแตกต่างกัน แต่สำหรับข้อเท็จจริงสองประการต่อไปนี้ซึ่งข้อใดข้อหนึ่งเพียงพอสำหรับความแตกต่าง: 1) แฮชที่เรากำลังพูดถึง คือแฮชของแผนผังต้นทางทั้งหมดหลังจากกระทำไม่ใช่แฮชของความแตกต่างของเดลต้าดังนั้น C5 'มีสิ่งที่มาจาก C7 ในขณะที่ C5 ไม่มีและ 2) พาเรนต์ของ C5' แตกต่างจาก C5 และข้อมูลนี้ ยังรวมอยู่ในโหนดรูทของทรีคอมมิตที่มีผลต่อผลลัพธ์แฮช
Ozgur Murat

113

คำตอบสั้น ๆ

คุณละเว้นข้อเท็จจริงที่ว่าคุณวิ่งgit pushได้รับข้อผิดพลาดต่อไปนี้จากนั้นจึงดำเนินการต่อgit pull:

To git@bitbucket.org:username/test1.git
 ! [rejected]        dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:username/test1.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

แม้จะมีความพยายามที่จะ Git เป็นประโยชน์คำแนะนำ 'คอมไพล์ดึง' มันน่าจะไม่ใช่สิ่งที่คุณต้องการจะทำ

ถ้าคุณคือ:

  • ทำงานกับ "สาขาคุณลักษณะ" หรือ "สาขานักพัฒนา" เพียงอย่างเดียวจากนั้นคุณสามารถเรียกใช้git push --forceเพื่ออัปเดตระยะไกลโดยใช้การคอมมิตหลังการรีเบสของคุณ ( ตามคำตอบของผู้ใช้ 4405677 )
  • การทำงานในสาขากับนักพัฒนาหลายคนในเวลาเดียวกันคุณอาจไม่ควรใช้git rebaseตั้งแต่แรก หากต้องการอัปเดตdevด้วยการเปลี่ยนแปลงmasterคุณควรใช้แทนการเรียกใช้git rebase master devให้รันgit merge masterในขณะที่เปิดdev( ตามคำตอบของจัสติน )

คำอธิบายที่ยาวขึ้นเล็กน้อย

แต่ละคอมมิตแฮชใน Git ขึ้นอยู่กับปัจจัยหลายประการซึ่งหนึ่งในนั้นคือแฮชของคอมมิตที่มาก่อน

หากคุณเรียงลำดับคอมมิตใหม่คุณจะเปลี่ยนคอมมิตแฮช rebasing (เมื่อมันทำบางอย่าง) จะเปลี่ยนคอมมิตแฮช ด้วยเหตุนี้ผลลัพธ์ของการรันgit rebase master devโดยที่devไม่ซิงค์masterจะสร้างคอมมิตใหม่ (และทำให้แฮช) โดยมีเนื้อหาเดียวกันกับที่เปิดอยู่devแต่มีคอมมิตที่masterแทรกอยู่ข้างหน้า

คุณสามารถจบลงในสถานการณ์เช่นนี้ได้หลายวิธี ฉันคิดได้สองวิธี:

  • คุณสามารถมุ่งมั่นในmasterสิ่งที่คุณต้องการเป็นพื้นฐานdevในการทำงานของคุณ
  • คุณสามารถยอมรับdevสิ่งนั้นได้ถูกผลักไปที่รีโมตแล้วซึ่งคุณจะดำเนินการเปลี่ยนแปลงต่อไป (reword commits ข้อความ, เรียงลำดับคอมมิชใหม่, สควอชคอมมิต ฯลฯ )

มาทำความเข้าใจกันดีกว่าว่าเกิดอะไรขึ้น - นี่คือตัวอย่าง:

คุณมีที่เก็บ:

2a2e220 (HEAD, master) C5
ab1bda4 C4
3cb46a9 C3
85f59ab C2
4516164 C1
0e783a3 C0

ชุดเริ่มต้นของการคอมมิตเชิงเส้นในที่เก็บ

จากนั้นคุณดำเนินการเปลี่ยนแปลงคอมมิต

git rebase --interactive HEAD~3 # Three commits before where HEAD is pointing

(นี่คือที่ที่คุณจะต้องใช้คำของฉัน: มีหลายวิธีในการเปลี่ยน commits ใน Git ในตัวอย่างนี้ฉันเปลี่ยนเวลาC3แต่คุณกำลังแทรกคอมมิตใหม่เปลี่ยนข้อความคอมมิตการจัดลำดับคอมมิตใหม่ squashing กระทำร่วมกัน ฯลฯ )

ba7688a (HEAD, master) C5
44085d5 C4
961390d C3
85f59ab C2
4516164 C1
0e783a3 C0

การกระทำเดียวกันกับแฮชใหม่

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

บันทึกกราฟที่แสดงว่าต้นแบบไม่ซิงค์กับรีโมท

การพยายามพุชจะแสดงข้อผิดพลาด (และคำใบ้ว่าคุณควรเรียกใช้git pull)

$ git push origin master
To git@bitbucket.org:username/test1.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:username/test1.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

หากเราเรียกใช้git pullเราจะเห็นบันทึกนี้:

7df65f2 (HEAD, master) Merge branch 'master' of bitbucket.org:username/test1
ba7688a C5
44085d5 C4
961390d C3
2a2e220 (origin/master) C5
85f59ab C2
ab1bda4 C4
4516164 C1
3cb46a9 C3
0e783a3 C0

หรือแสดงวิธีอื่น:

บันทึกกราฟที่แสดงการรวมคอมมิต

และตอนนี้เรามีการคอมมิตซ้ำในเครื่อง ถ้าเราจะเรียกใช้git pushเราจะส่งไปที่เซิร์ฟเวอร์

เพื่อหลีกเลี่ยงการมาถึงขั้นตอนนี้เราสามารถวิ่งได้git push --force(โดยที่เราวิ่งแทนgit pull) สิ่งนี้จะส่งความมุ่งมั่นของเรากับแฮชใหม่ไปยังเซิร์ฟเวอร์โดยไม่มีปัญหา ในการแก้ไขปัญหาในขั้นตอนนี้เราสามารถรีเซ็ตกลับไปก่อนที่เราจะวิ่งได้git pull:

ดูที่ reflog ( git reflog) เพื่อดูสิ่งที่กระทำกัญชาคือก่อนที่git pullเราวิ่ง

070e71d HEAD@{1}: pull: Merge made by the 'recursive' strategy.
ba7688a HEAD@{2}: rebase -i (finish): returning to refs/heads/master
ba7688a HEAD@{3}: rebase -i (pick): C5
44085d5 HEAD@{4}: rebase -i (pick): C4
961390d HEAD@{5}: commit (amend): C3
3cb46a9 HEAD@{6}: cherry-pick: fast-forward
85f59ab HEAD@{7}: rebase -i (start): checkout HEAD~~~
2a2e220 HEAD@{8}: rebase -i (finish): returning to refs/heads/master
2a2e220 HEAD@{9}: rebase -i (start): checkout refs/remotes/origin/master
2a2e220 HEAD@{10}: commit: C5
ab1bda4 HEAD@{11}: commit: C4
3cb46a9 HEAD@{12}: commit: C3
85f59ab HEAD@{13}: commit: C2
4516164 HEAD@{14}: commit: C1
0e783a3 HEAD@{15}: commit (initial): C0

ดังกล่าวข้างต้นเราจะเห็นว่าเป็นกระทำเราอยู่ที่ก่อนที่จะใช้ba7688a git pullกับที่กระทำกัญชาในมือเราสามารถตั้งค่ากลับไปที่ ( git reset --hard ba7688a) git push --forceและเรียกใช้แล้ว

และเราทำเสร็จแล้ว

แต่เดี๋ยวก่อนฉันยังคงทำงานพื้นฐานจากการกระทำที่ซ้ำกัน

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

หน้าตาเป็นอย่างไร:

3b959b4 (HEAD, master) C10
8f84379 C9
0110e93 C8
6c4a525 C7
630e7b4 C6
070e71d (origin/master) Merge branch 'master' of bitbucket.org:username/test1
ba7688a C5
44085d5 C4
961390d C3
2a2e220 C5
85f59ab C2
ab1bda4 C4
4516164 C1
3cb46a9 C3
0e783a3 C0

บันทึก Git ที่แสดงการคอมมิตเชิงเส้นบนการคอมมิตที่ซ้ำกัน

หรือแสดงวิธีอื่น:

กราฟบันทึกที่แสดงการคอมมิชชันเชิงเส้นบนการคอมมิตที่ซ้ำกัน

ในสถานการณ์นี้เราต้องการลบการคอมมิตที่ซ้ำกันออก แต่ยังคงไว้ซึ่งการคอมมิตที่เรามีอยู่ - เราต้องการให้ C6 ถึง C10 เช่นเดียวกับสิ่งต่างๆส่วนใหญ่มีหลายวิธีในการดำเนินการนี้:

ทั้ง:

  • สร้างสาขาใหม่ที่ผ่านมาซ้ำกระทำ1 , cherry-pickแต่ละกระทำ (C6 ผ่าน C10 รวม) เข้าสู่ที่สาขาใหม่และการรักษาที่สาขาใหม่เป็นที่ยอมรับ
  • Run git rebase --interactive $commitซึ่ง$commitเป็นกระทำก่อนที่ทั้งสองกระทำซ้ำ2 ที่นี่เราสามารถลบบรรทัดสำหรับรายการที่ซ้ำกันได้ทันที

1ไม่สำคัญว่าคุณจะเลือกแบบไหนba7688aหรือ2a2e220ทำงานได้ดี

285f59abในตัวอย่างมันจะเป็น

TL; DR

ตั้งค่าadvice.pushNonFastForwardเป็นfalse:

git config --global advice.pushNonFastForward false

1
สามารถทำตามคำแนะนำ "git pull ... " ได้ตราบใดที่รู้ว่าจุดไข่ปลาซ่อนตัวเลือก "--rebase" (หรือที่เรียกว่า "-r") ;-)
G. Sylvie Davies

4
ฉันจะแนะนำให้ใช้git push's --force-with-leaseปัจจุบันเป็นมันเริ่มต้นที่ดีกว่า
Whymarrh

4
เป็นคำตอบนี้หรือไทม์แมชชีน ขอบคุณ!
ZeMoon

คำอธิบายที่เรียบร้อยมาก ... ฉันสะดุดกับปัญหาที่คล้ายกันซึ่งทำซ้ำรหัสของฉัน 5-6 ครั้งหลังจากที่ฉันพยายาม rebase ซ้ำ ๆ ... เพื่อให้แน่ใจว่ารหัสเป็นปัจจุบันกับต้นแบบ ... แต่ทุกครั้งที่กด ใหม่มุ่งมั่นกับสาขาของฉันทำซ้ำรหัสของฉันด้วย คุณช่วยบอกฉันได้ไหมว่าการบังคับผลักดัน (พร้อมตัวเลือกการเช่า) สามารถทำได้ที่นี่หากฉันเป็นนักพัฒนาเพียงคนเดียวที่ทำงานในสาขาของฉัน หรือการรวม Master เข้ามาในเหมืองแทนการเปลี่ยนเป็นวิธีที่ดีกว่า?
Dhruv Singhal

12

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

ดังนั้นคุณจึงทำgit pullก่อนการกดครั้งสุดท้ายซึ่งส่งผลให้มีการผสานรวมกับ C6 และ C6 'ในฐานะผู้ปกครองซึ่งเป็นสาเหตุที่ทั้งสองจะยังคงอยู่ในรายการบันทึก รูปแบบบันทึกที่สวยกว่าอาจทำให้เห็นได้ชัดเจนยิ่งขึ้นว่าเป็นสาขาที่รวมกันของการคอมมิตที่ซ้ำกัน

หรือคุณสร้างgit pull --rebase(หรือไม่มีความชัดเจน--rebaseหากเป็นนัยโดยการกำหนดค่าของคุณ) แทนซึ่งดึง C5 และ C6 ดั้งเดิมกลับมาใน dev ในเครื่องของคุณ (และรีเบรนใหม่ต่อไปนี้เป็นแฮชใหม่ C7 'C5' 'C6' ')

วิธีหนึ่งในการแก้ปัญหานี้คือการgit push -fบังคับให้เกิดข้อผิดพลาดและล้าง C5 C6 จากจุดเริ่มต้น แต่ถ้ามีใครดึงพวกเขาก่อนที่คุณจะเช็ดพวกเขาคุณจะมีปัญหามากขึ้น โดยพื้นฐานแล้วทุกคนที่มี C5 C6 จะต้องทำขั้นตอนพิเศษเพื่อกำจัดพวกมัน นั่นคือเหตุผลที่พวกเขาบอกว่าคุณไม่ควรตั้งฐานข้อมูลใหม่ที่เผยแพร่ไปแล้ว ยังคงทำได้หากกล่าวว่า "การเผยแพร่" อยู่ในทีมเล็ก ๆ


1
การละเว้นgit pullเป็นสิ่งสำคัญ คำแนะนำของgit push -fคุณในขณะที่อันตรายอาจเป็นสิ่งที่ผู้อ่านกำลังมองหา
Whymarrh

จริง ย้อนกลับไปตอนที่ฉันเขียนคำถามที่ฉันทำจริงๆgit push --forceเพื่อดูว่า Git กำลังจะทำอะไร ฉันได้เรียนรู้มากมายเกี่ยวกับ Git ตั้งแต่นั้นมาและปัจจุบันrebaseเป็นส่วนหนึ่งของเวิร์กโฟลว์ปกติของฉัน อย่างไรก็ตามฉันทำgit push --force-with-leaseเพื่อหลีกเลี่ยงการเขียนทับงานของคนอื่น
elitalon

การใช้--force-with-leaseเป็นค่าเริ่มต้นที่ดีฉันจะแสดงความคิดเห็นไว้ใต้คำตอบของฉันเช่นกัน
Whymarrh

2

ฉันพบว่าในกรณีของฉันปัญหานี้เป็นผลมาจากปัญหาการกำหนดค่า Git (เกี่ยวข้องกับการดึงและรวม)

คำอธิบายปัญหา:

Sympthoms:ทำซ้ำในสาขาย่อยหลังจาก rebase ซึ่งหมายถึงการผสานจำนวนมากระหว่างและหลัง rebase

เวิร์กโฟลว์: นี่คือขั้นตอนของเวิร์กโฟลว์ที่ฉันกำลังดำเนินการ:

  • ทำงานใน "คุณลักษณะ - สาขา" (ส่วนย่อยของ "สาขาการพัฒนา")
  • ยอมรับและผลักดันการเปลี่ยนแปลงใน "คุณลักษณะ - สาขา"
  • ชำระเงิน "สาขาการพัฒนา" (สาขาแม่ของคุณลักษณะ) และดำเนินการกับมัน
  • มุ่งมั่นและผลักดันการเปลี่ยนแปลงใน "สาขาการพัฒนา"
  • ชำระเงิน "คุณสมบัติ - สาขา" และดึงการเปลี่ยนแปลงจากที่เก็บ (ในกรณีที่มีคนอื่นทำงาน)
  • Rebase "Features-branch" ไปยัง "Develop-branch"
  • แรงผลักดันของการเปลี่ยนแปลงใน "Feature-branch"

ตามที่สอดคล้องกันของเวิร์กโฟลว์นี้การทำซ้ำการกระทำทั้งหมดของ "Feature-branch" ตั้งแต่การสร้างฐานข้อมูลครั้งก่อน ... :-(

ปัญหาเกิดจากการดึงการเปลี่ยนแปลงของสาขาย่อยก่อนที่จะตั้งฐานใหม่ การกำหนดค่าการดึงเริ่มต้นของ Git คือ "ผสาน" นี่คือการเปลี่ยนแปลงดัชนีของคอมมิตที่ดำเนินการในสาขาย่อย

วิธีแก้ปัญหา: ในไฟล์คอนฟิกูเรชัน Git กำหนดค่าดึงให้ทำงานในโหมด rebase:

...
[pull]
    rebase = preserve
...

หวังว่ามันจะช่วย JN Grx ได้


1

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

หากสิ่งนี้เกิดขึ้นคุณสามารถดำเนินการดังต่อไปนี้:

git reset --hard HEAD~n

ที่ไหน n == <number of duplicate commits that shouldn't be there.>

จากนั้นตรวจสอบให้แน่ใจว่าคุณดึงจากสาขาที่ถูกต้องจากนั้นเรียกใช้:

git pull upstream <correct remote branch> --rebase

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

นี่คือการจับมือสำหรับ git rebase

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