วิธีแก้ไขคอมมิทสุดท้ายเพื่อยกเลิกการเพิ่มไฟล์?


108

ฉันได้แก้ไขสองไฟล์a, bในช่วงกระทำ แต่bไม่ควรผูกไฟล์ไว้เวิร์กโฟลว์จะแก้ไขสิ่งนี้คืออะไร

คำตอบ:


109

อัปเดต (สองสามปีต่อมา)

Jan Hudec

ไม่สำคัญที่จะลบออกจากดัชนีเท่านั้น

จริง: คุณสามารถรีเซ็ตไฟล์เป็นเนื้อหาดัชนีได้ง่ายพอเนื่องจากคำตอบล่าสุด (เขียนโดยMatt Connolly ) แนะนำ:

git reset HEAD^ path/to/file/to/revert

HEAD^ช่วยให้ไฟล์เพื่อเข้าถึงเนื้อหาในก่อนหน้านี้กระทำก่อนที่จะเป็นคนสุดท้าย

จากนั้นคุณก็ทำได้git commit --amendตามที่ฉันเขียนไว้ด้านล่าง


ด้วย Git 2.23 (สิงหาคม 2019) คุณอาจใช้คำสั่งใหม่git restore

 git restore --source=HEAD^ --staged  -- path/to/file/to/revert

สั้น:

 git restore -s@^ -S -- path/to/file/to/revert

คุณสามารถทำได้อีกครั้งgit commit --amendตามที่ฉันเขียนไว้ด้านล่าง


คำตอบเดิม (มกราคม 2011)

หากนี่คือการกระทำครั้งสุดท้ายของคุณ (และคุณยังไม่ได้ผลักเลย) คุณสามารถแก้ไขได้:
(ซ่อนแรกหรือบันทึกb)

 git commit --amend

จากนั้นลบ b, กระทำซ้ำอีกครั้ง กู้คืน b และคุณทำเสร็จแล้ว

--amend

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


... Then stash/delete b, re-commit..ที่นี่ไม่ควรใช้คำว่าThenเป็นafter? - --amendหลังจาก stach / delete b, ...
XièJìléi

@ 谢继雷: กล่าวอีกนัยหนึ่งให้บันทึก b ก่อนแล้วจึงส่ง - แก้ไขแล้วคืนค่าหรือไม่ จริง ฉันได้อัพเดตคำตอบแล้ว
VonC

ด้วยความสามารถของดัชนี git การบอกให้ทุกคนซ่อน / บันทึกไฟล์นั้นเป็นเพียงความโง่เขลา (-1) ไม่สำคัญที่จะลบออกจากดัชนีเท่านั้น
Jan Hudec

1
@JanHudec จริงฉันได้แก้ไขคำตอบแล้ว ฉันไม่ได้ทำตามคำตอบเก่า ๆ อย่างใกล้ชิดกับ Stack Overflow 99% ของคำถามคอมไพล์ใน SU ควรย้ายข้อมูลไปที่ SO ต่อไป
VonC

66
  1. git diff --name-only HEAD^ - (เป็นทางเลือก) ใช้เพื่อแสดงรายการไฟล์ที่เปลี่ยนแปลงในการส่งครั้งล่าสุด
  2. git reset HEAD^ path/to/file/to/revert- เพื่อรีเซ็ตดัชนีเป็นเวอร์ชันสุดท้ายโดยปล่อยให้สำเนาทำงานไม่ถูกแตะต้อง
  3. git commit --amend- เพื่อแก้ไขล่าสุดที่กระทำเพื่อรวมการเปลี่ยนแปลงดัชนี

9
Imho มันเป็นคำตอบที่ดีกว่ามากแล้วคำตอบที่ได้รับการยอมรับ
mik01aj

1
โปรดทราบว่าคุณไม่ควรใช้git commit -a --amend(เช่นอย่าเพิ่มไฟล์) สำหรับขั้นตอนที่ 3 หรือคุณจะยอมรับการเปลี่ยนแปลงสำเนาการทำงานซึ่งเป็นการแก้ไขที่คุณพยายามลบ ขั้นตอนที่เป็นทางเลือก 2.5 อาจเป็นการgit checkout path/to/file/to/revertล้างสำเนาทำงานของคุณด้วย
dmnd

1
หรือgit rm --cached path/to/file/to/revertจะยกเลิกการเพิ่มไฟล์โดยไม่ต้องลบออกจากทรี
Jan Hudec

13

อีกทางเลือกหนึ่งถ้าคุณใช้git guiคุณเพียงแค่เลือกตัวเลือก "แก้ไขการกระทำครั้งสุดท้าย" ไฟล์ที่เพิ่มจะปรากฏในรายการ "ฉาก" คลิกที่ไอคอนเพื่อย้ายไปยังรายการ "ไม่ดำเนินการ"


1
@VonC: การแก้ไขและการแบ่งแพทช์เป็นการดำเนินการที่ใช้กันทั่วไปสำหรับผู้ใช้งาน git อย่างหนักดังนั้น gui จึงได้รับการออกแบบมาเพื่อให้ง่ายและเป็นเครื่องมือที่ดีที่สุดสำหรับ IMO
Jan Hudec

อันนั้นใช้ได้ผล! ฉันไม่ได้ประสบความสำเร็จกับตัวเลือกอื่น ๆ สำหรับงานนั้น ขอบคุณสำหรับทิป!
Serguzest

10

หากคุณต้องการลบ b จากการส่งครั้งล่าสุด

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

หากคุณต้องการลบการเปลี่ยนแปลงทั้งหมดเป็น b ในการส่งครั้งล่าสุด

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)

git rm --cachedและทำไปกับการสำรองข้อมูล / เรียกคืนการเต้นรำ (-1)
Jan Hudec

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

4

อีกทางเลือกหนึ่งที่ไม่ต้องการแฮ็กดัชนี แต่กระนั้นก็ยังมีข้อความยืนยันเก่า:

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

ฉันชอบสิ่งนี้เพราะ (ก) ใช้คำสั่งที่ฉันใช้เป็นประจำและ (ข) ฉันสามารถทำได้git add -pเพื่อหาว่ามันคืออะไรที่ฉันต้องการจะยอมรับ

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