Stash là một cam kết hợp nhất đặc biệt của cây công việc giữa cam kết cơ sở và chỉ mục. Một cách có thể là lưu từng bản vá riêng biệt, kiểm tra stash cha mẹ đầu tiên, khôi phục chỉ mục và cây công việc từ hai bản vá và cuối cùng khôi phục lại bản gốc (có vẻ như một câu trả lời theo cách này).
Điều này là cần thiết để tạo lại đầy đủ tất cả thông tin từ stash và nếu bạn không quan tâm đến điều đó thì ít nhất bạn nên kiểm tra cha mẹ đầu tiên của stash trước khi khôi phục để tránh xung đột và theo dõi nơi stash được tạo.
Đây là những gì tôi đã làm để khôi phục hoàn toàn tất cả các stash từ repo này sang repo khác. Nếu bạn không thể có chúng trên cùng một máy tính, bạn có thể lưu các thẻ stash trong một gói sau khi tạo chúng và sao chép danh sách refs và gói vào máy tính đích.
Từ gốc của repo gốc:
- Lấy danh sách các stash ref
- Gắn thẻ giới thiệu stash của bạn để bạn có thể truy xuất chúng bằng git fetch (tên thẻ không phải là vấn đề, thay đổi nó nếu có xung đột. Tôi đã sử dụng
stash_
+ số trong tham chiếu stash logic)
- Chuyển đổi các tham chiếu logic thành băm sha1 theo thứ tự ngược lại - chúng tôi sẽ sử dụng chúng sau
- Lưu đường dẫn repo đó - cũng để sau
refs=$(git stash list|cut -d: -f1)
for ref in $refs; do tag stash_${ref//[^0-9]} $ref; done
refs=$(git rev-parse $refs|tac)
oldpath=$PWD
NB: Điều này yêu cầu bash hoặc shell tương thích (ksh, zsh nên làm ...) Bạn cũng có thể tăng một biến, ví dụ stash_$((i++))
nếu shell của bạn không hỗ trợ${param//pattern}
Bây giờ trong repo mới, cho mỗi ref:
- Tìm nạp ref từ repo cũ (chúng tôi thậm chí không cần sử dụng tên thẻ, vì chúng tôi đã gắn thẻ chúng, chúng tôi có thể truy xuất chúng bằng git fetch)
- Nhập lại stash từ ref, sử dụng chủ đề của ref đó làm thông điệp stash.
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
git stash save
hiện không được ủng hộgit stash push