สะสมเพียงไฟล์เดียว


176

ฉันต้องการที่จะซ่อนเพียงการเปลี่ยนแปลงจากไฟล์เดียว:

git stash save -- just_my_file.txt

ข้างต้นไม่ทำงานแม้ว่า ทางเลือกใด?



สำหรับไฟล์เดี่ยวแทนที่จะใช้คำสั่ง juggling stash วิธีที่ง่ายกว่ามากคือการคัดลอกไฟล์เดียวและเมื่อคุณต้องการนำมันกลับมาเพื่อคัดลอกไฟล์ต้นฉบับ เช่น. cp just_my_file.txt just_my_file.txt.manualstash ตอนนี้คุณสามารถชำระเงินและสิ่งต่าง ๆ ได้และเนื่องจากสำเนาเป็น "ไฟล์ที่ไม่ได้ติดตาม" คุณสามารถย้ายข้ามสาขาและกระทำโดยไม่มีปัญหาใด ๆ เมื่อคุณอยู่ในสาขาที่ถูกต้อง / ยอมรับว่าคุณต้องการ "รวมไฟล์เดียว " เพียงแค่ทำmv just_my_file.txt.manualstash just_my_file.txtและตอนนี้คุณสามารถตรวจสอบการเปลี่ยนแปลงและกระทำในกรณีที่จำเป็น
Dimitry K

คำตอบ:


173

ฉันคิด stash -pน่าจะเป็นทางเลือกที่คุณต้องการ แต่เพียงในกรณีที่คุณใช้เป็นสิ่งที่ยิ่งยุ่งยากมากขึ้นอื่น ๆ ในอนาคตจำไว้ว่า:

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

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

ไปเกี่ยวกับและทำสิ่งที่คุณต้องการจากนั้นก็เพียงแค่rebaseและ / หรือmergetmpbranch จริงๆมันไม่ได้เป็นที่ทำงานพิเศษมากเมื่อคุณต้องทำติดตามระมัดระวังมากขึ้นกว่าที่ซ่อนจะช่วยให้


2
กลับหัวกลับหางคุณสามารถเปลี่ยนเป็นกิ่งก้านสาขาจริงโดยไม่ต้องเจ็บปวดมาก
Wes Hardaker

90

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

$ git stash -- filename.ext

หากเป็นไฟล์ที่ไม่ได้ติดตาม / ใหม่คุณจะต้องดำเนินการก่อน

แต่ถ้าคุณไม่pushต้องการระบุข้อความใช้

git stash push -m "describe changes to filename.ext" filename.ext

ทั้งสองวิธีใช้งานได้ใน git เวอร์ชั่น 2.13+


1
คำตอบนี้ดูเหมือนว่าส่วนใหญ่ตรงไปตรงมากับฉันเมื่อการแก้ไขเปลี่ยนแปลง: git stash -- filename.ext, git commit --amend, git stash pop
แบรนดอนดิวอี้

1
ฉันคิดว่าสิ่งนี้ต้องขึ้นอยู่กับฟังก์ชั่นใหม่ ๆ มันไม่ทำงานใน git 2.1.4
Richard Smith

มันส่งผลให้เกิดพฤติกรรมแปลก ๆ สำหรับฉันด้วยการสะสมที่ถูกบันทึกไว้ แต่ไฟล์เดียวกันถูกเพิ่มเข้าไปในการจัดเตรียมในเวลาเดียวกัน (git v2.20.1),
Paradroid

58

คุณสามารถซ่อนบรรทัดเดียวด้วยgit stash -p(คล้ายกับgit add -p)

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


3
การดำเนินการนี้ใช้เวลานานหากคุณมีไฟล์จำนวนมากที่คุณไม่ต้องการซ่อน
jjj

23
ฉันไม่รู้ว่าเมื่อไหร่จะมีการเปลี่ยนแปลง แต่git 2.14.1คุณสามารถระบุชื่อไฟล์ได้git stash -p <filename>
muon

21

ตัวเลือกที่ดีที่สุดคือการจัดวางทุกอย่างยกเว้นไฟล์นี้และบอกให้ stash เก็บดัชนีไว้ด้วยgit stash save --keep-indexดังนั้นจึงทำการ stashing ไฟล์ที่ไม่จัดเก็บของคุณ:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

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


2
แม้ว่าสิ่งนี้จะช่วยให้ดัชนีอยู่ในสถานะเดียวกัน แต่สิ่งนี้จะไม่ซ่อนไฟล์ที่อยู่ในดัชนีด้วยหรือไม่ กล่าวอีกนัยหนึ่งถ้าหลังจากทำเช่นนี้คุณยอมรับดัชนีไปยังสาขาปัจจุบันแล้วเปลี่ยนไปที่สาขาอื่นและทำgit stash popมันจะไม่ใช้ไฟล์ทั้งหมดไม่ใช่แค่ไฟล์เดียวที่เราต้องการซ่อน?
Dan Molding

@DanMoulding: คุณพูดถูกฉันไม่ได้คิดถึงเรื่องนี้
CharlesB

16

ในกรณีที่คุณหมายถึง 'ยกเลิกการเปลี่ยนแปลง' ทุกครั้งที่คุณใช้ 'git stash' (และไม่ใช้ git stash เพื่อซ่อนมันชั่วคราว) ในกรณีนี้คุณสามารถใช้

git checkout -- <file>

โปรดทราบว่าการซ่อนคอมไพล์เป็นเพียงทางเลือกที่ง่ายและรวดเร็วในการแยกและทำสิ่งต่างๆ


ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดหากคุณต้องการลบการเปลี่ยนแปลงที่แก้ไขทั้งหมดของคุณเป็นไฟล์เดียว
Mohamed Haseel

และฉันต้องการคำตอบที่ดีที่สุดสำหรับงานนั้น
Zakir hussain

6
คำถามนั้นชัดเจนเพียงพอและไม่ได้ถามว่าจะคืนค่าการเปลี่ยนแปลงเป็นไฟล์เดียวได้อย่างไร downvoted
Richard Smith

นี่เป็นคำตอบที่ดีโดยแสดงให้เห็นอย่างชัดเจนว่าเป็นทางเลือก แต่บางคนจะดื้อรั้นมากพอที่จะใช้ downvote เป็นคุณลักษณะที่ไม่เหมาะสม: +1
Mukul Jain

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