Các câu trả lời chấp nhận hiện nay là chính xác về mặt kỹ thuật, bạn không thể trực tiếp nói với Git để đẩy tất cả ẩn nấp của bạn đến một vùng xa, và sau đó kéo tất cả mọi thứ vào ẩn nấp địa phương của bạn trên máy tính khác.
Và trong khi câu trả lời được nâng cấp hiện tại nên hoạt động, tôi không thích rằng nó tạo ra một loạt các nhánh tạm thời và nó yêu cầu kiểm tra thủ công stash và lưu nó dưới dạng stash, điều này có thể dẫn đến các vấn đề như nhận xét này đã đề cập , và dẫn đến một bản sao On (no branch): On testing:
. Chắc chắn phải có một cách tốt hơn!
Vì vậy, trong khi bạn không thể trực tiếp đẩy stash, thì stash chỉ là một cam kết (thực tế là hai lần xác nhận) và trên mỗi git push
trang man bạn có thể đẩy các cam kết:
Đây <src>
thường là tên của chi nhánh bạn muốn đẩy, nhưng nó có thể là bất kỳ "biểu thức SHA-1" tùy ý nào ...
Tôi đã chọn đẩy các stash để refs/stashes/*
không làm hỏng điều khiển từ xa của mình với các nhánh phụ. Vì vậy, tôi có thể làm điều đó với:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
( rev-parse
Lệnh nhận được hàm băm ngắn của stash, sẽ là duy nhất cho repo.)
Tiếp theo, tôi cần lấy stash từ máy tính khác. Git chỉ tìm nạp các nhánh theo mặc định, vì vậy tôi cần tìm nạp các stash cụ thể:
git fetch origin refs/stashes/*:refs/stashes/*
Bây giờ để chuyển đổi stash commit trở lại thành một stash thực tế. Như đã đề cập, trong khi tôi chỉ có thể kiểm tra stash commit, đặt lại và stash như bình thường, tôi không muốn nó đòi hỏi các bước bổ sung hoặc nó có thể không duy trì trạng thái chỉ mục cho stash. Tôi đã tìm kiếm trực tuyến một cách để làm điều đó tự động, nhưng tìm kiếm của tôi đã làm tôi thất bại. Cuối cùng tôi xem qua trang người đàn ông git stash
, nơi tôi tìm thấy cái này:
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. Đ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.
cửa hàng
Lưu trữ một stash nhất định được tạo thông qua git stash tạo (đó là một cam kết hợp nhất lơ lửng) trong stash ref, cập nhật stash reflog. Đ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ì tôi đã có cam kết, store
âm thanh như những gì tôi muốn. Vì vậy, tôi có thể làm:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Thay thế <SHA>
bằng stash vừa được tải.
(Các git show
Lệnh nhận thông báo cam kết từ cam kết stash, để sử dụng làm thông báo cho nhật ký stash.)
Stash bây giờ xuất hiện như bình thường trong repo địa phương của tôi:
$ git stash list
stash@{0}: On master: temp
...
Để dọn dẹp điều khiển từ xa, các stash có thể bị xóa khỏi điều khiển từ xa như vậy:
git push origin :refs/stashes/<SHA>
Phương pháp này cũng có lợi ích là không cần thiết: nếu bạn chạy lại push
lệnh, nó sẽ báo cáo Everything up-to-date
. Các fetch
lệnh cũng có thể chạy một cách an toàn liên tục. Mặc dù stash store
sẽ bỏ qua việc lưu trữ stash nếu nó giống với stash gần đây nhất, nhưng nó không ngăn chặn các bản sao cũ của stash. Điều này có thể được giải quyết xung quanh, như tôi làm trong git-rstash
kịch bản của mình , xem bên dưới.
Để hoàn thành, bạn cũng có thể dễ dàng đẩy tất cả các stash (với bash):
for i in $(seq 0 $(expr $(git rev-list --walk-reflogs --count stash) - 1))
do
git push origin stash@{$i}:refs/stashes/$(git rev-parse --short stash@{$i})
done
hoặc nhập tất cả các bản tải xuống:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
Tôi đã tạo ra một bashtập lệnh có thể được gọi là một tiểu ban (ví dụ git rstash push 0
) vì vậy tôi không phải nhớ tất cả điều này. git-rstash
có thể được tìm thấy ở đây.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
sựgit stash apply some-remote/stash
. Nhưng bạn không thể nhận được các bản cũ hơn vì chúng được lưu trữ trong bản reflog không thể tải được. Xem stackoverflow.com/questions/2248680/ từ