ฉันจะคอมไพล์ซ่อนไฟล์เฉพาะได้อย่างไร


1654

ฉันจะซ่อนไฟล์ที่เฉพาะเจาะจงออกจากไฟล์อื่น ๆ ที่แก้ไขในปัจจุบันจากที่ซ่อนที่ฉันกำลังจะบันทึกได้อย่างไร

ตัวอย่างเช่นถ้าสถานะ git ให้สิ่งนี้แก่ฉัน:

younker % gst      
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   app/controllers/cart_controller.php
#   modified:   app/views/cart/welcome.thtml
#
no changes added to commit (use "git add" and/or "git commit -a")

และฉันต้องการซ่อนแอพ / views / cart / welcome.thtml เท่านั้นฉันจะทำอย่างไร? สิ่งที่ชอบ (แต่แน่นอนว่าใช้ไม่ได้):

git stash save welcome_cart app/views/cart/welcome.thtml

57
ขณะนี้คำถาม "อาจซ้ำกัน" มีคำตอบที่ไม่ถูกต้องระบุว่ายอมรับแล้ว
Penguin Brian

6
คุณสามารถใช้git checkout -- filenameและเปลี่ยนกลับสู่สถานะเดิมได้
visualex

7
@visualex มันจะคืนกลับแน่นอน แต่ไม่ซ่อนไว้
Jesper

2
ความคิดเห็นของ Re Penguin Brian: ใช่คำตอบที่ยอมรับสำหรับคำถามที่ "ซ้ำกันได้" จะลิงก์ไปยังคำถามนี้สำหรับคอมไพล์เวอร์ชันล่าสุด
อังคาร

1
$ git stash - filename.ext
Linielson

คำตอบ:


2511

แก้ไข:ตั้งแต่ Git 2.13 git stash push <path>มีคำสั่งเพื่อบันทึกเส้นทางที่เฉพาะเจาะจงที่จะสะสมไปนี้: ตัวอย่างเช่น:

git stash push -m welcome_cart app/views/cart/welcome.thtml

คำตอบเก่า:

คุณสามารถทำได้โดยใช้git stash --patch(หรือgit stash -p) - คุณจะเข้าสู่โหมดอินเทอร์แอกทีฟซึ่งคุณจะพบกับก้อนใหญ่แต่ละตัวที่มีการเปลี่ยนแปลง ใช้nเพื่อข้ามไฟล์ที่คุณไม่ต้องการซ่อนyเมื่อคุณพบไฟล์ที่คุณต้องการซ่อนและqเพื่อออกและปล่อยให้ส่วนที่เหลืออยู่ aจะซ่อนก้อนใหญ่ที่แสดงไว้และส่วนที่เหลือของไฟล์นั้น

ไม่ใช่แนวทางที่ใช้งานง่ายที่สุด แต่จะทำงานให้ลุล่วงหากคุณต้องการจริงๆ


32
ยุ่งยาก แต่ใช้งานได้ ฉันหวังว่าจะมีวิธีที่รวดเร็วในการซ่อนเฉพาะการเปลี่ยนแปลงแบบทีละขั้นจากนั้นให้การเปลี่ยนแปลงนั้นเข้าสู่แผนผังการทำงานที่ไม่มีการจัดเตรียมเมื่อมีการเปิดขึ้นในภายหลัง
James Johnston

56
@JamesJohnston git stash --keep-indexจะช่วยให้คุณสามารถซ่อนการเปลี่ยนแปลงทั้งหมดที่ไม่มีขั้นตอน (ตรงข้ามกับสิ่งที่คุณกำลังมองหา) stackoverflow.com/a/8333163/378253
nimser

123
ถ้าคุณบอกว่าaแทนที่จะyซ่อนก้อนนั้น + ส่วนที่เหลือของไฟล์ซึ่งเร็วกว่ามาก
i_am_jorf

53
@jeffamaphone สุดยอด! ยังdจะทำในทางตรงกันข้ามคือไม่ซ่อน hunks ใด ๆ เพิ่มเติมในไฟล์ปัจจุบัน และ?จะแสดงตัวเลือกที่เป็นไปได้ทั้งหมด
omnikron

9
@Vencovsky ย่อมาจาก "message" และใช้เพื่อระบุคำอธิบายเพิ่มเติมของที่เก็บ หากคุณไม่ต้องการสิ่งนั้นคุณสามารถออกจาก-m welcome_cartส่วนนั้นได้
svick

337

ฉันมักจะเพิ่มการเปลี่ยนแปลงดัชนีฉันไม่ต้องการซ่อนแล้วซ่อนด้วย--keep-indexตัวเลือก

git add app/controllers/cart_controller.php
git stash --keep-index
git reset

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


คำเตือน ตามที่ระบุไว้ในความคิดเห็นสิ่งนี้ทำให้ทุกอย่างอยู่ในที่ซ่อนทั้งแบบจัดฉากและไม่จัดฉาก --keep-indexเพียงใบดัชนีคนเดียวหลังจากที่ซ่อนจะทำ ซึ่งอาจทำให้เกิดความขัดแย้งในการผสานเมื่อคุณเปิดที่ซ่อนในภายหลัง


5
สิ่งนี้ดีกว่าคำตอบที่ยอมรับมากหากคุณมีการเปลี่ยนแปลงมากมายที่คุณไม่ต้องการดำเนินการด้วยตัวเลือก - แพทช์
quux00

181
ไม่สิ่งนี้ทำให้ทุกอย่างเข้าสู่ที่ซ่อนทั้งแบบจัดฉากและไม่จัดฉาก --keep-indexเพียงใบดัชนีคนเดียวหลังจากที่ซ่อนจะทำ ดังนั้นนี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถาม AFAICT
รามัน

2
ดูคำตอบของฉันในคำถามของ @ Rachel สำหรับวิธีแก้ปัญหาในการทำสิ่งนี้ตรงกันข้าม (จัดเตรียมการเปลี่ยนแปลงแบบทีละขั้นแทนที่จะเป็นการเปลี่ยนแปลงที่ไม่มีขั้นตอน) - stackoverflow.com/questions/3040833/…
JesusFreke

3
หลังจากนั้นถ้าคุณต้องการที่จะได้รับกลับไฟล์ที่คุณ stashed git stash; git stash pop stash@{1}โดยไม่ก่อไฟล์ที่คุณเพิ่มคุณสามารถเรียกใช้
yndolok

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

28

หากต้องการเพิ่มคำตอบของ svick -mตัวเลือกเพียงแค่เพิ่มข้อความในที่เก็บของคุณและเป็นทางเลือกทั้งหมด ดังนั้นคำสั่ง

git stash push [paths you wish to stash]

ถูกต้องสมบูรณ์ ตัวอย่างเช่นหากฉันต้องการซ่อนการเปลี่ยนแปลงในsrc/ไดเรกทอรีเท่านั้นฉันสามารถเรียกใช้

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