Apakah git stash khusus cabang atau untuk seluruh repositori?

95

Saya pergi ke cabang dan melakukan beberapa pekerjaan. Saya ingin pergi ke cabang lain tetapi tidak ingin berkomitmen jadi saya lakukan git stash. Lalu aku melakukannya git checkout <otherbranch>. Saya melakukan beberapa pekerjaan di sana dan, seperti di cabang pertama, saya ingin beralih dari itu sebelum melakukan pekerjaan. Jadi saya melakukannya di git stashsana juga. Saya beralih kembali ke cabang pertama dan mencoba melepaskannya ( git stash pop) berpikir itu akan mendapatkan simpanan dari cabang tertentu. Saya terkejut bahwa itu melepaskan simpanan dari <otherbranch>(simpanan terbaru). Saya mendapat kesan bahwa simpanan adalah khusus cabang tetapi perilaku ini menunjukkan bahwa hanya ada satu simpanan untuk seluruh repositori lokal.

Apakah khusus git stashcabang atau untuk seluruh repositori? Jika ini untuk seluruh repositori, dapatkah saya memberikan opsi ke sana untuk membuatnya khusus untuk cabang?

amfibi
sumber

Jawaban:

43

Untuk melihat tumpukan simpanan saat ini:

git stash list

Untuk memilih simpanan tertentu dari tumpukan, lihatlah dengan yang ditunjukkan di atas.stash@{number}

Jika Anda ingin perilakunya menjadi per-cabang, Anda bisa membuat komit (atau beberapa komit) di cabang. Anda selalu dapat "membatalkan" komit nanti (misalnya, dengan git reset, salah satu --softatau --mixed; lihat dokumentasi git reset ; atau dengan git rebase -ihanya menyimpan komit "nyata" yang akhirnya sementara membuang temporer).

(Untuk benar-benar meniru, git stashAnda memerlukan setidaknya dua komit, satu untuk status indeks dan satu lagi untuk status pohon kerja. Namun, jika Anda tidak berencana untuk menyimpan dan memulihkan status indeks, Anda dapat git add -Amenggunakan seluruh status pohon kerja dan meletakkannya di komit sementara. Alternatifnya, git stashadalah skrip shell sehingga Anda dapat menyalin dan memodifikasinya dengan mudah untuk membuatnya berfungsi per cabang secara default, menggunakan, misalnya, sebagai ruang nama yang berfungsi, daripada satu global untuk seluruh repo. Anda masih dapat membawa simpanan dari satu cabang ke cabang lain dengan menamainya secara eksplisit.)refs/pb-stash/branchrefs/stash

torek
sumber
Apakah Anda tahu cara menampilkan daftar file dari setiap stash listitem selain hanya deskripsi?
amfibi
2
git stash show(atau git stash show stash@{<number>}untuk sesuatu selain @{0}versi) memberi Anda diff --stat; tambahkan -puntuk mendapatkan perbedaan yang lebih besar. Catatan: ini membandingkan "pohon kerja" di "tas simpanan" dengan komit yang digantung; tidak ada antarmuka front-end untuk melihat apa yang ada di "indeks" di tas simpanan yang diberikan.
torek
55

Tidak dan Tidak. Git simpanan adalah per-repositori.

Ini adalah halaman yang bagus tentang cara menggunakannya.

abasterfield
sumber
apakah simpanan kedua menimpa simpanan pertama? IOW, jika saya melakukan dua simpanan tetapi tidak ada simpanan di antaranya, apakah simpanan pertama saya hilang?
amfibi
1
Tidak, Anda mendapatkan tumpukan (terakhir masuk pertama keluar) simpanan. Anda mendorong simpanan ke tumpukan-simpanan Anda, lalu yang lain lalu Anda mengeluarkan simpanan ke-2 lalu Anda mengeluarkan yang pertama, dll.
abasterfield
18

git stash bukan per cabang.

  • Alih-alih git stash(yang bisa hilang dengan mudah bila Anda memiliki banyak simpanan dan cabang)
  • Saya sarankan melakukan a git commituntuk menyimpan kode yang belum selesai di cabang Anda dan ketika Anda siap untuk menyelesaikan kode lakukan a git reset ${COMMIT_HASH_VALUE}untuk mendapatkan kembali kode yang belum selesai
  • git commitdan git resetbila digunakan bersama dengan benar dapat mensimulasikan a git stashuntuk cabang tertentu

Berikut adalah skenario kehidupan nyata umum yang menunjukkan nilai dan penggunaan perintah commitdan reset:

  • Anda sedang mengerjakan feature branch X dan kode Anda bahkan tidak mengkompilasi atau lulus tes
  • terdapat bug yang memiliki prioritas lebih tinggi daripada fitur baru saat ini sehingga Anda harus segera mulai mengerjakan perbaikan bug
  • daripada melakukan git simpanan (dan simpanan hilang dalam campuran karena Anda memiliki banyak simpanan dan banyak cabang)
  • Anda dapat melakukan git commitpada fitur cabang X
    • tuliskan COMMIT_HASH_VALUEuntuk nanti
  • checkout cabang baru Y untuk perbaikan panas
  • selesaikan hot fix pada cabang Y (lakukan permintaan penggabungan untuk mendapatkan hot fix ke baseline dan hapus cabang hot fix)
  • kemudian periksa kembali cabang fitur X
  • untuk memunculkan pekerjaan Anda yang belum selesai yang tidak dapat dikompilasi atau lulus pengujian -> lakukan saja git reset ${COMMIT_HASH_VALUE}

(FYI defaultnya git resetadalah --mixed)

Trevor Boyd Smith
sumber
2
Jalan pintas yang berguna untuk mengatur ulang dalam skenario ini adalah git reset HEAD~1.
Sam A. Horvath-Hunt
1
@samHH Saya memiliki satu terlalu banyak contoh dengan git reset HEAD ^ 1 secara tidak sengaja dipukul dua kali ... jadi saya memilih untuk tidak menggunakan HEAD^1atau HEAD~1.
Trevor Boyd Smith
11

Saya tidak yakin mengapa setiap jawaban di sini menyarankan untuk meniru simpanan dengan commit+ reset. Stash sangat cocok untuk digunakan, terutama saat bekerja di banyak cabang. Saya juga tidak ingin mengkomit ketika saya bekerja di beberapa cabang, karena saya ingin semua perubahan yang dimodifikasi masih disorot di editor saya ketika saya kembali.

Jadi inilah alur kerja simpanan:

Kapan pun Anda harus beralih cabang dan Anda belum siap untuk berkomitmen, simpan perubahan Anda ke tumpukan

git stash save "Your custom stash message"

Saat Anda kembali ke cabang, periksa simpanannya

git stash list

masukkan deskripsi gambar di sini

Jika Anda di cabang, FixIssue0203Anda dapat menggunakan git stash popkarena ini akan menerapkan bagian atas stash@{0}dan menghapusnya dari simpanan.

Namun, jika Anda di cabang ImproveReadmeAnda harus terlebih dahulu menerapkan simpanan 1 git stash apply stash@{1}dan kemudian menghapus simpanan 1 dari tumpukan git stash drop stash@{1}.

Itu dia!

Adam
sumber