มีวิธีในการทำซ้ำการคอมไพล์ด้วยคอมไพล์หรือไม่?


17

ดังนั้นฉันจึงทำผิดพลาดครั้งใหญ่ ฉันสร้างคอมมิชชัน, ดึง, ผสาน (แต่ทำให้รหัสสับสนระหว่างที่ทำเช่นนั้น) จากนั้นผลัก ฉันต้องการที่จะทำซ้ำที่ผสานและได้รับรหัสที่ถูกต้อง มีวิธีการทำเช่นนี้?

ฉันใช้ bitbucket

git 

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

คำตอบ:


13

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

สมมติว่าประวัติของคุณมีลักษณะเช่นนี้ (และ M เป็นผสานผสาน):

-A--B--C--M (master points here)
  \      /
   D----E

การทำงานgit checkout -b merge_fix <commit ID E>สร้างสาขาก่อนที่เราจะทำผิดพลาด:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

ทีนี้มารวมกันที่สาขาใหม่ของเรา เราไม่สามารถรวมเข้าด้วยกันได้masterดังนั้นเราต้องเลือกการกระทำด้วยตนเองก่อนที่จะทำการรวมที่ไม่ดี: git merge <commit ID C>อย่าทำผิดพลาดแบบเดียวกับที่คุณทำครั้งสุดท้าย!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

สมมติว่าคอมมิชชันGดูดีตอนนี้เราต้องการซิงค์กับส่วนบนของmasterสาขา คำสั่งนี้บอกให้คอมไพล์เพิกเฉยต่อการเปลี่ยนแปลงที่เกิดขึ้นกับต้นแบบและบังคับให้การเปลี่ยนแปลงของเรากลายเป็นผลการผสาน:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

สุดท้าย (สมมติว่าการคอมมิชชันนั้นHดูดีอีกครั้งเราต้องการส่งต่ออย่างรวดเร็วmasterเพื่อรวมการผสานถาวรของเรา:

git checkout master
git merge merge_fix

นี่เป็นเพียงการย้ายmasterตัวชี้ไปที่สาขาHแต่ฉันจะใช้โอกาสนี้เพื่อล้างค่า ASCII art ของฉัน:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

และคุณมีมัน! คุณทำการผสานอีกครั้งสำเร็จโดยไม่ทำให้ประวัติถูกต้อง!


6

คุณสามารถทำได้เช่นนี้

  1. รีเซ็ตเป็นคอมมิชชันก่อนทำการผสาน
  2. ทำการผสานอีกครั้ง
  3. แรงผลักดัน

นั่นคือ:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

เพียงจำไว้ว่าgit push --forceจะเขียนสิ่งที่คุณมีที่สาขาระยะไกลและคนอื่น ๆ ที่ใช้สาขานั้นอาจได้รับผลกระทบจากเรื่องนี้เช่นกัน (โดยปกติคุณไม่ควรทำเช่นนี้)


6
แค่จำไว้ว่าการทำgit push --forceไม่ปลอดภัย
Zepplock

1

git merge --abort จากนั้นคุณสามารถรวมอีกครั้ง


ฉันเพิ่งได้รับข้อความ "ไม่มีการรวมที่จะยกเลิก"

3
สิ่งนี้สามารถทำได้เมื่อมีข้อขัดแย้งในการรวม
chanchal118

ทำไมเครื่องหมายลบ? สิ่งนี้ช่วยฉัน
swdev

เนื่องจากคำถามเกี่ยวกับเมื่อคุณเสร็จสิ้นการผสาน (ไม่ถูกต้อง) และผลักแล้ว
Robin Green

-1

โปรดตรวจสอบความหวังนี้ว่ามีประโยชน์สำหรับคุณ

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

แม้ว่าสิ่งนี้สามารถตอบคำถาม OP ได้ แต่ลิงก์คำตอบเท่านั้นยังไม่ได้รับการยอมรับใน SO อย่างไรก็ตามคุณสามารถอ้างอิงคำตอบของคุณได้จากข้อความที่ตัดตอนมาจากลิงค์

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