Git: ลบไฟล์ที่คอมมิตออกหลังจากพุช


119

มีความเป็นไปได้ที่จะเปลี่ยนกลับไฟล์ที่คอมมิตใน Git? ฉันได้ส่งคอมมิตไปที่ GitHub แล้วฉันก็รู้ว่ามีไฟล์ที่ฉันไม่ต้องการถูกพุช (ฉันยังแก้ไขไม่เสร็จ)


1
คุณต้องการลบไฟล์ทั้งหมดออกจาก GitHub หลังจากพุชหรือไม่? มิฉะนั้นคุณเพียงแค่: git rm <file>, git push
rdrmntn


คำตอบ:


162

ปรับปรุง: เพิ่มวิธีการที่ปลอดภัยยิ่งขึ้น

วิธีที่ต้องการ:

  1. ตรวจสอบสถานะก่อนหน้า (ไม่เปลี่ยนแปลง) ของไฟล์ของคุณ สังเกตเห็นเส้นประคู่

    git checkout HEAD^ -- /path/to/file
    
  2. กระทำมัน:

    git commit -am "revert changes on this file, not finished with it yet"
    
  3. ผลักดันไม่ต้องใช้แรง:

    git push
    
  4. กลับไปทำงานที่ยังไม่เสร็จทำอีกครั้ง (3 ครั้งลูกศรขึ้น):

    git checkout HEAD^ -- /path/to/file
    

'ไม่ผูกมัด' อย่างมีประสิทธิภาพ:

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

ในการลบการเปลี่ยนแปลงไฟล์จากการคอมมิตล่าสุด:

  1. ในการเปลี่ยนไฟล์กลับเป็นสถานะก่อนการคอมมิตครั้งสุดท้ายให้ทำ:

    git checkout HEAD^ /path/to/file
    
  2. ในการอัปเดตการคอมมิตล่าสุดด้วยไฟล์ที่เปลี่ยนกลับให้ทำ:

    git commit --amend
    
  3. เพื่อผลักดันการคอมมิตที่อัปเดตไปยัง repo ให้ทำ:

    git push -f
    

จริงๆให้พิจารณาใช้วิธีการที่ต้องการที่กล่าวถึงก่อนหน้านี้


1
เว้นแต่คุณจะเป็นผู้พัฒนาโปรเจ็กต์เพียงคนเดียวคุณไม่ควรใช้ git push -f มันสร้างปัญหามากกว่ามูลค่า เพียงแค่ลบไฟล์จากนั้นทำการคอมมิตใหม่
richardm

2
@ user553086 ไม่เห็นด้วยมากกว่านี้ ดีขึ้นแล้ว?
xor

สิ่งนี้ทำได้หรือไม่หากย้อนกลับไปในประวัติศาสตร์ เช่นฉันสามารถทำสิ่งนี้กับgit checkout HEAD~2 /path/to/file? แก้ไข: ดูเหมือนว่าสิ่งที่ฉันต้องการในกรณีของฉันเป็นเพียงแค่git rm /path/to/file
starscream_disco_party

1
คุณเพิ่งช่วยฉัน 4 ชั่วโมงครับ!
Tosin Onikute

ฉันพลาดการกระทำ "-a" ที่ทำให้ฉันสะดุดและทำหลายอย่างที่ฉันไม่ได้ตั้งใจ ระวัง!
jdex

71

หากคุณต้องการลบไฟล์ออกจาก repo ระยะไกลก่อนอื่นให้ลบออกจากโปรเจ็กต์ของคุณด้วยตัวเลือก --cache จากนั้นกด:

git rm --cache /path/to/file
git commit -am "Remove file"
git push

(วิธีนี้ใช้งานได้แม้ว่าไฟล์จะถูกเพิ่มไปยัง repo ระยะไกลที่กระทำบางอย่างที่ผ่านมา) อย่าลืมเพิ่มลงใน. gitignore นามสกุลไฟล์ที่คุณไม่ต้องการพุช


2
การดำเนินการนี้จะลบไฟล์ออกจากการส่งต่อคอมมิตนี้ แต่ไฟล์จะยังคงมองเห็นได้ภายในคอมมิตรุ่นเก่า
Ken

32

คุณสามารถเปลี่ยนไฟล์กลับเป็นการแก้ไขที่ระบุได้เพียงไฟล์เดียว

ก่อนอื่นคุณสามารถตรวจสอบว่าไฟล์ใดที่คอมมิตถูกเปลี่ยนแปลง

git log path/to/file.txt

จากนั้นคุณสามารถชำระเงินไฟล์ด้วยหมายเลขการแก้ไข

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /path/to/file.txt

หลังจากนั้นคุณสามารถกระทำและผลักดันอีกครั้ง


7

รีเซ็ตไฟล์ให้อยู่ในสถานะที่ถูกต้องคอมมิตและพุชอีกครั้ง

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


4
  1. รับรหัสแฮชของการคอมมิตล่าสุด

    • git log
  2. ยกเลิกการคอมมิต
    • git revert <hash_code_from_git_log>
  3. ผลักดันการเปลี่ยนแปลง
    • git push

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

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