Làm thế nào để xóa một stash được tạo bằng git stash tạo?


549

Git stash dường như làm rất nhiều thứ tôi muốn, ngoại trừ việc nó hơi khó để viết kịch bản, vì nếu bạn không có thay đổi, thì git stash; git stash popsẽ làm một cái gì đó khác với nếu bạn có thay đổi trong kho lưu trữ của mình.

Dường như đó git stash createlà câu trả lời cho vấn đề đó và mọi thứ đều hoạt động, ngoại trừ một điều mà tôi không thể thoát khỏi stash đã tạo. Có cách nào để thoát khỏi stash?

Để làm cho nó rõ ràng 100% những gì tôi đang làm:

Tạo stash:

~/tmp/a(master) $ git stash create 
60629375d0eb12348f9d31933dd348ad0f038435
~/tmp/a(master) $ git st
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#
~/tmp/a(master) $ git reset --hard
HEAD is now at 555d572 log message

Sử dụng stash:

~/tmp/a(master) $ git apply 60629375d0eb12348f9d31933dd348ad0f038435
fatal: can't open patch '60629375d0eb12348f9d31933dd348ad0f038435': No such file or directory
~/tmp/a(master) $ git stash apply 60629375d0eb12348f9d31933dd348ad0f038435
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#

Xóa stash: (ngoại trừ bit cuối cùng này không hoạt động)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference

Bất chấp khoảng cách về thời gian, tôi muốn chỉ ra cho những người bạn đồng hành rằng việc git applychạy trong hộp mã thứ hai tại thời điểm viết bài này đã không áp dụng một bản vá lỗi, thông báo lỗi trong đầu ra đã cho bạn biết điều này. Vì vậy, trên thực tế, bạn đã cố gắng tạo một stash (không hoạt động, xem các bình luận bên dưới) áp dụng một stash không được tạo sau đó thả một stash không được tạo. Đây là lý do tại sao không có gì bạn đã làm việc.
Giáo sư Tom

1
@ProfigatorTom stash đã được tạo, đó là lý do tại sao nó trả về mã băm và tại sao git stash applynó hoạt động. Các git applynỗ lực để đọc một tệp vá cục bộ, không tồn tại. Thành thật mà nói, nó có lẽ không nên ở đó, và nó không bao giờ có thể làm việc. Tôi mơ hồ muốn loại bỏ nó khỏi câu hỏi, nhưng cho rằng nó đã giúp rất nhiều trong hình thức hiện tại của nó, tôi sẽ để nó như vậy.
Paul Wagland

Câu trả lời:


369

Để xóa một stash bình thường được tạo bằng git stash, bạn muốn git stash drophoặc git stash drop stash@{n}. Xem dưới đây để biết thêm chi tiết.


Bạn không cần phải xóa một stash được tạo bằng git stash create. Từ các tài liệu:

Tạo một mục nhập stash (là một đối tượng cam kết thông thường) và trả về tên đối tượng của nó, mà không lưu trữ nó ở bất cứ đâu trong không gian tên ref. Điều này được dự định sẽ hữu ích cho các kịch bản. Nó có thể không phải là lệnh bạn muốn sử dụng; xem "lưu" ở trên.

Vì không có gì tham chiếu đến cam kết stash, cuối cùng nó sẽ nhận được rác.


Một stash được tạo bằng git stashhoặc git stash saveđược lưu vào refs/stashvà có thể bị xóa bằng git stash drop. Như với tất cả các đối tượng Git, nội dung stash thực tế không bị xóa khỏi máy tính của bạn cho đến khi cắt gctỉa các đối tượng đó sau khi chúng hết hạn (mặc định là 2 tuần sau).

Stash cũ hơn được lưu trong refs/stash reflog (thử cat .git/logs/refs/stash) và có thể bị xóa với git stash drop stash@{n}, nsố được hiển thị ở đâu git stash list.


20
Nó không trả lời câu hỏi chuẩn mực. Kết quả là, những người như tôi, người đến câu hỏi thông qua Google để tìm câu trả lời cho câu hỏi giật gân và không đặc biệt quan tâm đến các chi tiết thực tế, bỏ phiếu cho người thực sự trả lời nó. Một số người cũng bỏ phiếu xuống câu trả lời được chấp nhận vì nó không giúp họ. Cá nhân tôi chỉ nêu lên câu trả lời đã giúp tôi.
ArtOfWarfare

15
Vì vậy: 1) Google "git xóa stash" 2) nhấp vào liên kết SO dựa trên nửa đầu của tiêu đề câu hỏi 3) tải xuống câu trả lời đúng cụ thể cho nửa sau của tiêu đề. Đó là một cái mới.
dahlbyk

10
@ArtOfWarfare Đó sẽ là một sự thiếu hiểu biết về đọc, bởi vì đây rõ ràng là một câu trả lời cho "câu hỏi giật gân".
Chris Hayes

1
Đủ công bằng. Tôi tạo ra các bản sao của mình chỉ bằng cách sử dụng git stash- Tôi không biết điều đó thực sự ánh xạ tới git stash createhay thứ gì khác. Git chắc chắn là thứ tôi vẫn đang tìm hiểu (nếu không, tôi sẽ không đọc SO Q & As như thế này.)
ArtOfWarfare

1
@AdrianPronk Đây chính xác là loại điều tôi muốn giới thiệu thực sự sử dụng git stash createcho. Thay vì lưu trong tệp vá dấu thời gian, bạn có thể để git reflog lưu nó cho bạn trong một ref tùy chỉnh (ví dụ refs/backup). Tôi sẽ thử một cái gì đó như 1) git stash create, 2) so sánh cây mới của stash với refs/backup^{tree}, 3) nếu cây khác git update-ref --create-reflog refs/backup <stash-sha>. Cuối cùng, các bản sao lưu cũ sẽ được cắt tỉa tự động.
dahlbyk

838

git stash dropmất không có tham số - mà giọt stash đầu - hoặc một tham chiếu stash mà trông giống như: stash@{n}nđề cử mà giấu để thả. Bạn không thể vượt qua một id cam kết git stash drop.

git stash drop            # drop top hash, stash@{0}
git stash drop stash@{n}  # drop specific stash - see git stash list

Thả một stash sẽ thay đổi các stash@{n}định danh của tất cả các ẩn nấp tiếp tục xuống stack.

Tôi không chắc chắn lý do tại sao bạn nghĩ cần bỏ stash vì nếu bạn đang sử dụng stash createmục stash không được tạo cho "stash" của bạn thì sẽ không có gì để bỏ.


Chà, mục nhập được tạo bằng cách sử dụng "stash", One One sẽ nghĩ rằng nó sẽ bị xóa bằng cách sử dụng "stash".
Paul Wagland

2
Nhìn vào trang người đàn ông cho git stash. Stash tạo không tạo ra một mục, chỉ có đối tượng cam kết cho stash nên không có mục nào trong nhật ký stash để loại bỏ.
CB Bailey

3
From man : tạo Tạo một stash (là một đối tượng cam kết thông thường) và trả về tên đối tượng của nó, mà không lưu trữ nó ở bất cứ đâu trong không gian tên ref.
ruffin

40
Thận trọng : Có lẽ bạn không nên bỏ nhiều như 1, 2, 3, vì thực tế cuối cùng bạn sẽ bỏ những gì ban đầu là số 1, 3 và 5. Cách chính xác để bỏ 1, 2 và 3, sẽ là thực hiện chúng theo thứ tự 3, 2, 1 hoặc 1, 1, 1. Ngoài ra, đó là 0 được lập chỉ mục, với 0 nằm ở đầu ngăn xếp.
ArtOfWarfare

2
Tiện ích mở rộng Git đưa ra một lệnh không xác định khi nhấn nút "Stash Change" và bất cứ điều gì nó vẫn tồn tại khi thoát và khởi động lại ứng dụng. Không có cách rõ ràng nào để loại bỏ stash bằng GUI, nhưng từ dòng lệnh "git stash list" hiển thị stash WIP và "git stash Clear" sẽ loại bỏ nó.
Dave

215

Nếu bạn chắc chắn 100% rằng bạn chỉ có một stash hoặc bạn muốn xóa tất cả các stash ( git stash listhãy chắc chắn 107%), bạn có thể thực hiện:

git stash clear

.. và quên chúng đi (nó xóa tất cả các stash).

Lưu ý: Đã thêm câu trả lời này cho những người đã kết thúc ở đây đang tìm cách xóa tất cả (như tôi).


26
Nếu bạn chỉ có một stash, tôi vẫn khuyên bạn nên sử dụng git stash drop, vì điều đó chỉ làm giảm một stash và bạn không phải lo lắng về việc mất nhiều hơn dự kiến.
Paul Wagland

Được nêu lên vì nó thực sự trả lời câu hỏi, có hay không thực hành tốt nhất. Tôi thực sự cần điều này, vì các stash tôi đã tạo ngày hôm nay cần phải biến mất.
Alex McCabe

2
Tôi đã sử dụng stash từ lâu rồi. Tuy nhiên, lần này tôi không thể thoát khỏi cú ném cuối cùng mà tôi đã làm bằng cách sử dụng git stash dropnhư bình thường. Tôi không chắc chắn về những gì tôi đã làm khác nhau. Dù sao, git stash clearlàm việc cho tôi. Không biết nó tồn tại. +1
Konstantinos Gaitanis

3
+1 vì git đã từ chối bỏ stash, vì một trong những tệp được tạo bởi stash đã tồn tại ..
Thiago Barcala

12
cụ thể, chắc chắn 107%.
levininja

84

Từ tài liệu git: http://git-scm.com/docs/git-stash

thả [-q | --quiet] []

Xóa một trạng thái stash duy nhất khỏi danh sách stash. Khi không được đưa ra, nó sẽ loại bỏ cái mới nhất. tức là stash@{0}, nếu không phải là một tham chiếu nhật ký stash hợp lệ của biểu mẫu stash @ {}.

thí dụ:

git stash drop stash@{5}

Điều này sẽ xóa mục stash 5. Để xem tất cả danh sách các stash:

git stash list

4
Ngoại trừ việc tôi nói rõ ràng ở cuối câu hỏi rằng git stash drop không làm những gì tôi muốn.
Paul Wagland

1
Tôi sẽ khuyên bạn nên kiểm tra nội dung của một stash bằng cách sử dụng - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}trước khi thực hiện git stash drop. Tin tôi đi, nó sẽ cứu được rất nhiều rắc rối :)
realPK

71

Bạn nên sử dụng

git stash save

và không

git stash create

bởi vì điều này tạo ra một stash (là một đối tượng cam kết thông thường) và trả về tên đối tượng của nó, mà không lưu trữ nóbất cứ đâu trong không gian tên ref. Do đó sẽ không thể truy cập được với stash áp dụng.

Sử dụng git stash save "some comment"được sử dụng khi bạn có các thay đổi chưa được thực hiện mà bạn muốn sao chép / chuyển sang một chi nhánh khác

Sử dụng git stash apply stash@{0}(giả sử chỉ số stash đã lưu của bạn là 0) khi bạn muốn các thay đổi (stash) đã lưu của bạn phản ánh trên nhánh hiện tại của bạn

bạn luôn có thể sử dụng git stash listđể kiểm tra tất cả các chỉ mục của bạn

và sử dụng git stash drop stash@{0}(giả sử chỉ số stash đã lưu của bạn là 0 và bạn muốn xóa nó) để xóa một stash cụ thể.


3
Chỉ để biết thông tin - Đơn giản chỉ cần gõ lệnh git stashmặc định thànhgit stash save
RBT

1
git stash createđược dự định sẽ được sử dụng bởi các kịch bản. Đó là trường hợp sử dụng của OP. Vì vậy, khuyến nghị git stash savecó thể hữu ích cho việc sử dụng "bình thường", nhưng không phải cho trường hợp sử dụng của OP. OP có thể muốn xem qua các tài liệu : có nhiều lệnh hơn liên quan đến kịch bản, ví dụgit stash store
Adrian W

1
git stash save "message"ngày nay nên đọc git stash push -m "message". So sánhgit commit -m "message"
Tino

2

Nó cũng hoạt động

git stash drop <index>

giống

git stash drop 5

1

Tài liệu ở đây (bằng tiếng Trung Quốc) xin vui lòng bấm vào.

bạn có thể dùng

danh sách git stash

git stash thả stash @ {0}

nhập mô tả hình ảnh ở đây


git stash createlà khác nhau để git stash save, đặc biệt là tạo hình không hiển thị trong danh sách, và không thể được giảm xuống, do đó câu hỏi.
Paul Wagland

@PaulWagland Cảm ơn câu trả lời của bạn và cung cấp câu trả lời. Thành thật Tôi không tìm thấy "git stash created" trong tài liệu chính thức. Nhưng về điều này, nó làm tôi thích thú. Nếu bạn muốn tìm "git stash created" trong "danh sách git stash". bạn có thể làm điều này ở trên.
Longalei

0
git stash           // create stash,
git stash push -m "message" // create stash with msg,
git stash apply         // to apply stash,
git stash apply indexno // to apply  specific stash, 
git stash list          //list stash,
git stash drop indexno      //to delete stash,
git stash pop indexno,
stash pop = stash drop + stash apply
git stash clear         //clear all your local stashed code
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.