ฉันจะลบคอมไพล์ที่ไม่ได้ชำระได้อย่างไร


948

ฉันตั้งใจที่จะทำผิดสาขา ฉันจะลบการส่งได้อย่างไร

คำตอบ:


1811

ลบการคอมมิทล่าสุดทำให้งานที่คุณทำ:

git reset --soft HEAD~1

ลบการคอมมิชชันล่าสุดทำลายงานที่คุณทำ:

git reset --hard HEAD~1

13
ตรวจสอบให้แน่ใจว่า HEAD ชี้ไปที่สาขา .. (ลอง
ดูก่อน

128
และตรวจสอบให้แน่ใจว่า HEAD ~ 1 เป็นความมุ่งมั่น ... คุณสามารถทำได้git reset --hard origin
Daenyth

13
คิดgit remoteรายการกำเนิดสำหรับฉันพูดว่าgit reset --hard origin fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.ทำไม?
trss

7
นี่มันเจ๋งมาก. เพิ่งช่วยชีวิตฉัน
NinjaBoy

2
git reset HEAD~1จะทำให้การเปลี่ยนแปลงของคุณทั้งหมด แต่จะทำให้คุณมีดัชนีว่างเปล่าแทนที่จะเก็บทุกอย่าง (เป็น--softตัวเลือก)
Holloway

139

ฉันสงสัยว่าทำไมคำตอบที่ดีที่สุดที่ฉันพบมีเฉพาะในความคิดเห็นเท่านั้น! ( โดย Daenyth มี 86 คะแนนขึ้นไป )

git reset --hard origin

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

git reset --hard origin/<branch>

16
ขอบคุณสำหรับสิ่งนี้ขยายคำอธิบายเล็กน้อย: สำหรับสาขาเฉพาะ:git reset --hard origin/<branch>
เคลียร์

4
หรือgit reset --soft origin/<branch>ถ้าคุณต้องการที่จะกำจัดความมุ่งมั่น แต่ยังคงทำงานในท้องถิ่น
Riverhorse

1
ฉันเข้าใจfatal: ambiguous argument 'origin': unknown revision or path not in the working tree.คุณต้องระบุสาขาเช่น:git reset --hard origin/feature/my-cool-stuff
Kip

ยอดเยี่ยม! ใช้งานได้จริงซึ่งแตกต่างจากคำตอบ "ยอมรับ" ซึ่งเพิ่งแยกหัวและใบคุณแขวน
แม่

55

อย่าลบมัน: เพียงหนึ่งการกระทำ git cherry-pickก็เพียงพอแล้ว

แต่ถ้าคุณมีข้อผูกพันหลายอย่างในสาขาที่ผิดนั่นคือที่git rebase --ontoส่อง:

สมมติว่าคุณมีสิ่งนี้:

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

จากนั้นคุณสามารถทำเครื่องหมายmasterและย้ายไปที่ที่คุณต้องการ:

 git checkout master
 git branch tmp
 git checkout y
 git branch -f master

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

รีเซ็ตสาขา y ที่ควรจะเป็น:

 git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

และในที่สุดก็ย้ายคอมมิชชันของคุณ (นำไปใช้ใหม่ทำให้คอมมิทใหม่จริง ๆ )

 git rebase --onto tmp y master
 git branch -D tmp


 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

น่าเสียดายที่ไม่ใช่คำถาม
KatariaA

1
@KatariaA เป็นทางเลือกที่ถูกต้องในการลบการกระทำที่ทำผิดสาขาและจะช่วยเหลือผู้อื่นในสถานการณ์เดียวกัน (การกระทำที่ดีในสาขาที่ผิด)
VonC


6

หากคุณต้องการย้ายการกระทำนั้นไปยังสาขาอื่นให้รับ SHA ของการกระทำที่เป็นปัญหา

git rev-parse HEAD

จากนั้นสลับสาขาปัจจุบัน

git checkout other-branch

และcherry-pickมุ่งมั่นที่จะother-branch

git cherry-pick <sha-of-the-commit>

จากประสบการณ์ของฉันสิ่งนี้ไม่ได้ยกเลิกการผูกมัดจากสาขาดั้งเดิมดังนั้นจึงจำเป็นต้องใช้ในgit reset --hard HEAD~1ภายหลัง ฉันคิดว่าการใช้การreset --softสลับสาขาแล้วและยืนยันอีกครั้งจะช่วยประหยัดงานพิเศษได้ จากนั้นอีกครั้งฉันใช้ SourceTree เพื่อทำสิ่งพื้นฐานส่วนใหญ่ของฉันเพียงแค่ใช้บรรทัดคำสั่งกับสิ่งนี้หลังจากข้อผิดพลาดของฉัน
jusopi

3

สำหรับการอ้างอิงของคุณฉันเชื่อว่าคุณสามารถ "hard cut" กระทำการออกจากสาขาปัจจุบันของคุณไม่เพียง แต่กับ git reset - ฮาร์ด แต่ยังใช้คำสั่งต่อไปนี้:

git checkout -B <branch-name> <SHA>

ในความเป็นจริงหากคุณไม่สนใจที่จะเช็คเอาท์คุณสามารถตั้งสาขาเป็นสิ่งที่คุณต้องการด้วย:

git branch -f <branch-name> <SHA>

นี่จะเป็นวิธีการเขียนโปรแกรมเพื่อลบคอมมิทจากสาขาเพื่อคัดลอกคอมมิทใหม่ (ใช้ rebase)

สมมติว่าคุณมีสาขาที่ถูกตัดการเชื่อมต่อจากต้นแบบเพราะคุณได้รับแหล่งข้อมูลจากที่ตั้งอื่น ๆ แล้วทิ้งลงในสาขา

ตอนนี้คุณมีสาขาที่คุณใช้การเปลี่ยนแปลงลองเรียกมันว่า "หัวข้อ"

ตอนนี้คุณจะสร้างซ้ำของสาขาหัวข้อของคุณแล้ว rebase มันลงบนการถ่ายโอนข้อมูลซอร์สโค้ดที่อยู่ในสาขา "การถ่ายโอนข้อมูล":

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

ตอนนี้การเปลี่ยนแปลงของคุณจะถูกนำมาใช้อีกครั้งใน topic_duplicate สาขาตามจุดเริ่มต้นของ "การถ่ายโอนข้อมูล" แต่เฉพาะการกระทำที่เกิดขึ้นตั้งแต่ "ต้นแบบ" ดังนั้นการเปลี่ยนแปลงของคุณตั้งแต่มาสเตอร์จะถูกนำมาใช้อีกครั้งที่ด้านบนของ "การถ่ายโอนข้อมูล" แต่ผลลัพธ์จะสิ้นสุดใน "topic_duplicate"

จากนั้นคุณสามารถแทนที่ "dump" ด้วย "topic_duplicate" โดยทำ:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

หรือด้วย

git branch -M topic_duplicate dump

หรือเพียงแค่ทิ้งการถ่ายโอนข้อมูล

git branch -D dump

บางทีคุณอาจจะสามารถเลือกเชอร์รี่หลังจากล้าง "topic_duplicate" ปัจจุบัน

สิ่งที่ฉันกำลังพยายามจะพูดคือถ้าคุณต้องการอัปเดตสาขา "ที่ซ้ำกัน" ในปัจจุบันโดยอิงจากบรรพบุรุษที่แตกต่างกันคุณต้องลบ "เชอร์รี่พีเพิล" ก่อนหน้านี้โดยการทำgit reset --hard <last-commit-to-retain>หรือgit branch -f topic_duplicate <last-commit-to-retain>คัดลอกคอมมิชชันอื่น ๆ สาขาหัวข้อ) โดยการลดราคาหรือเก็บเชอร์รี่

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

Cherrypicking ง่ายกว่ามาก:

git cherry-pick master..topic

ดังนั้นทั้งชุดจะลงมาที่:

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

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

ดังนั้นเพียงแสดง:

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

หวังว่านี่จะช่วยใครซักคน ฉันตั้งใจจะเขียนสิ่งนี้ แต่ฉันไม่สามารถจัดการได้ในตอนนี้ ความนับถือ.


0

คำสั่งต่อไปนี้ใช้งานได้สำหรับฉันการเปลี่ยนแปลงที่ทำไว้ภายในเครื่องทั้งหมดจะถูกทิ้ง & local จะถูกรีเซ็ตเป็นเหมือนกับสาขาต้นทาง / ต้นแบบระยะไกล

git reset - ต้นกำเนิดที่ยาก

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