Git stash uncached: จะลบการเปลี่ยนแปลงที่ไม่มีขั้นตอนทั้งหมดได้อย่างไร


102

สมมติว่ามีการเปลี่ยนแปลงสองชุดในโครงการที่สร้างโดย git ชุดหนึ่งเป็นฉากและอีกชุดไม่ได้

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

ฟังดูคล้ายกับgit stashคำสั่ง แต่git stashจะนำการเปลี่ยนแปลงทั้งแบบไม่มีขั้นตอนและแบบจัดฉากออกจากโครงการของฉัน git stash uncachedและฉันไม่สามารถหาสิ่งที่ต้องการ


1
ณ วันนี้ด้วย git 2.21 ของฉันยังไม่มีคำตอบที่ดีสำหรับสิ่งนี้ คำตอบด้านล่างทั้งหมดอาจไม่ถูกต้อง ( -kตัวเลือก) หรือยุ่งยากในการใช้
Penghe Geng

คำตอบ:


103

อัปเดต 2:
ฉันไม่แน่ใจว่าทำไมผู้คนถึงบ่นเกี่ยวกับคำตอบนี้ดูเหมือนว่าจะทำงานได้ดีกับฉันสำหรับไฟล์ที่ไม่มีการใช้งานคุณสามารถเพิ่ม-uค่าสถานะได้

คำสั่งเต็มจะกลายเป็น git stash --keep-index -u

และนี่คือตัวอย่างข้อมูลจากความgit-stashช่วยเหลือ

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

หากใช้ตัวเลือก --include-untracked ไฟล์ที่ไม่ได้ติดตามทั้งหมดจะถูกซ่อนไว้จากนั้นจึงล้างข้อมูลด้วย git clean ทำให้ไดเร็กทอรีการทำงานอยู่ในสถานะที่สะอาดมาก หากใช้ตัวเลือก --all แทนไฟล์ที่ละเว้นจะถูกซ่อนและล้างข้อมูลเพิ่มเติมจากไฟล์ที่ไม่ได้ติดตาม

และนี่คือ gif ของลักษณะ:

ป้อนคำอธิบายภาพที่นี่

อัปเดต:

แม้ว่านี่จะเป็นคำตอบที่เลือก แต่ก็มีหลายคนชี้ให้เห็นว่า [คำตอบด้านล่าง] (https://stackoverflow.com/a/34681302/292408) เป็นคำตอบที่ถูกต้องฉันขอแนะนำให้ตรวจสอบ

ฉันทดสอบคำตอบอีกครั้งในวันนี้ (31/1/2020) กับเวอร์ชัน git 2.24.0และฉันยังเชื่อว่าถูกต้องฉันได้เพิ่มบันทึกเล็ก ๆ ด้านบนเกี่ยวกับไฟล์ที่ไม่ได้ติดตาม หากคุณคิดว่ามันใช้งานไม่ได้โปรดระบุเวอร์ชันคอมไพล์ของคุณด้วย

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

git stash --keep-index

จากเอกสารของgit-stash :

การทดสอบการกระทำบางส่วน

คุณสามารถใช้git stash save --keep-indexเมื่อคุณต้องการทำการคอมมิตสองรายการขึ้นไปจากการเปลี่ยนแปลงในแผนผังงานและคุณต้องการทดสอบการเปลี่ยนแปลงแต่ละรายการก่อนที่จะดำเนินการ:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

แต่หากคุณต้องการตรวจสอบการเปลี่ยนแปลงทีละขั้นด้วยสายตาเท่านั้นคุณสามารถลองdifftool:

git difftool --cached

4
นอกจากนี้ยังให้git stash [-p|--patch]ความรู้สึกเหมือนการซ่อนแบบโต้ตอบ จากman git stash"With --patch คุณสามารถเลือก hunks แบบโต้ตอบจากความแตกต่างระหว่าง HEAD และโครงสร้างการทำงานที่จะซ่อน"
ที่นี่

1
ฉันมักจะadd -p, checkout -pและreset -pไม่เคยพยายามstash -pขอบคุณสำหรับเคล็ดลับ: D
โมฮัมหมัด AbuShady

22
โปรดทราบว่าคำตอบนี้จะซ่อนการเปลี่ยนแปลงที่คุณจัดเตรียมไว้ด้วย
Ben Flynn

2
คำตอบนี้ไม่มีประโยชน์จริง ๆ เนื่องจากจะทำให้เกิดความสับสน คำตอบนี้จะดีกว่าstackoverflow.com/a/34681302/292408
Elijah Lynn

1
@ElijahLynn ฉันเชื่อมโยงกับคำตอบอื่นเนื่องจากฉันพบผู้คนมากมายบอกว่ามันเป็นคำตอบที่ดีกว่าขอบคุณสำหรับความคิดเห็นของคุณ
Mohammad AbuShady

110

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

แนวคิดคือทำการคอมมิตชั่วคราวของการเปลี่ยนแปลงแบบทีละขั้นของคุณจากนั้นซ่อนการเปลี่ยนแปลงที่ไม่ได้จัดเตรียมไว้จากนั้นยกเลิกการคอมมิต temp:

# temp commit of your staged changes:
$ git commit --message "WIP"

# -u option so you also stash untracked files
$ git stash -u

# now un-commit your WIP commit:
$ git reset --soft HEAD^

ณ จุดนี้คุณจะมีข้อมูลการเปลี่ยนแปลงที่ไม่ได้จัดเตรียมไว้และจะแสดงเฉพาะการเปลี่ยนแปลงแบบทีละขั้นในสำเนาการทำงานของคุณเท่านั้น


22
นี่คือคำตอบที่ถูกต้องจริงๆ IMO --keep-indexตัวเลือกในคำตอบที่ได้รับการยอมรับในปัจจุบันยังคงเละเทะสิ่งที่อยู่ในดัชนีมันก็ยังช่วยให้มันอยู่ในดัชนี ดังนั้นมันจึงซ้ำกันและความฮาก็เกิดขึ้น
Ken Williams

4
@KenWilliams <del> ฮือฮา </del> <ins> โศกนาฏกรรม </ins>
tuespetre

@KenWilliams นั่นทำให้ฉันหงุดหงิดจริงๆ OP คุณช่วยปรับคำตอบที่เลือกได้ไหม
MikeMurko

2
git add .ขั้นตอนอาจต้องการที่จะได้รับการปรับปรุงโดยgit add --allเป็นที่ควรคว้าแฟ้มในไดเรกทอรีดังกล่าวข้างต้นไดเรกทอรีการทำงานปัจจุบันเกินไป
Elijah Lynn

1
นี่เป็นคำตอบที่ดีที่สุดเนื่องจากตัวเลือก - keep-index ในคำตอบที่ยอมรับนั้นทำให้เข้าใจผิด นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Elijah Lynn

22

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

วิธีเดียวที่แท้จริงที่ฉันพบในการซ่อนการเปลี่ยนแปลงที่ไม่มีขั้นตอนคืออย่าใช้ที่ซ่อนเลย:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .apply -Rยังจะทำงานแทน

งานงานงาน...

git apply unstaged.diff
rm unstaged.diff

1
ที่นี่ในgit version 2.6.1.windows.1, git stash -kทำงานตามที่อธิบายไว้
koppor

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ! เป็นเธรดเดียวในหลายเธรด stackoverflow ที่ทำในสิ่งที่อ้างสิทธิ์และไม่อาศัยการกำหนดค่า temp!
user643011

1
@ user643011: การกระทำชั่วคราวไม่ใช่สิ่งที่ไม่ดีในคอมไพล์ ไม่เสียค่าใช้จ่ายใด ๆ และไม่เป็นอันตรายต่อใคร
Fritz

2
@Fritz: ไม่มีการคอมมิตอุณหภูมิเป็นไปไม่ได้ในบางสถานการณ์ อาจล้มเหลวหากคุณมีเบ็ดก่อนคอมมิตที่ตรวจสอบรหัสการทำงานปัจจุบัน หากการเปลี่ยนแปลงตามขั้นตอนของคุณดี แต่การเปลี่ยนแปลงที่ไม่ได้จัดขั้นตอนของคุณไม่เป็นขั้นตอนวิธีนี้จะล้มเหลวในการยอมรับการเปลี่ยนแปลงแบบทีละขั้น
Penghe Geng

1
ซึ่งไม่รวมถึงไฟล์ที่ไม่ได้ติดตาม คุณต้องใช้ "git ls-files" เพื่อค้นหาและรวมไฟล์เหล่านั้นไว้ใน diff patch
ACyclic

5

Git: ซ่อนการเปลี่ยนแปลงที่ไม่ได้จัดเตรียมไว้

สิ่งนี้จะซ่อนการแก้ไขทั้งหมดที่คุณไม่ได้คอมไพล์เพิ่ม:

git stash -k

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

git stash -k -u 

นอกจากนี้ไดเร็กทอรีการทำงานของคุณต้องสะอาด (เช่นต้องเพิ่มการเปลี่ยนแปลงทั้งหมด) เมื่อคุณคอมไพล์ซ่อนป๊อปในภายหลัง

http://makandracards.com/makandra/853-git-stash-unstaged-changes


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