Tôi cất giấu những thay đổi của mình. Bây giờ tôi muốn hủy bỏ chỉ một số tệp từ stash. Tôi có thể làm cái này như thế nào?
Tôi cất giấu những thay đổi của mình. Bây giờ tôi muốn hủy bỏ chỉ một số tệp từ stash. Tôi có thể làm cái này như thế nào?
Câu trả lời:
Như được đề cập dưới đây và chi tiết trong " Làm cách nào tôi trích xuất một tệp duy nhất (hoặc thay đổi thành tệp) từ git stash? ", Bạn có thể áp dụng sử dụng git checkout
hoặc git show
khôi phục một tệp cụ thể.
git checkout stash@{0} -- <filename>
Điều đó ghi đè lên filename
: đảm bảo bạn không có sửa đổi cục bộ hoặc thay vào đó bạn có thể muốn hợp nhất tệp đã lưu .
(Theo nhận xét của Jaime M. , đối với một số shell nhất định như tcsh nơi bạn cần thoát các ký tự đặc biệt, cú pháp sẽ là git checkout 'stash@{0}' -- <filename>
:)
hoặc để lưu nó dưới tên tệp khác:
git show stash@{0}:<full filename> > <newfile>
(lưu ý rằng đây
<full filename>
là tên đường dẫn đầy đủ của một tệp liên quan đến thư mục trên cùng của dự án (nghĩ: liên quan đếnstash@{0}
)).
yucer gợi ý trong các ý kiến :
Nếu bạn muốn chọn thủ công những thay đổi bạn muốn áp dụng từ tệp đó:
git difftool stash@{0}..HEAD -- <filename>
Vivek thêm vào trong các ý kiến :
Có vẻ như "
git checkout stash@{0} -- <filename>
" khôi phục phiên bản của tệp tại thời điểm stash được thực hiện - nó KHÔNG áp dụng (chỉ) các thay đổi được lưu cho tệp đó.
Để làm sau:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(như nhận xét của peterflynn , | git apply -p1
trong một số trường hợp , bạn có thể cần xóa một ( p1
) dấu gạch chéo hàng đầu khỏi đường dẫn khác biệt truyền thống)
Như đã nhận xét: "unstash" ( git stash pop
), sau đó:
git add
)git stash --keep-index
Điểm cuối cùng là những gì cho phép bạn giữ một số tập tin trong khi đâm vào những người khác.
Nó được minh họa trong " Cách bỏ chỉ một tệp trong số nhiều tệp đã thay đổi ".
git stash pop
do xung đột tập tin. Câu trả lời của Balamurugan A đã lừa tôi trong trường hợp đó.
unstash
có nghĩa pop
, vì dường như với tôi rằng có lẽ trong hầu hết các trường hợp, điều này chỉ trả lời một phần câu hỏi. Sau đó, làm thế nào để bạn loại bỏ các phần được áp dụng có chọn lọc khỏi stash để tránh xung đột và / hoặc nhầm lẫn sau đó khi bật các thay đổi còn lại?
git checkout stash@{N} <File(s)/Folder(s) path>
Ví dụ. Để chỉ khôi phục tệp ./test.c và thư mục ./include từ lần lưu cuối cùng,
git checkout stash@{0} ./test.c ./include
-a
cờ trong khi tạo stash.
Tôi nghĩ rằng câu trả lời của VonC có thể là những gì bạn muốn, nhưng đây là một cách để thực hiện một "git áp dụng" có chọn lọc:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
bất cứ điều gì.
git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt
- các backticks là cần thiết để PS không diễn giải các dấu ngoặc đặc biệt và điều sc
này là cần thiết vì >
toán tử của PS mặc định là UTF-16 (thực ra là UCS-2) có thể không phải là điều bạn muốn. @Balamurugan Câu trả lời của A không gặp phải những vấn đề này.
Danh sách đầu tiên tất cả các stash
git stash list
↓
stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'
Sau đó hiển thị tệp nào trong stash (cho phép chọn stash 1):
git stash show 1 --name-only
//Hint: you can also write
//git stash show stash@{1} --name-only
↓
ajax/product.php
ajax/productPrice.php
errors/Company/js/offlineMain.phtml
errors/Company/mage.php
errors/Company/page.phtml
js/konfigurator/konfigurator.js
Sau đó áp dụng tệp bạn muốn:
git checkout stash@{1} -- <filename>
hoặc toàn bộ thư mục:
git checkout stash@{1} /errors
Nó cũng hoạt động mà không có --
nhưng nên sử dụng chúng. Xem bài này .
Nó cũng là thông thường để nhận ra một dấu gạch nối kép như một tín hiệu để dừng giải thích tùy chọn và xử lý tất cả các đối số sau đây theo nghĩa đen.
git stash pop
ra lỗi cho các tập tin không được theo dõi. cảm ơn bạn.
nếu bạn git stash pop
(không có xung đột), nó sẽ xóa stash sau khi được áp dụng. Nhưng nếu bạn git stash apply
sẽ áp dụng bản vá mà không xóa nó khỏi danh sách stash. Sau đó, bạn có thể hoàn nguyên các thay đổi không mong muốn vớigit checkout -- files...
git stash pop
và có Mâu thuẫn, bạn sẽ phải sửa chúng bằng tay và stash sẽ KHÔNG bị xóa.
Một cách nữa:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
hoặc show
sẽ ghi đè lên tệp của bạn một cách mù quáng thay vì chỉ áp dụng các thay đổi. "Một cách nữa" là một cách đánh giá thấp.
path/to/file2
như bạn muốn khác với cùng một tệp trong không gian làm việc của bạn. Rời khỏi con đường thứ hai hoạt động tốt cho tôi. - Và tôi nhận được một thông báo lỗi bằng cách sử dụng -R
tùy chọn ("áp dụng bản vá ngược lại", cố gắng vá phiên bản đã lưu?!). Vì vậy, phiên bản làm việc của tôi trông như thế git diff stash@{N}^! -- path/to/file | git apply -
.
...| git apply -3 -
Đối với người dùng Windows: dấu ngoặc nhọn có ý nghĩa đặc biệt trong PowerShell. Bạn có thể bao quanh với dấu ngoặc đơn hoặc thoát với backtick. Ví dụ:
git checkout 'stash@{0}' YourFile
Không có nó, bạn có thể nhận được một lỗi:
Unknown switch 'e'