Git Shelve vs Stash

276

Saya sangat tidak terbiasa dengan shelveaspek Git. Jika stashdigunakan untuk mengesampingkan pekerjaan yang belum selesai lalu apa shelve? Untuk apa Anda menggunakannya?

Misalnya pada Proyek Pembaruan (dari menu VCS)

masukkan deskripsi gambar di sini

satu akan mendapatkan (dalam Ide 2019.2)

masukkan deskripsi gambar di sini

Edgar Martinez
sumber
14
shelvebukan perintah git. Apa konteks dari pertanyaan ini, dari mana istilah-istilah ini berasal? shelveada di beberapa alat lain tetapi itu bukan bagian dari git.
Jonah
2
Git simpanan mirip dengan shelvedalam bzr, hg, dll. Apakah Anda mengacu pada beberapa paket interoperabilitas git?
drRobertz
3
lebih banyak upvotes daripada jawaban yang diterima yang mungkin dikonfirmasikan, pertanyaan ini valid dan istilah '' Shelve 'sama-sama disalahpahami sebagai perintah git. Terima kasih telah bertanya, ini juga keraguan saya (dari IDEA juga)
PravyNandas

Jawaban:

267

git shelve tidak ada di Git.

Hanya git stash:

  • ketika Anda ingin merekam keadaan saat ini direktori kerja dan indeks, tetapi ingin kembali ke direktori kerja yang bersih.
  • yang menyimpan modifikasi lokal Anda dan mengembalikan direktori kerja agar sesuai dengan komit HEAD.

Anda memiliki rak proyek lama 2008 untuk mengisolasi modifikasi di cabang, tetapi itu tidak akan sangat berguna saat ini.

Seperti yang didokumentasikan dalam dialog rak Intellij IDEA , fitur " rak dan unshelving " tidak terkait dengan VCS (alat Sistem Kontrol Versi) tetapi dengan IDE itu sendiri, untuk menyimpan sementara perubahan yang belum Anda lakukan di daftar perubahan.

Perhatikan bahwa sejak Git 2.13 (Q2 2017), Anda sekarang dapat menyimpan file individual juga .

VONC
sumber
74
Ternyata saya salah paham konsepnya. Saya pikir itu adalah perintah Git padahal sebenarnya itu adalah hal pihak ketiga dari IntelliJ IDEA. Saya tidak dapat menemukan dokumen git untuk itu sehingga saya pikir saya kehilangan sesuatu. jetbrains.com/idea/help/shelving-and-unshelving-changes.html
Edgar Martinez
2
Tautan dokumen Anda menunjukkan bahwa "rak" adalah set perubahan (tambalan) yang dikelola oleh IntelliJ IDE saja, batalkan tautan "simpanan" yang merupakan hal standar yang dikelola oleh Git. Jadi hindari rak.
barbara.post
2
@ jerry chin mengesampingkan lebih baik daripada simpanan dalam kasus Anda. Saya berharap jika rak hadir di git. Webstorm menyedot RAM. Akan berguna jika git memilikinya, kita bisa menjalankannya dalam baris cmd
digara mahara
2
Ada kasus penggunaan umum yang disimpan oleh shelve yang tidak ditangani - berurusan dengan praktik rekan kerja / perusahaan yang bermasalah. Dimungkinkan untuk sampah lengkap untuk ditambahkan ke repositori Anda dan untuk tidak halal untuk 'memperbaikinya' karena kegilaan seseorang. Alternatifnya adalah sesuatu seperti git stash && <your actual command> && git stash poptetapi itu menyebalkan. Rak otomatis dan lamar lebih dekat dengan apa yang kita butuhkan.
smaudet
1
@VonC mirip tidak sama - Saya memiliki kasus penggunaan di mana proyek yang saya gunakan memiliki pengaturan yang saya butuhkan yang tidak dapat dilakukan karena mereka 'tidak standar'. Dan setengah lusin kasus penggunaan lain yang saya temui melibatkan hal-hal seperti perlu memodifikasi file build dll untuk pengembangan lokal vs dev / test / prod.
smaudet
187

Saat menggunakan JetBrains IDE's dengan Git, "aksi simpanan dan pencopotan didukung selain rak dan pelepasan. Fitur-fitur ini memiliki banyak kesamaan; perbedaan utama adalah dalam cara patch dibuat dan diterapkan. Shelve dapat beroperasi dengan file atau kumpulan individual file, sementara Stash hanya dapat beroperasi dengan sejumlah file yang diubah sekaligus. Berikut adalah beberapa rincian lebih lanjut tentang perbedaan di antara mereka. "

Yekver
sumber
10
Tampaknya rak lebih fleksibel daripada simpanan git .
Dmitry Davydov
12
@DmitryDavydov Ada git stash -pyang mengalahkan keduanya. Sayangnya hanya di baris perintah.
The Vee
1
@TheVee ya itu sangat mirip dengan mengesampingkan dalam hal fungsionalitas, terima kasih atas info.
Dmitry Davydov
10
Sebenarnya, sejak Git 2.13 (Q2 2017) Anda dapat menyimpan file individual ... baca lebih lanjut
kyb
5
Saya menemukan rak sangat berguna ketika Anda memiliki tambalan perubahan yang ingin Anda terapkan setiap kali Anda ingin membuat dokumentasi otomatis misalnya. Shelve akan membuat file di dalam .idea / shelve dan Anda dapat menambahkannya kepada Anda VCS dan membagikannya dengan semua tim Anda sehingga mereka dapat menerapkan perubahan itu dan menjalankan tugas yang sama.
ingkevin
64

Selain jawaban sebelumnya ada satu hal yang penting untuk saya perhatikan:

shelveadalah fitur produk JetBrains (seperti WebStorm, PhpStorm, PyCharm, dll). Ini menempatkan file yang disimpan ke dalam .idea/shelfdirektori.

stashadalah salah satu gitopsi. Ini menempatkan file simpanan di bawah .gitdirektori.

valex
sumber
3
Terima kasih telah menjelaskan pertanyaan kritis ini.
AmerllicA
6

Saya lebih suka menyimpan perubahan daripada menyembunyikannya jika saya tidak membagikan perubahan saya di tempat lain.

Stashing adalah fitur git dan tidak memberi Anda opsi untuk memilih file tertentu atau perubahan di dalam file. Shelving dapat melakukan itu tetapi ini adalah fitur khusus IDE, bukan fitur git:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, saya dapat memilih untuk menentukan file / baris mana yang akan dimasukkan di rak saya. Perhatikan bahwa saya tidak dapat melakukannya dengan menyembunyikan.

Hati-hati menggunakan rak di IDE dapat membatasi portabilitas tambalan Anda karena perubahan itu tidak disimpan dalam folder .git.

Beberapa tautan bermanfaat:

Hamza Belmellouki
sumber