Apa kasus penggunaan yang dimaksudkan untuk git stash?

143

Jika saya bekerja di cabang A dan tiba-tiba perlu bekerja di cabang B sebelum siap dengan komit di cabang A, saya menyimpan perubahan saya di A, checkout B, melakukan pekerjaan saya di sana, lalu checkout A dan menerapkan simpanan.

Jika saya bekerja di A dan saya ingin berhenti bekerja untuk hari itu, haruskah saya menyimpan pekerjaan saya dan kemudian menerapkannya keesokan harinya (ketika saya melanjutkan pekerjaan saya), atau haruskah saya membiarkan hal-hal sebagaimana adanya — file modifikasi yang tidak terikat di direktori kerja? Saya tidak mengerti mengapa saya perlu menggunakan simpanan dalam kasus ini, kecuali jika ada beberapa manfaat keamanan.

Juga, skenario lain: Saya bekerja di tempat kerja dan di rumah. Jika saya belum siap dengan commit ketika saya ingin pulang, dapatkah saya menyimpan pekerjaan saya, mendorongnya ke GitHub dan kemudian menarik simpanan itu di rumah?

Alexander
sumber
3
sangat bergantung pada kebijakan perusahaan Anda, jika ada. Bagaimana Anda akan memilih jawaban "diterima"?
Daemon Painter
1
Pertanyaan seperti yang diutarakan ini hanya meminta pendapat (haruskah saya menggunakan git dengan cara ini atau itu ?) Dan karenanya harus ditutup atau diedit.
TylerH

Jawaban:

161

Stash hanyalah metode kenyamanan. Karena cabang sangat murah dan mudah dikelola di git, saya pribadi hampir selalu lebih suka membuat cabang sementara yang baru daripada menyimpannya, tetapi ini lebih banyak masalah selera.

Satu tempat yang saya suka menyembunyikan adalah jika saya menemukan bahwa saya lupa sesuatu di komit terakhir saya dan sudah mulai mengerjakan yang berikutnya di cabang yang sama:

# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something

# stash away the current mess I made
git stash save

# some changes in the working dir

# and now add them to the last commit:
git add -u
git commit --amend

# back to work!
git stash pop
Mureinik
sumber
2
Apakah hal yang Anda tambahkan yang hilang digabung ke dalam simpanan setelah Anda melepaskannya? (Saya masih ragu tentang bagaimana garis waktu bekerja di git - saya berasumsi Anda menimpa sejarah ??)
Kiki Jewell
Perubahan yang muncul @KikiJewell diterapkan pada indeks - perubahan tersebut tidak dilakukan. jadi jika Anda git stash popdua kali, Anda akan kehilangan perbedaan antara dua set perubahan tersebut.
Mureinik
Hingga akhir Oktober 2017, telah terjadi diskusi ekstensif di milis Git, di mana perintah git stash save tidak digunakan lagi untuk mendukung alternatif yang ada git stash push. Alasan utama untuk ini adalah yang git stash pushmemperkenalkan opsi untuk menyembunyikan pathspec yang dipilih , sesuatu yang git stash savetidak mendukung.
Krishna Gupta
@Mureinik, apa pendapat kamu tentang cabang baru vs git stash branch?
Pacerier
@Pacerier seperti yang saya katakan di paragraf pertama, saya hampir selalu lebih suka hanya membuat cabang baru, tetapi itu mungkin lebih merupakan kekuatan kebiasaan daripada alasan teknis yang masuk akal.
Mureinik
41

Saya akan memecahkan jawaban pada tiga paragraf.

Bagian 1:

git stash(Untuk menyimpan perubahan yang tidak dikomit dalam "simpanan". Catatan: ini menghapus perubahan dari pohon kerja!)

git checkout some_branch(ubah ke cabang yang dituju - dalam hal ini some_branch)

git stash list (daftar simpanan)

Anda dapat melihat:
stash @ {0}: WIP pada {branch_name}: {SHA-1 of last commit} {last commit of you branch}
stash @ {0}: WIP on master: 085b095c6 modification for test

git stash apply (untuk menerapkan simpanan ke pohon kerja di cabang saat ini)

git stash apply stash@{12}(jika Anda memiliki banyak simpanan, Anda dapat memilih simpanan apa yang akan diterapkan - dalam hal ini kami menerapkan simpanan 12)

git stash drop stash@{0}(untuk menghapus dari daftar simpanan - dalam hal ini simpanan 0)

git stash pop stash@{1} (untuk menerapkan simpanan yang dipilih dan melepaskannya dari daftar simpanan)

Bagian 2:
Anda dapat menyembunyikan perubahan Anda dengan perintah ini tetapi tidak perlu.
Anda dapat melanjutkan keesokan harinya tanpa simpanan.
Perintah ini untuk menyembunyikan perubahan Anda dan bekerja di cabang yang berbeda atau untuk implementasi beberapa realisasi kode Anda dan simpan dalam simpanan tanpa cabang dan komitor kasus khusus Anda!
Dan nanti Anda dapat menggunakan beberapa simpanan dan memeriksa mana yang lebih baik.

Bagian 3:
Perintah Stash untuk menyembunyikan perubahan lokal Anda.
Jika Anda ingin bekerja dari jarak jauh, Anda harus berkomitmen dan mendorong.

Alexander Yushko
sumber
10

Ide utamanya adalah

Simpan perubahan di direktori kerja kotor

Jadi pada dasarnya perintah Stash menyimpan beberapa perubahan yang tidak Anda perlukan atau inginkan saat ini; tetapi Anda mungkin membutuhkannya.

Gunakan git stash saat Anda ingin merekam status saat ini dari direktori kerja dan indeks, tetapi ingin kembali ke direktori kerja yang bersih. Perintah ini menyimpan modifikasi lokal Anda dan mengembalikan direktori kerja agar sesuai dengan komit HEAD .

nzrytmn
sumber
7

Anda dapat menggunakan perintah berikut:

  • Untuk menyimpan perubahan yang belum Anda lakukan

    git stash

  • Untuk mencantumkan simpanan Anda yang disimpan

    git stash list

  • Untuk menerapkan / mendapatkan kembali perubahan tidak terikat di mana x adalah 0,1,2 ...

    git stash apply stash@{x}

catatan:

  • Untuk menerapkan simpanan dan menghapusnya dari daftar simpanan

    git stash pop stash@{x}

  • Untuk menerapkan simpanan dan menyimpannya dalam daftar simpanan

    git stash apply stash@{x}

Anushil Kumar
sumber
4

Jika Anda menekan git stashsaat Anda memiliki perubahan dalam copy pekerjaan (bukan di area pementasan), git akan membuat objek yang disimpan dan mendorong ke tumpukan simpanan (seperti yang Anda lakukan git checkout -- .tetapi Anda tidak akan kehilangan perubahan). Nanti, Anda dapat keluar dari atas tumpukan.

gyorgyabraham.dll
sumber
2

Perintah stash akan menyembunyikan setiap perubahan yang Anda buat sejak terakhir kali Anda komit. Dalam kasus Anda, tidak ada alasan untuk menyimpan jika Anda akan terus mengerjakannya pada hari berikutnya. Saya hanya akan menggunakan simpanan untuk membatalkan perubahan yang tidak ingin Anda lakukan.

Severin
sumber
2
Tidak, git stashtidak akan mengubah cabang Anda. Ini terutama tidak akan "mengembalikan" setiap perubahan yang dilakukan. Ini hanya akan (sementara) membuang semua perubahan yang tidak dilakukan pada file Anda. - Mungkin terdengar pilih-pilih, tapi kata-kata semacam itu memiliki arti yang sangat khusus dalam konteks git. Anda seharusnya tidak mencampurkannya.
michas
Terima kasih telah menunjukkannya. Saya mengubah jawaban saya.
Severin
Dalam git, sebuah "cabang" didefinisikan sebagai rangkaian komit. git stashtidak akan menyentuh komit apa pun dan karenanya tidak akan mengubah cabang sama sekali. Ia tidak akan "menghapus" apapun dari cabang dan tidak akan "mengatur ulang" dengan cara apapun. Cabang tetap sama, hanya file di pohon kerja yang berubah. - Itu adalah dua hal yang sangat berbeda.
michas
Itu tidak akan membuang tetapi "menyimpan" perubahan Anda! Git mempertahankan struktur LIFO untuk simpanan, jadi simpanan sebenarnya adalah dorongan dan Anda dapat meletuskannya dari atasnya. Kata "membuang" berarti Anda akan kehilangan apa pun, tetapi tidak akan.
gyorgyabraham
2

Saya tahu StackOverflow bukanlah tempat untuk jawaban berdasarkan opini, tetapi saya sebenarnya memiliki pendapat yang baik tentang kapan harus menunda perubahan dengan simpanan.

Anda tidak ingin melakukan perubahan eksperimental

Ketika Anda membuat perubahan di ruang kerja / pohon kerja Anda, jika Anda perlu melakukan operasi berbasis cabang seperti merge, push, fetch atau pull, Anda harus berada pada titik komit yang bersih. Jadi jika Anda memiliki perubahan ruang kerja, Anda perlu mengkomitnya. Tetapi bagaimana jika Anda tidak ingin melakukannya? Bagaimana jika mereka eksperimental? Sesuatu yang tidak Anda inginkan menjadi bagian dari riwayat komit Anda? Sesuatu yang Anda tidak ingin dilihat orang lain saat Anda melakukan push ke GitHub?

Anda tidak ingin kehilangan perubahan lokal dengan hard reset

Dalam hal ini, Anda dapat melakukan hard reset. Tetapi jika Anda melakukan hard reset, Anda akan kehilangan semua perubahan pohon kerja lokal Anda karena semuanya akan ditimpa ke tempatnya pada saat komit terakhir dan Anda akan kehilangan semua perubahan Anda.

Jadi, untuk jawaban 'kapan harus Anda simpan', jawabannya adalah ketika Anda perlu kembali ke titik komit yang bersih dengan pohon kerja / indeks / komit yang disinkronkan, tetapi Anda tidak ingin kehilangan perubahan lokal Anda di proses. Simpan saja perubahan Anda dalam simpanan dan Anda baik-baik saja.

Dan setelah Anda selesai menyimpan dan kemudian digabungkan atau ditarik atau didorong, Anda dapat menyimpan pop atau menerapkan dan Anda kembali ke tempat Anda memulai.

Git stash dan GitHub

GitHub terus menambahkan fitur baru, tetapi untuk saat ini, sekarang ada cara untuk menyimpan simpanan di sana. Sekali lagi, gagasan simpanan adalah bahwa itu lokal dan pribadi. Tidak ada orang lain yang dapat mengintip ke dalam simpanan Anda tanpa akses fisik ke workstation Anda. Mirip dengan cara git reflog bersifat privat dengan git log bersifat publik. Mungkin tidak akan menjadi pribadi jika didorong ke GitHub.

Salah satu trik yang mungkin dilakukan adalah melakukan diff pada ruang kerja Anda, memeriksa perbedaan tersebut ke dalam repositori git Anda, komit dan kemudian tekan. Kemudian Anda dapat melakukan penarikan dari rumah, dapatkan perbedaannya dan kemudian lepaskan. Tapi itu cara yang cukup berantakan untuk mencapai hasil tersebut.

git diff > git-dif-file.diff

buka simpanan

Cameron McKenzie
sumber