git-stash vs. git-branch

92

Dalam pertanyaan Git sebelumnya , Daniel Benamy berbicara tentang alur kerja di Git:

Saya sedang mengerjakan master dan melakukan beberapa hal dan kemudian memutuskan untuk menunda pekerjaan itu. Saya membuat cadangan beberapa komitmen dan kemudian bercabang dari sebelum saya memulai pekerjaan omong kosong saya.

Dia ingin memulihkan kondisi kerjanya ke titik waktu sebelumnya tanpa kehilangan perubahannya saat ini. Semua jawaban berkisar, dalam berbagai cara, seperti

git branch -m master crap_work
git branch -m previous_master master

Bagaimana ini dibandingkan dengan git stash? Saya agak bingung mencoba melihat perbedaan kasus penggunaan di sini ketika sepertinya semua git stashsudah ditangani dengan percabangan…


@ Jordi Bunster : Terima kasih, itu membereskan semuanya. Saya rasa saya akan mempertimbangkan "menyembunyikan" sebagai cabang yang ringan, tanpa nama. Jadi apa pun yang dapat dilakukan simpanan, cabang juga bisa tetapi dengan lebih banyak kata. Bagus!

Will Robertson
sumber

Jawaban:

109

'simpanan' mengambil hal-hal yang tidak terikat, " kotor " pada copy pekerjaan Anda, dan menyimpannya, meninggalkan Anda dengan copy pekerjaan yang bersih.

Itu tidak benar-benar bercabang sama sekali. Anda kemudian dapat menerapkan simpanan di atas cabang lainnya. Atau, pada Git 1.6, Anda dapat melakukan:

git stash branch <branchname> [<stash>]

untuk menerapkan simpanan di atas cabang baru, semuanya dalam satu perintah.

Jadi, simpanan berfungsi dengan baik jika Anda belum berkomitmen ke cabang yang " salah ".

Jika Anda sudah berkomitmen, maka alur kerja yang Anda gambarkan dalam pertanyaan Anda adalah alternatif yang lebih baik. Dan omong-omong, Anda benar: Git sangat fleksibel, dan dengan fleksibilitas itu muncul fungsionalitas yang tumpang tindih.

Jordi Bunster
sumber
1
satu hal yang menggigit saya ... dapatkah Anda menulis seperti apa [<stash>] sebenarnya! Mereka memasukkannya ke dalam notasi itu di dokumen, tetapi tidak jelas apakah itu harus 1 atau @ {1} atau apa.
Gregg Lind
1
Jika Anda ingin merujuk ke simpanan khusus "N", gunakan simpanan @ {N}
Jordi Bunster
9
Lihat git stash listnama simpanan Anda.
idbrii
6
Gregg, ya Anda bisa: git stash save (nama simpanan Anda). Menjadikannya jauh lebih berguna jika Anda sering menggunakannya sehingga Anda tahu apa yang dilakukan setiap simpanan. Anda dapat menggunakan git stash show -p (name) untuk menunjukkan patch dari sebuah simpanan.
Thomas Vander Stichele
7
juga, git stash show -uuntuk menunjukkan perbedaan simpanan terhadap copy pekerjaan.
ken
49

Saat Anda memulihkan simpanan, perubahan Anda diterapkan kembali dan Anda terus mengerjakan kode Anda.

Untuk menyimpan perubahan Anda saat ini

$ git stash save 
Saved "WIP on master: e71813e..."

Anda juga dapat memiliki lebih dari satu simpanan. Stash bekerja seperti tumpukan. Setiap kali Anda menyimpan simpanan baru, itu akan diletakkan di atas tumpukan.

$ git stash list
stash@{0}: WIP on master: e71813e..."

Perhatikan stash@{0}bagiannya? Itu ID simpanan Anda. Anda akan membutuhkannya untuk memulihkannya nanti. Ayo lakukan sekarang. ID simpanan berubah dengan setiap simpanan yang Anda buat. stash @ {0} mengacu pada simpanan terakhir yang Anda buat.

Untuk menerapkan simpanan

$ git stash apply stash@{0}

Anda mungkin melihat simpanan masih ada setelah Anda menerapkannya. Anda dapat menjatuhkannya jika Anda tidak membutuhkannya lagi.

$ git stash drop stash@{0}

Atau, karena simpanan berfungsi seperti tumpukan, Anda dapat mengeluarkan simpanan terakhir yang Anda simpan:

$ git stash pop

Jika Anda ingin menghapus semua simpanan Anda, jalankan perintah 'clear':

$ git stash clear

Mungkin Anda tidak terlalu sering menggunakan simpanan. Jika Anda hanya ingin menyimpan perubahan dengan cepat untuk memulihkannya nanti, Anda dapat meninggalkan ID simpanan.

$ git stash
...
$ git stash pop

Jangan ragu untuk bereksperimen dengan simpanan sebelum menggunakannya pada beberapa pekerjaan yang sangat penting.

Saya juga memiliki versi yang lebih mendalam tentang ini yang diposting di blog saya .

Ariejan
sumber
sumber daya yang jauh lebih bermanfaat daripada jawaban 'terbaik' yang seharusnya ... (meskipun jawaban terbaik membuatnya sangat jelas, ada beberapa kebingungan terkait dengan penggunaan penuh)
kumarharsh
9

Saya selalu waspada terhadap simpanan git. Jika Anda menyimpannya beberapa kali, keadaan cenderung menjadi berantakan. daftar simpanan git akan menampilkan daftar simpanan bernomor yang Anda buat, dengan pesan jika Anda memberikannya ... Tetapi masalahnya terletak pada kenyataan bahwa Anda tidak dapat membersihkan simpanan kecuali dengan git simpanan yang brutal (yang menghapus semuanya) . Jadi, kecuali jika Anda selalu anal dalam memberikan pesan yang sangat deskriptif untuk simpanan Anda (agak bertentangan dengan filosofi simpanan), Anda akan mendapatkan banyak simpanan yang tidak dapat dipahami.

Satu-satunya cara yang saya tahu untuk mencari tahu mana yang menggunakan gitk --semua dan temukan simpanannya. Setidaknya ini memungkinkan Anda melihat komit tempat penyimpanan dibuat, serta perbedaan semua yang termasuk dalam simpanan itu.

Perhatikan bahwa saya menggunakan git 1.5.4.3, dan menurut saya 1.6 menambahkan git stash pop, yang menurut saya akan menerapkan simpanan yang dipilih dan menghapusnya dari daftar. Yang terlihat jauh lebih bersih.

Untuk saat ini, saya selalu mencoba untuk membuka cabang kecuali jika saya benar-benar yakin saya akan kembali ke simpanan itu di hari yang sama, bahkan dalam waktu satu jam.

webmat
sumber
3
Apakah Anda membuat cabang tanpa memberinya nama yang berguna? Jika tidak, maka saya tidak mengerti mengapa Anda tidak melakukan hal yang sama dengan simpanan. Jika Anda benar-benar ingin mengetahui isinya, Anda cukup menggunakan git-stash show untuk menunjukkan file mana yang diubah, atau git-stash apply dan git-diff untuk melihat perbedaan sebenarnya. Memangkas simpanan tetap sama dengan mengontrol cabang Anda.
Xiong Chiamiov
18
sebenarnya, Anda dapat menghapus satu simpanan dengan menggunakangit stash drop [<stash>]
kumarharsh
1
Benar, git sudah lama mengalami git stash drop. Ini jauh lebih sedikit dari PITA untuk digunakan sekarang. Saya menggunakannya setiap hari, dan bahkan dalam rentang waktu yang lama, sekarang.
webmat
3

Jika Anda mencari alur kerja yang mungkin lebih pas daripada git stash, Anda mungkin ingin melihat git-bottle . Ini adalah utilitas untuk tujuan menyimpan dan memulihkan berbagai status kerja git seperti biasa git melakukan, secara efektif memotret status terkini dan terkait dari pohon kerja Anda dan semua berbagai status file yang ditampilkan di bawah status git.

Perbedaan utama dari git stash:

  • git stashmenyimpan status git kotor secara sempit (file yang dimodifikasi, dan file yang ditambahkan dalam indeks), sedangkan git-bottledirancang untuk menyimpan segala sesuatu yang berbeda dari HEAD, dan itu membedakan dengan cara yang melindungi antara jalur yang dimodifikasi, dimodifikasi dan tidak ditambahkan, tidak ditambahkan, dipisahkan, dan status rebase / merge lengkap (hanya jalur di bawah .gitignoreyang tidak disimpan).
  • git stashsimpan untuk menyimpan objek yang perlu Anda lacak secara terpisah. Jika saya menyimpan sesuatu 2 minggu yang lalu, saya mungkin tidak mengingatnya, sedangkan git-bottlemenyimpan sebagai komitmen tentatif ke cabang saat ini . Tindakan sebaliknya git-unbottleyang setara dengan git stashpop. Komit ini dapat didorong dan dibagikan di antara repositori. Ini dapat berguna untuk build jarak jauh, di mana Anda memiliki repositori lain di server jarak jauh hanya untuk membangun, atau untuk berkolaborasi dengan orang lain dalam penyelesaian konflik.
Dan Aloni
sumber