ลบการกระทำล่าสุดใน bitbucket


103

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

จะลบคอมมิตล่าสุดของฉันได้อย่างไร? หรือแก้ไขอย่างไร?

คำตอบ:


102

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

กล่าวว่าสิ่งที่คุณทำได้คือยกเลิกการคอมมิต ขั้นตอนนี้ทำแตกต่างกัน (คำสั่งต่างกัน) ขึ้นอยู่กับ CVS ที่คุณใช้:

ในคอมไพล์ :

git revert <commit>

เกี่ยวกับMercurial :

hg backout <REV>

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


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

git backout <REV>เหรอ? หรือ: hg backout <REV>?
Armando PérezMarqués

แต่จะเกิดอะไรขึ้นถ้าการคอมมิตที่เพิ่มเข้ามาหลังจากที่จะเปลี่ยนกลับได้ทำการแก้ไขในบรรทัดที่ถูกลบ?
rahs

@RahulSaha เนื่องจากสิ่งที่คุณกำลังทำอยู่นั้นโดยพื้นฐานแล้วพยายามที่จะรวมการกระทำเข้ากับสาขาฉันค่อนข้างมั่นใจว่ามันจะทำให้คุณมีข้อขัดแย้งที่รวมเข้าด้วยกัน
asermax

98

หากคุณไม่ได้ทำงานร่วมกับผู้อื่น (หรือพอใจที่จะสร้างความรำคาญให้กับพวกเขา)คุณสามารถลบคอมมิตออกจากสาขาบิตบัคเก็ตได้

หากคุณกำลังพยายามเปลี่ยนสาขาที่ไม่ใช่สาขาหลัก:

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ความมุ่งมั่นที่ดีที่พวกเขาต้องการจะสร้างขึ้นมาใหม่อย่างมีประสิทธิภาพในการสร้างทั้งสาขาโดยไม่มีการกระทำที่ไม่ดี

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


1
สำหรับผู้ที่สะดวกสบายมากขึ้นในการใช้ SourceTree: 1) หากต้องการเปลี่ยนสาขาหลักใน UI เว็บสำหรับ BitBucket ให้ดูที่การตั้งค่า Repo 2) หากต้องการลบสาขาใน UI ของเว็บให้ดูที่หน้าสาขา 3) รีเซ็ต repo ท้องถิ่นตามด้านบน 4) ผลักดันการเปลี่ยนแปลงในท้องถิ่นของคุณเพื่อสร้างสาขาเหล่านั้นใหม่
Richard Le Mesurier

2
ในฐานะคนที่ดันความลับโดยบังเอิญฉันชอบความละเอียดถี่ถ้วนของคำตอบนี้มาก ขอบคุณ!
แรงบิด

48

คุณสามารถรีเซ็ตเพื่อHEAD^บังคับให้กดได้

git reset HEAD^
git push -u origin master --force

มันจะลบคอมมิตล่าสุดของคุณและจะแสดงผล bitbucket ว่าคอมมิตถูกลบ แต่จะยังคงอยู่บนเซิร์ฟเวอร์ของพวกเขา


Github อนุญาตให้ทำสิ่งนี้ได้ แต่ในขณะที่เขียนนี้ Bitbucket ไม่อนุญาตให้ใช้แรงผลัก
JamesQMurphy

4
จริง ๆ แล้ว bitbucket รองรับแรงผลักดันเพียงแค่ความแตกต่างแทนที่จะลบการกระทำที่ไม่ได้ติดตามอย่างสมบูรณ์มันจะทำเครื่องหมายว่าถูกลบ
Shubanker

วิธีที่แนะนำจาก bitbucket คือใช้ revert แต่ฉันคิดว่าในกรณีของฉันนี่เหมาะสมกว่า เนื่องจากฉันเป็นคนเดียวที่ใช้มันและรู้สึกสะอาดมากกว่าใช้การย้อนกลับ ขอบคุณ.
nafsaka

1
ใช่สิ่งนี้ใช้ได้กับ Bitbucket คุณเพิ่งช่วยฉันครั้งใหญ่! ฉันได้กระทำ / ผลักดันจาก Eclipse ของฉันและผสมกับโปรเจ็กต์อื่น ๆ ที่ฉันมี ส่วนหนึ่งเกิดจากการปฏิบัติที่ไม่ดีจากส่วนของฉันโดยใช้ทั้งบรรทัดคำสั่งและ eclipse ในตัวสำหรับการทำงานกับคอมไพล์
DarkCygnus

ยอดเยี่ยมหรือง่ายกว่า: รีเซ็ตสาขาปัจจุบันเป็นคอมมิตนี้จากนั้นใช้แรงผลักไปที่เซิร์ฟเวอร์แก้ไขปัญหาของฉัน
Anthony Kal

3

ฉันเคยมีปัญหากับการเปลี่ยนกลับคอมไพล์ในอดีต (ส่วนใหญ่เป็นเพราะฉันไม่ค่อยแน่ใจว่ามันทำงานอย่างไร) ฉันมีปัญหาในการเปลี่ยนกลับเนื่องจากปัญหาการรวม ..

วิธีง่ายๆของฉันคือสิ่งนี้

ขั้นตอนที่ 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.

สนุก


1
การตัดและวางเป็นเรื่องที่ยุ่งมาก นอกจากนี้สิ่งนี้จะไม่สามารถแก้ปัญหาได้จากคำถาม
Daniel Lee

1
git revertเป็นเรื่องง่าย: มันสร้างการกระทำใหม่ที่ทำย้อนกลับของการเปลี่ยนแปลงในการกระทำก่อนหน้านี้ (หรือการกระทำหลายครั้ง) ไม่ได้ลบคอมมิตดังนั้นจึงไม่เกี่ยวข้องกับคำถามนี้ นอกจากนี้ขั้นตอนการโคลนนิ่งที่นี่ก็ไม่จำเป็นจริงๆ
naught101

1
Git revert เป็นกลไกที่เท่าเทียมกันดังกล่าวข้างต้น
nafsaka

3

นี่คือแนวทางง่ายๆใน 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>

ทำสิ่งนี้ให้ได้มากที่สุดเท่าที่จำเป็น

ฉันใช้แนวทางนี้สำเร็จหลายครั้ง ต้องใช้ความพยายามของทีมเพื่อให้แน่ใจว่าทุกอย่างตรงกัน


2

ขณะที่คนอื่น ๆ ได้กล่าวว่าปกติคุณต้องการที่จะใช้หรือhg backout git revertอย่างไรก็ตามบางครั้งคุณต้องการกำจัดการกระทำจริงๆ

ขั้นแรกคุณจะต้องไปที่การตั้งค่าที่เก็บของคุณ คลิกที่Strip commitsลิงค์

Strip คอมมิตลิงค์ในการตั้งค่า bitbucket

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


เวอร์ชันใดและต้องใช้สิทธิ์ใด มันดูแตกต่างออกไปใน v6.4.3 ที่ฉันกำลังดูอยู่และไม่มีรายการนี้ ฉันเป็นผู้ดูแลระบบที่เก็บข้อมูล
Raphael

1

เมื่อทำการเปลี่ยนแปลงแล้วจะไม่สามารถลบได้ เนื่องจากลักษณะพื้นฐานของการกระทำคือไม่ต้องลบ

สิ่งที่คุณทำได้ (วิธีที่ง่ายและปลอดภัย)

Rebase แบบโต้ตอบ:

1) git rebase -i HEAD~2 # จะแสดงการกระทำ 2 ครั้งล่าสุดของคุณ

2) การคอมมิตของคุณจะแสดงรายการเช่นล่าสุดจะปรากฏที่ด้านล่างของหน้า LILO (สุดท้ายใน Last Out)

ใส่คำอธิบายภาพที่นี่

ลบแถวการกระทำสุดท้ายทั้งหมด

3) บันทึกโดยctrl+XหรือESC:wq

ตอนนี้สาขาของคุณจะอัปเดตโดยไม่มีข้อผูกมัดครั้งสุดท้าย ..


1

คุณสามารถเขียนคำสั่งสำหรับ Bitbucket ตามที่Dustinกล่าวไว้:

git push -f origin HEAD^:master

หมายเหตุ: แทนที่จะเป็นผู้เชี่ยวชาญคุณสามารถใช้สาขาใดก็ได้ และจะลบเพียงแค่กด Bitbucket

ในการลบล่าสุดกระทำในท้องถิ่นในการใช้งานคอมไพล์:

git reset --hard HEAD~1

0

ตอนนี้ cloud bitbucket (ฉันไม่แน่ใจว่าเวอร์ชันใด) อนุญาตให้คืนค่าคอมมิตจากระบบไฟล์ได้ดังนี้ (ฉันไม่เห็นวิธีการเปลี่ยนกลับจากอินเทอร์เฟซ Bitbucket ในเบราว์เซอร์ Chrome)

- สำรองข้อมูลไดเรกทอรีทั้งหมดของคุณเพื่อป้องกันการเปลี่ยนแปลงที่คุณกระทำโดยไม่ได้ตั้งใจ

- เลือกตรวจสอบไดเรกทอรี

ปุ่มเมาส์ขวา: เมนู git เต่า

-repo-browser (ตัวเลือกเมนู "ย้อนกลับ" จะยกเลิกการเปลี่ยนแปลงที่ไม่ได้รับคำสั่งเท่านั้น)

- กดปุ่ม HEAD

- เลือกบรรทัดบนสุด (คอมมิตสุดท้าย)

- ปุ่มเมาส์ขวา: ยกเลิกการเปลี่ยนแปลงตามการกระทำนี้

- หลังจากยกเลิกการเปลี่ยนแปลงบนระบบไฟล์แล้วให้กดกระทำ

- อัปเดต GIT ด้วยข้อความ 'Revert (ข้อความก่อนหน้าของคุณ) สิ่งนี้ย้อนกลับกระทำอย่างนั้น ๆ '

- เลือก 'กระทำและผลักดัน'

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