ซ่อนการเปลี่ยนแปลงในขณะที่ยังคงการเปลี่ยนแปลงในไดเรกทอรีการทำงานใน Git


146

มีgit stashคำสั่งที่หยุดการเปลี่ยนแปลงของคุณหรือไม่ แต่เก็บไว้ในไดเรกทอรีการทำงานด้วยหรือไม่ ดังนั้นโดยพื้นฐานแล้วgit stash; git stash applyในขั้นตอนเดียว


คำถามเดียวกัน: stackoverflow.com/q/6315459/350384
Mariusz Pawelski


1
@MariuszPawelski ไม่ไม่ได้จริงๆ คำถามนั้นเจาะจงกว่าของฉันมาก คำตอบสำหรับคำถามของฉันคือ "ไม่" ขอบคุณสำหรับลิงค์แม้ว่ามันอาจจะเป็นประโยชน์กับบางคนหรือแม้กระทั่งตัวเองในภายหลัง
Michael Dorst

เพื่อความชัดเจนคำถามของฉันจะแตกต่างกันเนื่องจากฉันไม่ต้องการให้ไฟล์ยังคงไม่ถูกแตะต้อง git stash && git stash applyฉันเป็นเพียงการมองหาทางเลือกในการ คุณจะสังเกตได้ว่าคำตอบของคำถามนั้นค่อนข้างแตกต่างจากของฉัน
Michael Dorst

อ่าใช่มั้ยคำถามของคุณมีความเฉพาะน้อยลงเล็กน้อย แต่ฉันใส่คำถามนั้นเพราะคำตอบนั้นตอบสนองความต้องการของคุณได้ และด้วยวิธีนี้คำถามนี้จะปรากฏเป็น "เชื่อมโยง" ในแถบด้านข้างดังนั้นอาจเป็นประโยชน์กับใครบางคน
Mariusz Pawelski

คำตอบ:


157

สำหรับสิ่งที่มีค่าวิธีอื่นในการทำเช่นนี้คือการจัดเตรียมการเปลี่ยนแปลงที่คุณต้องการเก็บไว้จากนั้นซ่อนทุกอย่างโดยใช้--keep-index:

$ git add modified-file.txt
$ git stash push --keep-index

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

จากเอกสารLinux Kernel Git อย่างเป็นทางการสำหรับgit stashหรือจากgit-scm :

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


3
นี่คือคำอธิบายที่ตรงไปตรงมาที่สุดของ --keep-index ที่ฉันเคยเห็น ฉันไม่ได้รับความหมายค่อนข้างตามที่มันเป็นคำในเอกสาร
นักสืบ 40

52

git stashจากนั้นgit stash apply( git stash && git stash apply) จะซ่อนไฟล์และใช้ที่เก็บทันทีหลังจากนั้น ดังนั้นหลังจากทั้งหมดคุณจะมีการเปลี่ยนแปลงของคุณในที่ซ่อนและในการทำงาน dir

คุณสามารถสร้างนามแฝงได้หากต้องการในแบบชิ้นเดียว เพียงแค่ใส่สิ่งนี้เพื่อ~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"

ข้อเสียของวิธีการนี้คือไฟล์ทั้งหมดถูก stashed และสร้างใหม่ ซึ่งหมายความว่าการประทับเวลาของไฟล์ที่เป็นปัญหาจะเปลี่ยนไป (ทำให้ Emacs บ่นเมื่อฉันพยายามบันทึกไฟล์หากเปิดก่อนที่จะทำgit staและอาจทำให้เกิดการสร้างใหม่โดยไม่จำเป็นหากคุณใช้งานmakeหรือเป็นเพื่อน)


1
นอกจากนี้ความแตกต่างระหว่างgit stash; git stash applyและgit stash && git stash applyคืออะไร?
Michael Dorst

14
ผมเชื่อว่าความแตกต่างคือวิ่งคำสั่งที่สองเท่านั้นหากครั้งแรกกลับเป็นศูนย์รหัสสถานะ&&
madhead

2
@ anthropomorphic git config --global alias.sta "!git stash && git stash apply"ควรทำมัน

ฉันสามารถปรับเปลี่ยนนามแฝงนี้เพื่อใช้git stash saveกับการโต้แย้งและจากนั้นทำgit stash apply?
Spinningarrow

1
@ JaySidri, bang หมายความว่าเป็นคำสั่งภายนอกจริง ๆ ไม่ใช่อาร์กิวเมนต์ git เอง ตามเอกสาร : "อย่างที่คุณบอก Git เพียงแค่แทนที่คำสั่งใหม่ด้วยสิ่งที่คุณใช้แทนอย่างไรก็ตามบางทีคุณอาจต้องการเรียกใช้คำสั่งภายนอกแทนที่จะเป็นคำสั่งย่อย Git ในกรณีนี้คุณเริ่มคำสั่งด้วย ตัวละคร! "
บ้า

10

การปรับปรุงเล็กน้อยในคำตอบซึ่งอาจใช้งานได้จริง

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"

หมายเหตุ: ไม่ทำงานหากไม่มี "git add" (เช่นสำหรับการแก้ไข แต่ไม่ได้เพิ่มในการส่งไฟล์)
alex_1948511

4

มีเคล็ดลับที่อาจช่วยคุณได้ แต่ไม่ใช่ของสะสม แต่เป็นของ FWIW:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

และตอนนี้คุณมีการคอมมิตติดแท็กในการกำจัดของคุณมันเป็นไปไม่ได้ที่จะทำgit stash popต่อไป แต่คุณสามารถทำสิ่งต่าง ๆ เช่นการสร้างแพทช์หรือรีเซ็ตไฟล์ ฯลฯ จากที่นั่นไฟล์ dir ที่ทำงานของคุณก็ยังคงเหมือนเดิม


3

คุณสามารถใช้git stash createเพื่อสร้างการกระทำที่ซ่อนไว้แล้วบันทึกลงในที่เก็บข้อมูลโดยใช้git stash store:

git stash store $(git stash create) -m "Stash commit message"

สามารถบันทึกลงในนามแฝง git เพื่อให้สะดวกยิ่งขึ้น:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

โปรดทราบว่านี่ไม่ได้ทำทุกอย่างที่git stash pushทำ ตัวอย่างเช่นจะไม่ต่อท้ายชื่อสาขาเพื่อกระทำเช่น " stash@{0}: On myBranch: Stash commit message"


1
ชอบอันนี้!! หนึ่งการแก้ไขว่า: man git-stashกล่าวว่า-m <message>จะต้องมาก่อนที่จะกระทำการแฮช ยกเว้นสิ่งที่เปลี่ยนแปลงในคอมไพล์ใหม่
tanius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.