ฉันตั้งใจที่จะทำผิดสาขา ฉันจะลบการส่งได้อย่างไร
ฉันตั้งใจที่จะทำผิดสาขา ฉันจะลบการส่งได้อย่างไร
คำตอบ:
ลบการคอมมิทล่าสุดทำให้งานที่คุณทำ:
git reset --soft HEAD~1
ลบการคอมมิชชันล่าสุดทำลายงานที่คุณทำ:
git reset --hard HEAD~1
git reset --hard origin
git remote
รายการกำเนิดสำหรับฉันพูดว่าgit reset --hard origin
fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
ทำไม?
git reset HEAD~1
จะทำให้การเปลี่ยนแปลงของคุณทั้งหมด แต่จะทำให้คุณมีดัชนีว่างเปล่าแทนที่จะเก็บทุกอย่าง (เป็น--soft
ตัวเลือก)
ฉันสงสัยว่าทำไมคำตอบที่ดีที่สุดที่ฉันพบมีเฉพาะในความคิดเห็นเท่านั้น! ( โดย Daenyth มี 86 คะแนนขึ้นไป )
git reset --hard origin
คำสั่งนี้จะซิงค์ที่เก็บในเครื่องกับที่เก็บระยะไกลเพื่อกำจัดการเปลี่ยนแปลงทุกอย่างที่คุณทำบนเครื่องของคุณ นอกจากนี้คุณยังสามารถทำสิ่งต่อไปนี้เพื่อดึงข้อมูลสาขาที่แน่นอนที่คุณมีในแหล่งกำเนิด
git reset --hard origin/<branch>
git reset --hard origin/<branch>
git reset --soft origin/<branch>
ถ้าคุณต้องการที่จะกำจัดความมุ่งมั่น แต่ยังคงทำงานในท้องถิ่น
fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
คุณต้องระบุสาขาเช่น:git reset --hard origin/feature/my-cool-stuff
อย่าลบมัน: เพียงหนึ่งการกระทำ 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
ทำgit rebase -i FAR_ENOUGH_BACK
และวางสายสำหรับการกระทำที่คุณไม่ต้องการ
หากคุณต้องการย้ายการกระทำนั้นไปยังสาขาอื่นให้รับ 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 เพื่อทำสิ่งพื้นฐานส่วนใหญ่ของฉันเพียงแค่ใช้บรรทัดคำสั่งกับสิ่งนี้หลังจากข้อผิดพลาดของฉัน
สำหรับการอ้างอิงของคุณฉันเชื่อว่าคุณสามารถ "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 แต่ด้วยวิธีนี้คุณสามารถอัปเดตเวอร์ชันที่ได้รับการแก้ไข (แพตช์) ที่เป็นเวอร์ชั่นของการแจกจ่ายของคุณในขณะที่การพัฒนาที่แท้จริงของคุณนั้นขัดแย้งกับต้นแบบต้นน้ำจริง
ดังนั้นเพียงแสดง:
หวังว่านี่จะช่วยใครซักคน ฉันตั้งใจจะเขียนสิ่งนี้ แต่ฉันไม่สามารถจัดการได้ในตอนนี้ ความนับถือ.
คำสั่งต่อไปนี้ใช้งานได้สำหรับฉันการเปลี่ยนแปลงที่ทำไว้ภายในเครื่องทั้งหมดจะถูกทิ้ง & local จะถูกรีเซ็ตเป็นเหมือนกับสาขาต้นทาง / ต้นแบบระยะไกล
git reset - ต้นกำเนิดที่ยาก