เลือกเปลี่ยนกลับหรือชำระเงินการเปลี่ยนแปลงไฟล์ใน Git?


89

มีคำสั่งที่อนุญาตให้คุณเลิกทำการเปลี่ยนแปลงไฟล์บางส่วน (หรือไฟล์) ในไดเร็กทอรีการทำงานหรือไม่

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

ฉันกำลังจินตนาการถึงตัวเลือกgit checkoutที่ใช้งานได้ดีเช่นgit add -pมันผ่านไฟล์ก้อนใหญ่และถามว่าคุณต้องการเก็บไว้หรือไม่

คำตอบ:


85

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

git add -p <path>

เพื่อจัดลำดับส่วนที่คุณต้องการเก็บไว้ในไฟล์ใดไฟล์หนึ่งจากนั้น

git checkout -- <path>

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

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

git reset -- <path>

เพื่อเปลี่ยนไฟล์เวอร์ชันขั้นตอนกลับเป็นเวอร์ชันล่าสุดของไฟล์ที่มีการผูกมัดเพื่อให้การเปลี่ยนแปลงของคุณไม่เป็นขั้นตอน


สำหรับกรณีการใช้งานที่เรียบง่ายนี้ซึ่งระบบควบคุมเวอร์ชันอื่น ๆ เรียกว่า "ย้อนกลับ" เหตุใดคำสั่ง Git จึงคลุมเครือ
Jan Hettich

5
@Jan revertคำสั่งของระบบควบคุมเวอร์ชันอื่นอนุญาตให้คุณเลือกว่าจะเปลี่ยนการเปลี่ยนแปลงใดในไฟล์หรือไม่ ถามจริงเนื่องจากฉันมีประสบการณ์กับ CVS และ Git เท่านั้น ใน Git git checkout -- path/to/fileเป็นคำสั่งเดียวที่ย้อนกลับการเปลี่ยนแปลงทั้งหมดในไฟล์นั้น แต่ไม่เหมือนกับด้านบน
michiakig

3
นอกจากนี้ยังมีgit checkout --patchและgit reset --patchที่ทำงานเช่นgit add --patchในคอมไพล์ล่าสุด
Matt Connolly

2
@Rudie --มักจะระบุจุดสิ้นสุดของการแยกวิเคราะห์ตัวเลือกและข้อโต้แย้งใด ๆ ที่เกิดขึ้นหลังจากนั้นจะต้องตีความตามตัวอักษร ซึ่งหมายความว่าคุณจะไม่ต้องเพิ่ม./ก่อนที่ชื่อไฟล์ใด ๆ --ที่เริ่มต้นด้วยเครื่องหมายลบถ้าชื่อไฟล์มาหลังจาก
zrajm

เมื่อฉันใช้git checkout --patchความแตกต่างดูเหมือนจะถอยหลัง สัญลักษณ์ลบคือการเพิ่มข้อความลงในสำเนาที่ใช้งานของฉันและสัญลักษณ์บวกจะลบบรรทัดออกจากสำเนาการทำงานของฉัน
Felipe Alvarez

115

ด้วยเวอร์ชัน git> = 1.7.1 ฉันทำได้

git checkout -p

ฉันไม่แน่ใจว่าฟีเจอร์นี้ถูกนำมาใช้เมื่อใด


11
เป็นเรื่องที่ควรค่าแก่การกล่าวขวัญว่าคุณสามารถทำได้git reset -pเพื่อเลือกการเปลี่ยนแปลงจากพื้นที่การแสดงละคร / ดัชนี ฉันไม่รู้เหมือนกันว่า Git รุ่นใดถูกนำมาใช้

นี่คือคำตอบที่ถูกต้องทำไมจึงไม่ได้รับการยอมรับ
wukong

1
@wukong เพราะคำตอบนี้ถูกโพสต์ไว้ 2 ปีหลังจากคำถาม. ในขณะนี้ (2009) คำตอบของ Charles คือทางออกที่ดีที่สุด
pomeh

8

git checkout $fileเปลี่ยนสถานะของไฟล์กลับเป็นสถานะการคอมมิต$fileล่าสุด ฉันคิดว่าคุณสามารถใช้git checkout SHA-1 -- $fileเพื่อเปลี่ยนไฟล์กลับเป็นการกระทำที่ SHA-1 ระบุได้


1
ใช่ไม่ใช่สิ่งที่ฉันต้องการเนื่องจากฉันต้องการเก็บการเปลี่ยนแปลงบางอย่างที่ได้ทำไว้ในไฟล์และเปลี่ยนกลับรายการอื่น
1800 ข้อมูล

1

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

นั่นคือ:

git checkout -b temp troublesome-commit^
git checkout troublesome-commit -- path/to/file
git add -p path/to/file
git commit -c troublesome-commit
git checkout @{-1}
git checkout temp -- path/to/file
git commit path/to/file
git branch -D temp

ทางเลือกอื่น ๆ ได้แก่ การย้อนกลับและแก้ไขคอมมิตด้วยgit rebase -i(ทำเครื่องหมายคอมมิตเป็นeditแล้วทำgit reset HEAD^และทำซ้ำคอมมิตเมื่อปล่อยกลับเข้าไปในเชลล์)

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


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