ฉันพบวิธีการทำสิ่งนี้ในรายชื่อผู้รับจดหมายของ Git:
git show <commit> -- <path> | git apply --reverse
ที่มา: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406
รูปแบบ
คำสั่งนั้นล้มเหลว (ไม่ทำให้เกิดการเปลี่ยนแปลง) หากแพทช์ไม่ได้ใช้อย่างหมดจด แต่กับ--3wayคุณแทนที่จะได้รับความขัดแย้งซึ่งคุณสามารถแก้ไขได้ด้วยตนเอง (ในกรณีนี้คำตอบของ Caseyอาจเป็นประโยชน์มากกว่า):
git show <commit> -- <path> | git apply --reverse --3way
นอกจากนี้คุณยังสามารถใช้วิธีนี้เพื่อยกเลิกการคอมมิทหลายครั้งได้เช่น
git log -S<string> --patch | git apply --reverse
เพื่อย้อนกลับไฟล์ที่มีการเปลี่ยนแปลงที่ตรงกัน<string>ในการส่งข้อมูลใด ๆ ตรงนี้เป็นสิ่งที่ฉันต้องการในกรณีการใช้งานของฉัน (คอมมิทที่แยกไว้สองสามข้อแนะนำการเปลี่ยนแปลงที่คล้ายกันกับไฟล์ต่าง ๆ พร้อมกับการเปลี่ยนแปลงไฟล์อื่น ๆ ในรูปแบบที่ไม่เกี่ยวข้องซึ่งฉันไม่ต้องการเปลี่ยนกลับ)
ถ้าคุณได้diff.noprefix=trueตั้งอยู่ในของคุณ~/.gitconfigแล้วคุณจะต้องเพิ่ม-p0ไปยังgit applyคำสั่งเช่น
git show <commit> -- <path> | git apply -p0 --reverse