ฉันทำผิดพลาดและไม่รู้วิธีลบข้อความ Push ล่าสุดในที่เก็บ ฉันดึงการอัปเดตล่าสุดของแอป แต่มีข้อขัดแย้งและฉันส่งไปยังที่เก็บ
จะลบคอมมิตล่าสุดของฉันได้อย่างไร? หรือแก้ไขอย่างไร?
ฉันทำผิดพลาดและไม่รู้วิธีลบข้อความ Push ล่าสุดในที่เก็บ ฉันดึงการอัปเดตล่าสุดของแอป แต่มีข้อขัดแย้งและฉันส่งไปยังที่เก็บ
จะลบคอมมิตล่าสุดของฉันได้อย่างไร? หรือแก้ไขอย่างไร?
คำตอบ:
ในตอนแรกหากคุณกำลังทำงานร่วมกับผู้อื่นในที่เก็บโค้ดเดียวกันคุณไม่ควรลบคอมมิตเนื่องจากเมื่อคุณบังคับให้อัพเดตในที่เก็บข้อมูลจะทำให้ที่เก็บในเครื่องของเพื่อนร่วมงานของคุณอยู่ในสถานะที่ผิดกฎหมาย (เช่นหากพวกเขา ทำการคอมมิตหลังจากที่คุณลบการคอมมิตเหล่านั้นจะไม่ถูกต้องเนื่องจากมันขึ้นอยู่กับคอมมิตที่ไม่มีอยู่ในขณะนี้)
กล่าวว่าสิ่งที่คุณทำได้คือยกเลิกการคอมมิต ขั้นตอนนี้ทำแตกต่างกัน (คำสั่งต่างกัน) ขึ้นอยู่กับ CVS ที่คุณใช้:
ในคอมไพล์ :
git revert <commit>
เกี่ยวกับMercurial :
hg backout <REV>
แก้ไข: การดำเนินการย้อนกลับจะสร้างคอมมิตใหม่ที่ตรงข้ามกับคอมมิตที่เปลี่ยนกลับ (เช่นถ้าคอมมิตเดิมเพิ่มบรรทัดการคอมมิตย้อนกลับจะลบบรรทัดนั้น) ลบการเปลี่ยนแปลงของคอมมิตที่ไม่ต้องการได้อย่างมีประสิทธิภาพโดยไม่ต้องเขียนประวัติที่เก็บใหม่
git backout <REV>
เหรอ? หรือ: hg backout <REV>
?
หากคุณไม่ได้ทำงานร่วมกับผู้อื่น (หรือพอใจที่จะสร้างความรำคาญให้กับพวกเขา)คุณสามารถลบคอมมิตออกจากสาขาบิตบัคเก็ตได้
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
โดยทั่วไปแล้วสาขาหลักจะไม่พิเศษ แต่เป็นเพียงการประชุมเท่านั้น อย่างไรก็ตาม bitbucket และ github และไซต์ที่คล้ายกันมักจะกำหนดให้มีสาขาหลัก (น่าจะเป็นเพราะง่ายกว่าการเขียนโค้ดเพิ่มเติมเพื่อจัดการกรณีที่ที่เก็บไม่มีสาขา - ไม่แน่ใจ) ดังนั้นคุณต้องสร้างสาขาใหม่และทำให้สาขาหลักนั้น:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
ใน Bitbucket ไปที่การตั้งค่าที่เก็บและเปลี่ยน "สาขาหลัก" เป็นmaster_temp
(บน Github เปลี่ยน "สาขาเริ่มต้น")
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
ไปที่ Bitbucket แล้วคุณจะเห็นประวัติที่คุณต้องการ master
ตอนนี้คุณสามารถไปที่หน้าการตั้งค่าและเปลี่ยนสาขากลับไปหน้าหลัก
กระบวนการนี้จะทำงานร่วมกับการเปลี่ยนแปลงประวัติอื่น ๆ (เช่นgit filter-branch
) คุณต้องแน่ใจว่าได้รีเซ็ตเป็นการกระทำที่เหมาะสมก่อนที่ประวัติใหม่จะแยกออกจากเก่า
แก้ไข : เห็นได้ชัดว่าคุณไม่จำเป็นต้องไปยุ่งยากกับ github เพราะคุณสามารถบังคับให้กดรีเซ็ตสาขาได้
ครั้งต่อไปที่ใครก็ตามพยายามดึงจากที่เก็บของคุณ (หากพวกเขาดึงการกระทำที่ไม่ถูกต้องไปแล้ว) การดึงจะล้มเหลว พวกเขาจะต้องรีเซ็ตเป็นคอมมิตก่อนประวัติการเปลี่ยนแปลงด้วยตนเองจากนั้นดึงอีกครั้ง
git reset HEAD^
git pull
หากพวกเขาดึงการกระทำที่ไม่ดีออกไปและมุ่งมั่นเหนือสิ่งนั้นพวกเขาจะต้องตั้งค่าใหม่จากนั้นgit cherry-pick
ความมุ่งมั่นที่ดีที่พวกเขาต้องการจะสร้างขึ้นมาใหม่อย่างมีประสิทธิภาพในการสร้างทั้งสาขาโดยไม่มีการกระทำที่ไม่ดี
หากพวกเขาไม่เคยดึงการกระทำที่ไม่ดีกระบวนการทั้งหมดนี้จะไม่ส่งผลกระทบต่อพวกเขาและสามารถดึงได้ตามปกติ
คุณสามารถรีเซ็ตเพื่อHEAD^
บังคับให้กดได้
git reset HEAD^
git push -u origin master --force
มันจะลบคอมมิตล่าสุดของคุณและจะแสดงผล bitbucket ว่าคอมมิตถูกลบ แต่จะยังคงอยู่บนเซิร์ฟเวอร์ของพวกเขา
ฉันเคยมีปัญหากับการเปลี่ยนกลับคอมไพล์ในอดีต (ส่วนใหญ่เป็นเพราะฉันไม่ค่อยแน่ใจว่ามันทำงานอย่างไร) ฉันมีปัญหาในการเปลี่ยนกลับเนื่องจากปัญหาการรวม ..
วิธีง่ายๆของฉันคือสิ่งนี้
ขั้นตอนที่ 1.
git clone <your repos URL> .
โปรเจ็กต์ของคุณในโฟลเดอร์อื่นจากนั้น:
ขั้นตอนที่ 2.
git reset --hard <the commit you wanna go to>
จากนั้นขั้นตอนที่ 3
ในโครงการล่าสุด (และหลัก) ของคุณ (อันที่มีการคอมมิตสุดท้ายที่มีปัญหา) ให้วางไฟล์ของขั้นตอนที่ 2
ขั้นตอนที่ 4.
git commit -m "Fixing the previous messy commit"
ขั้นตอนที่ 5.
สนุก
git revert
เป็นเรื่องง่าย: มันสร้างการกระทำใหม่ที่ทำย้อนกลับของการเปลี่ยนแปลงในการกระทำก่อนหน้านี้ (หรือการกระทำหลายครั้ง) ไม่ได้ลบคอมมิตดังนั้นจึงไม่เกี่ยวข้องกับคำถามนี้ นอกจากนี้ขั้นตอนการโคลนนิ่งที่นี่ก็ไม่จำเป็นจริงๆ
นี่คือแนวทางง่ายๆใน 4 ขั้นตอน:
0 - แนะนำทีมที่คุณกำลังจะแก้ไขที่เก็บ
เชื่อมต่อกับทีมและแจ้งให้พวกเขาทราบถึงการเปลี่ยนแปลงที่จะเกิดขึ้น
1 - ลบคอมมิตสุดท้าย
สมมติว่าสาขาเป้าหมายของคุณคือmaster
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
ณ จุดนี้คุณจะเสร็จสิ้นหากคุณกำลังทำงานคนเดียว
2 - แก้ไขที่เก็บในเครื่องของเพื่อนร่วมทีมของคุณ
ในเพื่อนร่วมทีมของคุณ:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
หากเพื่อนร่วมทีมของคุณไม่มีความมุ่งมั่นใหม่คุณก็มาถึงจุดนี้และคุณควรจะซิงค์กัน
3 - นำการกระทำที่เสียไปกลับคืนมา
สมมติว่าเพื่อนร่วมทีมมีคอมมิตใหม่และไม่ได้เผยแพร่ซึ่งหายไปในกระบวนการนี้
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
ทำสิ่งนี้ให้ได้มากที่สุดเท่าที่จำเป็น
ฉันใช้แนวทางนี้สำเร็จหลายครั้ง ต้องใช้ความพยายามของทีมเพื่อให้แน่ใจว่าทุกอย่างตรงกัน
ขณะที่คนอื่น ๆ ได้กล่าวว่าปกติคุณต้องการที่จะใช้หรือhg backout
git revert
อย่างไรก็ตามบางครั้งคุณต้องการกำจัดการกระทำจริงๆ
ขั้นแรกคุณจะต้องไปที่การตั้งค่าที่เก็บของคุณ คลิกที่Strip commits
ลิงค์
Preview strip
ใส่รหัสประจำเซ็ตสำหรับเซ็ตที่คุณต้องการที่จะทำลายและคลิก ซึ่งจะช่วยให้คุณเห็นว่าคุณกำลังจะทำอะไรเสียหายก่อนที่จะทำ จากนั้นเพียงคลิกConfirm
และคอมมิตของคุณจะไม่มีประวัติอีกต่อไป ตรวจสอบให้แน่ใจว่าคุณได้บอกผู้ทำงานร่วมกันทั้งหมดว่าคุณได้ทำอะไรไปเพื่อที่พวกเขาจะไม่ผลักดันการกระทำที่ไม่เหมาะสมกลับไปโดยไม่ได้ตั้งใจ
เมื่อทำการเปลี่ยนแปลงแล้วจะไม่สามารถลบได้ เนื่องจากลักษณะพื้นฐานของการกระทำคือไม่ต้องลบ
สิ่งที่คุณทำได้ (วิธีที่ง่ายและปลอดภัย)
Rebase แบบโต้ตอบ:
1) git rebase -i HEAD~2
# จะแสดงการกระทำ 2 ครั้งล่าสุดของคุณ
2) การคอมมิตของคุณจะแสดงรายการเช่นล่าสุดจะปรากฏที่ด้านล่างของหน้า LILO (สุดท้ายใน Last Out)
ลบแถวการกระทำสุดท้ายทั้งหมด
3) บันทึกโดยctrl+X
หรือESC:wq
ตอนนี้สาขาของคุณจะอัปเดตโดยไม่มีข้อผูกมัดครั้งสุดท้าย ..
คุณสามารถเขียนคำสั่งสำหรับ Bitbucket ตามที่Dustinกล่าวไว้:
git push -f origin HEAD^:master
หมายเหตุ: แทนที่จะเป็นผู้เชี่ยวชาญคุณสามารถใช้สาขาใดก็ได้ และจะลบเพียงแค่กด Bitbucket
ในการลบล่าสุดกระทำในท้องถิ่นในการใช้งานคอมไพล์:
git reset --hard HEAD~1
ตอนนี้ cloud bitbucket (ฉันไม่แน่ใจว่าเวอร์ชันใด) อนุญาตให้คืนค่าคอมมิตจากระบบไฟล์ได้ดังนี้ (ฉันไม่เห็นวิธีการเปลี่ยนกลับจากอินเทอร์เฟซ Bitbucket ในเบราว์เซอร์ Chrome)
- สำรองข้อมูลไดเรกทอรีทั้งหมดของคุณเพื่อป้องกันการเปลี่ยนแปลงที่คุณกระทำโดยไม่ได้ตั้งใจ
- เลือกตรวจสอบไดเรกทอรี
ปุ่มเมาส์ขวา: เมนู git เต่า
-repo-browser (ตัวเลือกเมนู "ย้อนกลับ" จะยกเลิกการเปลี่ยนแปลงที่ไม่ได้รับคำสั่งเท่านั้น)
- กดปุ่ม HEAD
- เลือกบรรทัดบนสุด (คอมมิตสุดท้าย)
- ปุ่มเมาส์ขวา: ยกเลิกการเปลี่ยนแปลงตามการกระทำนี้
- หลังจากยกเลิกการเปลี่ยนแปลงบนระบบไฟล์แล้วให้กดกระทำ
- อัปเดต GIT ด้วยข้อความ 'Revert (ข้อความก่อนหน้าของคุณ) สิ่งนี้ย้อนกลับกระทำอย่างนั้น ๆ '
- เลือก 'กระทำและผลักดัน'