Vì git về cơ bản là quản lý tất cả nội dung và chỉ mục của kho lưu trữ (chứ không phải một hoặc một số tệp),git stash
, nên không có gì đáng ngạc nhiên,với tất cả các thư mục làm việc.
Trên thực tế, kể từ Git 2.13 (quý 2 năm 2017), bạn có thể bỏ các tệp riêng lẻ, với git stash push
:
git stash push [--] [<pathspec>...]
Khi pathspec
được trao cho ' git stash push
', stash mới chỉ ghi lại các trạng thái đã sửa đổi cho các tệp khớp với đường dẫn Xem " Thay đổi Stash cho các tệp cụ thể " để biết thêm.
Ví dụ đơn giản:
git stash push path/to/file
Trường hợp thử nghiệm cho tính năng này hiển thị thêm một vài tùy chọn:
test_expect_success 'stash with multiple pathspec arguments' '
>foo &&
>bar &&
>extra &&
git add foo bar extra &&
git stash push -- foo bar &&
test_path_is_missing bar &&
test_path_is_missing foo &&
test_path_is_file extra &&
git stash pop &&
test_path_is_file foo &&
test_path_is_file bar &&
test_path_is_file extra
Câu trả lời ban đầu (bên dưới, tháng 6 năm 2010) là về cách chọn thủ công những gì bạn muốn bỏ.
Bình luận của Casebash :
Điều này ( stash --patch
giải pháp ban đầu) là tốt, nhưng thường tôi đã sửa đổi rất nhiều tệp nên sử dụng bản vá rất khó chịu
Câu trả lời của bukzor (được nâng cấp, tháng 11 năm 2011) cho thấy một giải pháp thiết thực hơn, dựa trên
git add
+git stash --keep-index
.
Đi xem và nâng cao câu trả lời của anh ấy, nên là câu trả lời chính thức (thay vì của tôi).
Về tùy chọn đó, chhh chỉ ra một quy trình công việc thay thế trong các bình luận:
bạn nên " git reset --soft
" sau một cú ném như vậy để lấy lại giai đoạn rõ ràng của bạn:
Để trở về trạng thái ban đầu - đó là khu vực tổ chức rõ ràng và chỉ với một số sửa đổi không theo giai đoạn chọn, người ta có thể nhẹ nhàng đặt lại chỉ mục để nhận (mà không cần cam kết bất cứ điều gì như bạn - bukzor - đã làm).
(Câu trả lời gốc tháng 6 năm 2010: stash thủ công)
Tuy nhiên, git stash save --patch
có thể cho phép bạn đạt được một phần của bạn sau:
Với --patch
, bạn có thể tương tác chọn những người đi săn trong khoảng khác nhau giữa CHÍNH và cây làm việc được cất.
Mục nhập stash được xây dựng sao cho trạng thái chỉ mục của nó giống với trạng thái chỉ mục của kho lưu trữ của bạn và bảng công việc của nó chỉ chứa các thay đổi bạn đã chọn tương tác. Các thay đổi đã chọn sau đó được khôi phục từ bàn làm việc của bạn.
Tuy nhiên, điều đó sẽ lưu chỉ mục đầy đủ (có thể không phải là điều bạn muốn vì nó có thể bao gồm các tệp khác đã được lập chỉ mục) và một bàn làm việc một phần (có thể trông giống như tệp bạn muốn bỏ).
git stash --patch --no-keep-index
có thể là một phù hợp tốt hơn.
Nếu --patch
không hoạt động, một quy trình thủ công có thể:
Đối với một hoặc một số tệp, một giải pháp trung gian sẽ là:
- sao chép chúng bên ngoài repo Git
(Trên thực tế, eleotlecram đề xuất một giải pháp thay thế thú vị )
git stash
- sao chép chúng trở lại
git stash
# lần này, chỉ các tệp bạn muốn được lưu trữ
git stash pop stash@{1}
# áp dụng lại tất cả các sửa đổi tệp của bạn
git checkout -- afile
# đặt lại tệp về nội dung CHÍNH, trước khi sửa đổi cục bộ
Khi kết thúc quá trình khá rườm rà đó, bạn sẽ chỉ có một hoặc một vài tệp được lưu trữ.
git stash --keep-index
không giữ chỉ mục, nhưng nó làm hỏng mọi thứ - cả trong chỉ mục và ngoài.