Jawaban yang saat ini diterima secara teknis benar, Anda tidak bisa secara langsung memberitahu Git untuk mendorong semua simpanan Anda ke jarak jauh, dan kemudian menarik semuanya ke simpanan lokal Anda di komputer lain.
Dan sementara jawaban top-upvoted saat ini harus berfungsi, saya tidak suka itu menciptakan banyak cabang sementara, dan bahwa itu memerlukan manual memeriksa simpanan komit dan menyimpannya sebagai simpanan, yang dapat menyebabkan masalah seperti komentar ini disebutkan , dan mengarah ke duplikat On (no branch): On testing:
. Tentunya harus ada cara yang lebih baik!
Jadi, sementara Anda tidak dapat secara langsung mendorong simpanan, simpanan hanyalah komit (sebenarnya dua komit), dan per git push
halaman manual Anda dapat mendorong komit:
The <src>
seringkali nama cabang yang Anda ingin mendorong, tetapi bisa sewenang-wenang "SHA-1 ekspresi" ...
Saya memilih untuk mendorong simpanan refs/stashes/*
sehingga saya tidak akan mengacaukan remote saya dengan cabang tambahan. Jadi saya bisa melakukannya dengan:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
( rev-parse
Perintah mendapatkan hash pendek simpanan, yang akan unik untuk repo.)
Selanjutnya, saya perlu mengambil simpanan dari komputer lain. Git hanya mengambil cabang secara default, jadi saya perlu mengambil simpanan khusus:
git fetch origin refs/stashes/*:refs/stashes/*
Sekarang untuk mengubah simpanan komit kembali menjadi simpanan aktual. Seperti yang disebutkan, sementara saya hanya bisa memeriksa simpanan komit, reset, dan simpanan seperti biasa, saya tidak suka itu membutuhkan langkah-langkah tambahan, atau bahwa itu mungkin tidak mempertahankan status indeks untuk simpanan. Saya mencari secara online cara untuk melakukan itu secara otomatis, tetapi pencarian-fu saya gagal. Akhirnya saya mencari-cari di halaman manual git stash
, di mana saya menemukan ini:
buat
Buat simpanan (yang merupakan objek komit biasa) dan kembalikan nama objeknya, tanpa menyimpannya di mana pun di ruang nama ref. Ini dimaksudkan untuk berguna bagi skrip. Ini mungkin bukan perintah yang ingin Anda gunakan; lihat "simpan" di atas.
store
Menyimpan simpanan tertentu yang dibuat melalui git stash create (yang merupakan komit gabungan yang menggantung) di simpanan ref, memperbarui reflog simpanan. Ini dimaksudkan untuk berguna bagi skrip. Ini mungkin bukan perintah yang ingin Anda gunakan; lihat "simpan" di atas.
Karena saya sudah memiliki komit, store
terdengar seperti apa yang saya inginkan. Jadi saya bisa melakukan:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Mengganti <SHA>
dengan simpanan yang baru saja diambil.
( git show
Perintah mendapat pesan komit dari simpanan komit, untuk digunakan sebagai pesan untuk simpanan log.)
Stash sekarang muncul seperti biasa di repo lokal saya:
$ git stash list
stash@{0}: On master: temp
...
Untuk membersihkan remote, simpanan dapat dihapus dari remote seperti:
git push origin :refs/stashes/<SHA>
Metode ini juga memiliki keuntungan menjadi idempoten: jika Anda menjalankan push
perintah lagi, itu akan dilaporkan Everything up-to-date
. The fetch
perintah juga dapat dengan aman menjalankan berulang kali. Meskipun stash store
lewati menyimpan simpanan jika sama dengan simpanan terbaru, ia tidak mencegah duplikat simpanan lama. Ini bisa diselesaikan, seperti yang saya lakukan dalam git-rstash
skrip saya , lihat di bawah.
Untuk penyelesaian, Anda juga dapat dengan mudah mendorong semua simpanan (dengan pesta):
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
atau impor semua simpanan yang diambil:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
Saya telah membuat pestaskrip yang dapat disebut sebagai sub-perintah (misalnya git rstash push 0
) jadi saya tidak harus mengingat semua ini. git-rstash
dapat ditemukan di sini.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
itugit stash apply some-remote/stash
. Tetapi Anda tidak bisa mendapatkan simpanan lama karena disimpan dalam reflog yang tidak dapat diambil. Lihat stackoverflow.com/questions/2248680/…