Dalam git, apakah mungkin untuk membuat simpanan, mendorong simpanan ke repositori jarak jauh, mengambil simpanan di komputer lain, dan menerapkan simpanan?
Atau apakah opsi saya:
- Buat tambalan dan salin tambalan ke komputer lain, atau
- Buat cabang kecil dan lakukan pekerjaan yang tidak lengkap ke cabang itu?
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/…Catatan: Saya baru saja menulis ulang jawaban ini dengan 24 jam lebih banyak git-fu di bawah ikat pinggang saya :) Dalam sejarah shell saya, seluruh shebang sekarang tiga baris satu. Namun, saya tidak memberikannya untuk kenyamanan Anda.
Dengan cara ini, saya harap Anda akan dapat melihat bagaimana saya melakukan sesuatu, alih-alih hanya perlu menyalin / menempelkan hal-hal secara membabi buta.
Ini langkah demi langkah.
Anggaplah sumber di ~ / OLDREPO mengandung simpanan. Buat klon TEST yang tidak mengandung simpanan:
Dorong semua simpanan sebagai cabang temp:
Ulangi ujung penerima untuk mengubah kembali menjadi simpanan:
Bersihkan cabang sementara Anda jika Anda mau
Lakukan daftar simpanan git dan Anda akan melihat sesuatu seperti ini:
Pada repositori asli, yang sama tampak seperti
sumber
git add .
sebelumgit stash save ...
karenagit stash
menolak untuk menyimpan file baru kecuali mereka telah dipentaskan. Juga, menyalurkan hasilgit rev-list ...
melaluitac
membalikkan urutan simpanan sehingga mereka keluar dalam urutan yang sama.for
perulangan terakhir dengangit branch -D stash_$a
(bersihkan saat simpanan dibuat) sehingga jika terjadi kesalahan dan kami coba lagi, kami tidak memproses ulang komitmen yang sudah berhasil disimpan.git stash save "$(git log --format='%s' -1 HEAD@{1})"
dengangit update-ref --create-reflog -m "$(git show -s --format=%B $rev)" refs/stash $rev
Anda mendapatkan pesan simpanan asli (update-ref
adalah apa digit stash save
balik layar).Saya sedikit terlambat ke pesta, tetapi saya percaya saya menemukan sesuatu yang bekerja untuk saya mengenai hal ini dan mungkin juga bagi Anda jika keadaan Anda sama atau serupa.
Saya sedang mengerjakan fitur di cabangnya sendiri. Cabang tidak digabung menjadi master dan didorong sampai selesai atau saya sudah membuat komitmen yang saya rasa nyaman ditunjukkan kepada publik. Jadi yang saya lakukan ketika saya ingin mentransfer perubahan yang tidak dipentaskan ke komputer lain adalah:
[non-commit] FOR TRANSFER ONLY
", menampilkan konten yang ingin Anda transfer.Kemudian lakukan:
git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb
URL mungkin berbeda untuk Anda jika Anda mengakses repositori Anda dengan cara yang berbeda. Ini akan menarik perubahan dari URL itu dari cabang jauh "rb" ke cabang lokal "lb". Perhatikan bahwa saya memiliki server ssh yang berjalan di komputer saya sendiri, dan saya dapat mengakses repositori dengan cara itu.
git reset HEAD^
(tersirat--mixed
)Ini me-reset HEAD untuk menunjuk ke negara sebelum komit "[non-komit]".
Dari git-reset (1): "
--mixed
: Mengatur ulang indeks tetapi bukan pohon yang berfungsi (yaitu, file yang diubah disimpan tetapi tidak ditandai untuk komit) [...]"Jadi Anda akan memiliki perubahan pada file pada akhirnya, tetapi tidak ada komitmen yang dibuat untuk dikuasai dan tidak perlu disimpan.
Namun ini akan mengharuskan Anda ke
git reset --hard HEAD^
dalam repositori tempat Anda membuat "[non-commit]", karena commit tersebut adalah sampah.sumber
Ini agak terlambat, tetapi jawaban ini mungkin bisa membantu seseorang. Saya ingin mengetahui hal ini karena saya ingin dapat mendorong fitur / bug / yang sedang dalam proses dan bekerja dari titik yang sama di komputer lain.
Apa yang berhasil bagi saya adalah melakukan kode sedang dalam proses (di cabang yang saya kerjakan sendiri). Ketika saya sampai di komputer saya yang lain, tarik, lalu batalkan komit dengan:
Terus bekerja seperti semula, dengan semua perubahan dalam proses di sana, tanpa komitmen, dan tidak dipentaskan.
Semoga ini bisa membantu.
sumber
Tampaknya ada trik yang sangat rapi untuk menyelesaikan ini. Anda dapat menggunakan
git diff > file.diff
(dan mengkomit file), lalu mengembalikan perubahan menggunakangit apply file.diff
(dari mana saja) untuk mencapai hasil yang sama.Ini dijelaskan di sini juga.
sumber
Saya akan menggunakan pendekatan kedua meskipun tidak tahu mengapa Anda tidak bisa mengkomitnya untuk menguasai / menampilkan cabang. Dimungkinkan untuk melakukan memetik ceri juga.
sumber
AFAIK seluruh ide simpanan adalah untuk menyembunyikan sesuatu yang tidak begitu penting di bawah karpet lokal . Tidak ada yang harus tahu tentang omong kosong favorit Anda ;-) Satu-satunya "tapi" adalah: Tetapi jika saya mengembangkan beberapa workstation? Maka
scp
jauh lebih baik.sumber
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:Saya memilih untuk mendorong simpanan
refs/stashes/*
sehingga saya tidak akan mengacaukan remote saya dengan cabang tambahan. Jadi saya bisa melakukannya dengan:(
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:
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:Karena saya sudah memiliki komit,
store
terdengar seperti apa yang saya inginkan. Jadi saya bisa melakukan: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:
Untuk membersihkan remote, simpanan dapat dihapus dari remote seperti:
Metode ini juga memiliki keuntungan menjadi idempoten: jika Anda menjalankan
push
perintah lagi, itu akan dilaporkanEverything up-to-date
. Thefetch
perintah juga dapat dengan aman menjalankan berulang kali. Meskipunstash store
lewati menyimpan simpanan jika sama dengan simpanan terbaru, ia tidak mencegah duplikat simpanan lama. Ini bisa diselesaikan, seperti yang saya lakukan dalamgit-rstash
skrip saya , lihat di bawah.Untuk penyelesaian, Anda juga dapat dengan mudah mendorong semua simpanan (dengan pesta):
atau impor semua simpanan yang diambil:
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.sumber
Berikut ini tidak berfungsi dengan simpanan, tetapi dengan perubahan yang tidak dikomit di direktori kerja. Ini membuat cabang, otomatis melakukan semua perubahan saat ini, dan mendorong ke remote:
Gunakan seperti:
sumber
Saya hanya akan membuat cabang simpanan baru dan menghapus setiap kali cabang itu tidak diperlukan.
sumber
Cukup gunakan Dropbox seperti yang dilakukan orang ini. Dengan begitu Anda tidak perlu khawatir tentang mendorong simpanan karena semua kode Anda akan dicadangkan.
http://blog.sapegin.me/all/github-vs-dropbox
sumber