ฉันจะย้อนกลับ 1 คอมมิชชันได้อย่างไร?


127

ฉันมี 2 สัญญาที่ฉันไม่ได้ผลัก:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

ฉันจะย้อนกลับอันแรกของฉัน (อันที่เก่าที่สุด) แต่เก็บอันที่สองได้อย่างไร

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

จากที่นี่:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

ฉันแค่ต้องทำ:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

นั่นคือ?


3
คำถามนี้ดูเหมือนจะไม่ได้อยู่ที่หัวข้อเพราะเป็นเรื่องเกี่ยวกับเครื่องมือการเขียนโปรแกรม มันเป็นของ Stack Overflow
Peter Mortensen

@PeterMortensen เห็นด้วย นี่เป็นขอบเขตสำหรับ SuperUser
Kolob Canyon

คำตอบ:


95

วิธีที่ปลอดภัยและสะอาดที่สุดในการเดินทางคือลดการโต้ตอบ

git rebase -i HEAD^^

หรือ,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

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

คุณสามารถคืนค่าคอมมิชชันด้วยgit revertแต่จะเพิ่มข้อความการคอมมิทเข้าไปยังประวัติซึ่งอาจไม่เป็นที่ต้องการ ใช้-nพารามิเตอร์เพื่อบอก Git ไม่ให้ส่งคืนได้ทันที คุณสามารถ rebase เชิงโต้ตอบและสควอชเหล่านั้นจนถึงการยอมรับก่อนหน้านี้เพื่อรักษาสิ่งที่สะอาด

หากทั้งสองยอมรับว่าคุณทำงานกับที่นี่ส่งผลกระทบต่อไฟล์เดียวกันคุณอาจเห็นความขัดแย้งผสาน

การรีเซ็ตที่เก็บข้อมูลด้วยgit reset --hardควรทำด้วยความระมัดระวังเนื่องจากไม่สามารถยกเลิกได้

ประวัติการเขียนซ้ำควรทำด้วยความระมัดระวัง


ฉันจะลบการคอมมิทใน 'git rebase' ได้อย่างไร? มีเพียง 3 คำสั่งคือเลือกแก้ไขสควอช ไม่มีการลบ AFAIK
n179911

8
ลบบรรทัดออกจากรายการทั้งหมดและจะลบการกระทำ
jtimberman

เมื่อฉันต้องการยกเลิกการเปลี่ยนแปลงฉันต้องการไม่ทิ้งร่องรอยไว้ หากคุณไม่ต้องการทิ้งร่องรอยการย้อนกลับของคุณนี่เป็นวิธีที่ดีที่สุดในการทำเช่นนั้น
Phillip Whelan

"วิธีที่ปลอดภัยที่สุดและสะอาดที่สุดคือการลดการโต้ตอบ" อาจไม่ได้ถ้าคุณไม่ใช้เสียงเรียกเข้า ฉันโชคดีและคิดออกจากความยุ่งเหยิงนั้น ยัง upvoting เพราะฉันควรเรียนรู้เป็นกลุ่ม :-)
isimmons

ฉันขอแนะนำให้ใช้rebaseน้อยที่สุด ถ้าคุณทำงานกับคนอื่น ๆ revertแล้วก็ทำให้
boldnik

52

นี่ถ้ามาจากhttp://nakkaya.com/2009/09/24/git-delete-last-commit/ และมันใช้ได้สำหรับฉัน

Git ลบการกระทำครั้งสุดท้าย

บางครั้งในช่วงดึกเมื่อฉันวิ่งออกไปจากกาแฟฉันกระทำสิ่งที่ฉันไม่ควรมี จากนั้นฉันใช้เวลา 10 - 15 นาทีในการทำ googling ต่อไปวิธีการลบการคอมมิทครั้งล่าสุดที่ฉันทำ ดังนั้นหลังจากครั้งที่สามฉันต้องการบันทึกมันเพื่อให้ฉันสามารถอ้างอิงได้ในภายหลัง

หากคุณยอมรับขยะ แต่ไม่ได้ผลัก

git reset --hard HEAD~1

HEAD ~ 1 เป็นชวเลขการกระทำก่อนที่จะถึงหัว หรือคุณสามารถอ้างถึง SHA-1 ของแฮชที่คุณต้องการรีเซ็ต โปรดทราบว่าเมื่อใช้ - ฮาร์ดการเปลี่ยนแปลงใด ๆ กับไฟล์ที่ถูกติดตามในแผนผังการทำงานตั้งแต่การกระทำก่อนที่จะหายไป

หากคุณไม่ต้องการลบงานที่คุณได้ทำคุณสามารถใช้ --softตัวเลือกที่จะลบการกระทำ แต่มันจะทำให้ไฟล์ที่เปลี่ยนแปลงทั้งหมดของคุณ "การเปลี่ยนแปลงที่จะกระทำ" เป็นสถานะ git จะทำให้มัน

ตอนนี้ถ้าคุณผลักไปแล้วและมีคนดึงซึ่งโดยทั่วไปแล้วฉันไม่สามารถใช้การรีเซ็ต git ได้ อย่างไรก็ตามคุณสามารถย้อนกลับคอมไพล์ได้

git revert HEAD

สิ่งนี้จะสร้างคอมมิชชันใหม่ที่ย้อนกลับทุกสิ่งที่แนะนำโดยการกระทำโดยไม่ตั้งใจ


2
ด้วยตัวเลือก - ซอฟท์มันเหมาะอย่างยิ่งสำหรับการเปลี่ยนชื่อไฟล์และ "git กระทำ -a" โดยไม่ตั้งใจแทนที่จะใช้ "git add" ก่อน
Aaron Harun

8

Nope git-reset - ฮาร์ดจะนำคุณย้อนกลับไปในประวัติศาสตร์ สิ่งที่คุณกำลังมองหาคือการคืนค่าคอมไพล์ซึ่งจะยกเลิกการกระทำใด ๆ


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

6

ฉันเพิ่งทำสิ่งนี้:

git rebase -i HEAD^^

ฉันทำให้มันเมา

git rebase --abort

จากนั้นก็ทำอีกครั้ง จากนั้นฉันต้องผลักดันสิ่งนี้:

git push origin master -f

และมันทำลายความมุ่งมั่นที่ใหม่กว่าความมุ่งมั่นที่ฉันย้อนกลับไป ใช้งานได้ดีมาก


4

ไม่git reset --hard baf8d5eจะลบการ3368e1cกระทำและ HEAD จะอยู่ในbaf8d5eภายหลัง

ถ้าคุณต้องการเก็บการคอมมิท3368e1cและลบการคอมbad8d5eมิตวิธีที่ง่ายที่สุดคือการทำ " git rebase -i HEAD~2" (เช่นการรีบูตแบบโต้ตอบของการคอมมิทสองครั้งล่าสุด) คำสั่งนี้จะเรียกใช้ตัวแก้ไขข้อความคอมมิชชันของคุณและคุณจะเห็นหนึ่งบรรทัดสำหรับแต่ละการคอมมิทล่าสุด ที่นั่นคุณเพียงแค่ลบbad8d5eบรรทัดกระทำและบันทึก git จะทำการเขียนประวัติของคุณและการคอมมิชชันที่ 2 จะหายไป

มีคำสั่งที่มีประโยชน์อื่น ๆ ที่คุณสามารถใช้ในการแก้ไขข้อความกระทำเหมือนsquash, editฯลฯ rebase Interactive เป็นมีประสิทธิภาพมาก!

อย่าทำเช่นนี้หากมีใครเห็นคอมมิทเหล่านี้อยู่แล้ว (กดหรือดึงจากที่เก็บของคุณ)!



1
git reset --hard {ref}

เป็นวิธีเดียวที่จะยกเลิกการคอมมิชชันถ้ามีการคอมมิชชันอื่นใน repo (เช่นการเริ่มต้นและอีก 1) ส่วนที่เหลือของวิธี (ย้อนกลับ, การคืนเงิน) ปฏิเสธที่จะทำงานอย่างน้อยเป็น git 1.7.5.1

หากคุณทำตามgit resetด้วยคำสั่งgit gcgit จะลบข้อมูลการส่งข้อมูลเก่าออกจาก repo อย่างสมบูรณ์


1
git checkout <treeish> -- /path/to/dir

ที่จะนำไดเรกทอรีกลับมาจาก "treeish" ที่กำหนดสำหรับ / path / to / dir


0

ฉันได้รับการทำงานโดยการแก้ไขรหัสแฮชของการกระทำล่าสุดจากไฟล์ HEAD ภายในโฟลเดอร์ที่เก็บ:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

ก่อนหน้านั้นฉันไม่สามารถผลักดันให้เกิดการปฏิบัติการ UNMERGE ที่ฉันทำในพื้นที่ได้ มันบอกว่ามัน "ล้มเหลวในการผลักดันผู้อ้างอิงบางส่วน" ไปยัง Central Repository

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