คุณจะเลิกทำการคอมไพล์ครั้งล่าสุดได้อย่างไร?


193

มันเป็นไปได้ที่จะ unstage สุดท้ายฉาก (ไม่ได้มุ่งมั่น) การเปลี่ยนแปลงในการคอมไพล์ ? สมมติว่ามีไฟล์จำนวนมากในสาขาปัจจุบันบางฉากไม่บางส่วน เมื่อถึงจุดหนึ่งโปรแกรมเมอร์ที่โง่เขลาบางคนก็ดำเนินการโดยไม่ตั้งใจ:

git add -- .

...แทน:

git checkout -- .

โปรแกรมเมอร์นี้สามารถยกเลิกการเปลี่ยนแปลงล่าสุดของเขาด้วยคำสั่งgitเวทมนต์บ้างไหม? หรือเขาควรจะยืนยันก่อนทำการทดลองในตอนแรก?


หึ เราได้คำถามที่มีประโยชน์และตอบคำถามนี้
steveha

2
อาจเป็นไปได้ซ้ำของ'เลิกเพิ่ม git' ก่อนที่จะกระทำ
Jim Fell

ฉันเชื่อว่ามันไม่ซ้ำกัน OP ในคำถามอื่น ๆ กำลังขอวิธีในการเลิกทำหรือลบไฟล์เหล่านี้ออกจากคอมมิท ฉันต้องการ (ed) อย่างแม่นยำและเพียงเพื่อยกเลิกการเปลี่ยนแปลงที่เพิ่มเข้ามาด้วยgit addคำสั่งสุดท้ายโดยเฉพาะอย่างยิ่งสำหรับไฟล์ที่มีการเปลี่ยนแปลงแล้วและมีการเปลี่ยนแปลงบางอย่างที่จะเลิกทำไม่ใช่ฉาก ไม่สามารถพูดคำถามอื่นที่ไม่เกี่ยวข้องได้
ก.ย.

1
บางทีเขาควรจะได้รับ / มีความมุ่งมั่นก่อนที่จะทำการทดลองในครั้งแรก
android.weasel

@ android.weasel ใช่หลายปีมาแล้ว ...
ก.ย.

คำตอบ:


299

git resetคุณสามารถใช้ สิ่งนี้จะ 'unstage' ไฟล์ทั้งหมดที่คุณเพิ่มหลังจากการส่งครั้งล่าสุด

หากคุณต้องการ unstage git reset -- <file 1> <file 2> <file n>เพียงไฟล์บางการใช้งาน

นอกจากนี้ยังเป็นไปได้เพื่อ unstage git reset -pบางส่วนของการเปลี่ยนแปลงในแฟ้มโดยใช้


3
ช่างน่าเศร้าเหลือเกิน ฉันเดาว่ามีบางอย่างผิดปกติในการฝึกฝนของฉัน ยอมรับคำตอบนี้เพราะคุณพูดถึง-pสวิทช์ ขอบคุณ! :)
Septagram

สร้างข้อผิดพลาด (สำหรับฉัน): ร้ายแรง: ไม่สามารถแก้ไข 'HEAD' เป็นข้อมูลอ้างอิงที่ถูกต้อง ฉันยังไม่ได้ทำอะไรเลย (repo ใหม่) เพิ่งเพิ่มคอมไพล์แล้ว และเสียใจมัน ฉันไม่ต้องการรีเซ็ตการเพิ่มทั้งหมดเพียงแค่ไดเรกทอรีเดียว git reset - dir /*.* สร้างข้อผิดพลาดด้านบน
ฟรานซิสดาวี่

... อ่าฉันเห็นว่าเกิดอะไรขึ้นกับฉัน ฉันยังไม่มีสิ่งใดที่ HEAD จะชี้ไปยังและการรีเซ็ต git ล้มเหลว (เพราะทำงานบน HEAD)
ฟรานซิสดาวี่

42

คุณไม่สามารถเลิกทำการคอมไพล์ล่าสุดได้ แต่คุณสามารถเลิกทำการคอมไพล์ได้ทั้งหมดaddตั้งแต่การคอมมิทครั้งล่าสุด git resetโดยไม่ต้องมีข้อโต้แย้งกระทำรีเซ็ตดัชนี (unstages การเปลี่ยนแปลงฉาก):

git reset

2
"คุณไม่สามารถยกเลิกการคอมไพล์ล่าสุด ": ว้าวนี่เป็นเรื่องที่น่าประหลาดใจและอาจเจ็บปวด มีแหล่งที่ชัดเจนสำหรับเรื่องนี้หรือไม่? นอกจากนี้ยังมีเหตุผลที่ดีที่ควรจะเป็นเช่นนั้น? ขอบคุณ!
Andrew Moylan

@AndrewMoylan: ก็ไม่มีวิธีอัตโนมัติในการทำเช่นนั้น คุณสามารถresetไฟล์เดียวหรือใช้reset -pเพื่อยกเลิกการกำหนดก้อนใหญ่ที่เฉพาะเจาะจง
knittl

15

ดังนั้นคำตอบที่แท้จริง

โปรแกรมเมอร์นี้สามารถยกเลิกการเปลี่ยนแปลงล่าสุดของเขาด้วยคำสั่ง git เวทมนต์บ้างไหม?

เป็นจริง: ไม่คุณไม่สามารถหยุดขั้นตอนสุดท้ายgit addได้

นั่นคือถ้าเราตีความคำถามเช่นเดียวกับในสถานการณ์ต่อไปนี้:

ไฟล์เริ่มต้น:

void foo() {

}

main() {
    foo();
}

การเปลี่ยนแปลงครั้งแรกตามด้วยgit add:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

การเปลี่ยนแปลงครั้งที่สองตามด้วยgit add:

void foo(int bar, String baz) {
    print("$bar $baz");
}

main() {
    foo(1337, "h4x0r");
}

ในกรณีนี้git reset -pจะไม่ช่วยให้ได้เนื่องจากความละเอียดที่เล็กที่สุดคือเส้น gitไม่ทราบเกี่ยวกับสถานะขั้นกลางของ:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

อีกต่อไป


ฉันพูดพล่ามเพราะในฐานะผู้ใช้คอมไพล์ใหม่นั่นเป็นความแตกต่างที่สำคัญอย่างยิ่งที่ไฮไลต์สิ่งที่เพื่อนของฉันอธิบายว่า "มีสุขอนามัยในการเช็คอินที่ดี" ... ประสบการณ์ส่วนตัวของฉัน - มันอธิบายว่า
benc


3

เมื่อถึงคอมไพล์แสดงข้อความ:

  1. use "git rm --cached <file>..." to unstageหากไฟล์ไม่ได้อยู่ใน repo มัน unstages ไฟล์ที่เก็บไว้ที่นั่น
  2. use "git reset HEAD <file>..." to unstageหากไฟล์อยู่ใน repo และคุณกำลังเพิ่มไฟล์เหล่านั้นตามที่ได้รับการแก้ไข มันเก็บไฟล์ตามที่เป็นอยู่และไม่หยุดการทำงาน

ที่ความรู้ของฉันคุณไม่สามารถเลิกทำgit add --แต่คุณสามารถ unstage รายชื่อไฟล์ตามที่กล่าวไว้ข้างต้น


2
  • ลบไฟล์ออกจากดัชนี แต่เก็บไว้เป็นเวอร์ชันและทิ้งไว้พร้อมกับการเปลี่ยนแปลงแบบไม่มีข้อผูกมัดในสำเนาการทำงาน:

    git reset head <file>
    
  • รีเซ็ตไฟล์เป็นสถานะสุดท้ายจาก HEAD, เลิกทำการเปลี่ยนแปลงและลบออกจากดัชนี:

    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    สิ่งนี้จำเป็นเนื่องจากgit reset --hard HEADจะไม่ทำงานกับไฟล์เดียว

  • ลบออก<file>จากดัชนีและการกำหนดเวอร์ชันโดยให้ไฟล์ที่ไม่มีเวอร์ชันพร้อมการเปลี่ยนแปลงในสำเนาการทำงาน:

    git rm --cached <file>
    
  • ลบ<file>จากสำเนาการทำงานและการกำหนดเวอร์ชันอย่างสมบูรณ์:

    git rm <file>
    

2

หากคุณต้องการลบไฟล์ที่เพิ่มทั้งหมดจาก git สำหรับการกระทำ

git reset

หากคุณต้องการลบไฟล์แต่ละไฟล์

git rm <file>

1

คุณสามารถใช้ได้

git reset

เพื่อยกเลิกไฟล์ภายในเครื่องที่เพิ่มล่าสุด

 git reset file_name

เพื่อเลิกทำการเปลี่ยนแปลงสำหรับไฟล์เฉพาะ


0

ขึ้นอยู่กับขนาดและสเกลของสิ่งที่ยากคุณสามารถสร้างสาขา (ชั่วคราว) และส่งมอบงานปัจจุบันที่นั่น

จากนั้นสลับไปที่และชำระเงินสาขาเดิมของคุณและเลือกไฟล์ที่เหมาะสมจากการขีดข่วน

อย่างน้อยคุณจะมีบันทึกถาวรของสถานะปัจจุบันและก่อนหน้านี้ที่จะทำงานจาก (จนกว่าคุณจะลบสาขารอยขีดข่วนนั้น)

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