วิธีลบคอมมิตออกจากคำขอดึง


116

ฉันได้ร้องขอการดึงข้อมูล แต่หลังจากนั้นฉันได้ดำเนินการบางอย่างกับโครงการในพื้นที่ซึ่งทำให้คำขอดึงของฉันเกิดมลพิษฉันพยายามลบออก แต่ไม่มีโชค

ฉันพบคำถามที่คล้ายกันใน StackOverflow แต่ฉันใช้สิ่งที่อยู่ในนั้นไม่ได้ นี่เป็นคำขอดึง GitHub ครั้งแรกของฉันดังนั้นจึงเป็นเรื่องแปลกสำหรับฉันว่าทั้งหมดนี้ทำงานอย่างไร

คอมมิตที่ไฮไลต์คือสิ่งที่ฉันต้องเก็บและลบสิ่งอื่น ๆ ทั้งหมด มันกลายเป็นการกระทำครั้งที่สี่ในประวัติศาสตร์เพราะฉันทำบางอย่างรวมเข้าด้วยกัน

ป้อนคำอธิบายภาพที่นี่

บันทึกคอมไพล์ของฉัน ป้อนคำอธิบายภาพที่นี่

ใครช่วยอธิบายว่าเกิดอะไรขึ้นและจะแก้ไขปัญหานี้ได้อย่างไร


2
คุณต้องrebaseและเลือกคอมมิต "ที่เพิ่มจาก github" เท่านั้น (เช่นแสดงความคิดเห็นในบรรทัดสำหรับคอมมิตอื่น ๆ )
Robbie Averill

1
กำหนดสาขาใหม่เป็นสาขาอะไรได้โปรดอธิบายเพิ่มเติม
อับอาย

what branch= สาขาที่คุณกำลังทำงานonto what branch= สาขาที่คุณขอเข้า
Robbie Averill

ฉันอธิบายสิ่งที่ @Robbie Averill บอกเป็นนัยในคำตอบของฉัน เป็นเรื่องแปลกที่ไม่มีใครเขียนคำตอบอธิบายเรื่องนี้จนถึงตอนนี้
ferit

ที่เกี่ยวข้อง: stackoverflow.com/questions/62951901/…
gman

คำตอบ:


116

คุณมีเทคนิคหลายอย่างที่ต้องทำ

โพสต์นี้ - อ่านส่วนเกี่ยวกับการเปลี่ยนกลับจะอธิบายรายละเอียดสิ่งที่เราต้องการทำและวิธีการทำ

นี่คือวิธีแก้ปัญหาที่ง่ายที่สุด:

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
git push origin <branch>

คำสั่ง revert จะสร้างการกระทำใหม่พร้อมกับการยกเลิกการกระทำเดิม


2
มันใช้งานได้หรือไม่แม้ว่าเราจะแยกโครงการจากบุคคลอื่นและต้องการลบความคิดเห็นบางส่วนในคำขอให้ดึงออก
Dr.jacky

127

ผู้คนไม่ต้องการเห็นการกระทำที่ไม่ถูกต้องและยกเลิกการกระทำที่จะยกเลิกการเปลี่ยนแปลงการกระทำที่ไม่ถูกต้อง ก่อมลพิษนี้ก่อประวัติศาสตร์

นี่คือวิธีง่ายๆในการลบคอมมิตที่ไม่ถูกต้องแทนที่จะเลิกทำการเปลี่ยนแปลงด้วยการย้อนกลับคอมมิต

  1. git checkout my-pull-request-branch

  2. git rebase -i HEAD~n// nจำนวนคอมมิตสุดท้ายที่คุณต้องการรวมไว้ใน rebase เชิงโต้ตอบอยู่ที่ไหน

  3. แทนที่pickด้วยdropสำหรับคอมมิตที่คุณต้องการทิ้ง
  4. บันทึกและออก.
  5. git push --force

8
สิ่งนี้ได้ผลสำหรับฉันเหมือนมีเสน่ห์ ฉันมีความมุ่งมั่นมากมายที่ไม่ควรอยู่ใน PR ฉันแค่โต้ตอบมันใหม่ทิ้ง
คำมั่น

6
เพื่อผลักดันฉันต้องทำ: git push origin HEAD:myBranch --force. แต่เป็นอย่างอื่นที่ดีและเป็นประโยชน์
ScottyBlades

4
สิ่งนี้มีประโยชน์เช่นกันเมื่อคุณต้องการแก้ไข PR แบบเปิดใน GitHub คุณเพียงแค่ต้องสามารถกดบังคับได้
Vladimir Hidalgo

2
คุณหมายถึงอะไร "แทนที่pickด้วยdropสำหรับคอมมิตที่คุณต้องการทิ้ง"
jorijnsmit

2
@jorijnsmit พวกเขาหมายถึงหลังจากทำงานgit rebase -i HEAD~<n>ที่ด้านบนของไฟล์มีการจะสายของกระทำกับแต่ละบรรทัดที่มีข้อความ<n> pick <commit id>ค่าคอมpickมิตเป็นค่าเริ่มต้นดังนั้นสำหรับทุกคอมมิตที่คุณต้องการยกเลิกให้เปลี่ยนข้อความpickเป็นdrop
สลิม

6

หากคุณกำลังลบคอมมิตและไม่ต้องการเก็บการเปลี่ยนแปลง @ferit มีทางออกที่ดี

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

  1. ใช้ git rebase -i HEAD~n
  2. สลับการคอมมิตที่คุณต้องการลบไปที่ตำแหน่งล่างสุด (ล่าสุด)
  3. บันทึกและออก
  4. ใช้git reset HEAD^ --softเพื่อยกเลิกคำสั่งการเปลี่ยนแปลงและนำกลับมาในสถานะที่จัดฉาก
  5. ใช้git push --forceเพื่ออัปเดตสาขาระยะไกลโดยไม่ต้องคอมมิตที่ถูกลบออก

ตอนนี้คุณจะลบคอมมิตออกจากรีโมตแล้ว แต่จะยังคงมีการเปลี่ยนแปลงอยู่


2

ให้ทำดังต่อไปนี้

ให้บอกว่าชื่อสาขาของคุณคือ my_branch และมีข้อผูกมัดเพิ่มเติม

  1. git checkout -b my_branch_with_extra_commits (เก็บสาขานี้ไว้ภายใต้ชื่ออื่น)
  2. gitk (เปิด git console)
  3. มองหาการกระทำที่คุณต้องการเก็บไว้ คัดลอก SHA ของคอมมิตนั้นไปยังแผ่นจดบันทึก
  4. git checkout my_branch
  5. gitk (สิ่งนี้จะเปิดคอนโซล git)
  6. คลิกขวาที่การคอมมิตที่คุณต้องการเปลี่ยนกลับ (ระบุก่อนการเปลี่ยนแปลงของคุณ) แล้วคลิกที่ " reset branch to here"
  7. ทำ git pull --rebase origin branch_name_to _merge_to
  8. git cherry-pick <SHA you copied in step 3. >

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


0

นี่คือสิ่งที่ช่วยฉัน:

  1. สร้างสาขาใหม่ด้วยสาขาที่มีอยู่ ขอเรียกหนึ่งที่มีอยู่เดิมและใหม่เป็นbranch_oldbranch_new

  2. รีเซ็ตbranch_newเป็นสถานะเสถียรเมื่อคุณไม่มีปัญหาในการคอมมิตเลย ตัวอย่างเช่นหากต้องการบรรจุในระดับปริญญาโทในพื้นที่ของคุณให้ทำดังต่อไปนี้:

    รีเซ็ตคอมไพล์ - พุชคอมไพล์หลักที่ยาก - บังคับจุดเริ่มต้น

  3. cherry-pickการกระทำจากbranch_oldเข้าbranch_new

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