Bagaimana saya bisa melihat perubahan un-stashing akan membuat pohon kerja saat ini? Saya ingin tahu perubahan apa yang akan dilakukan sebelum menerapkannya!
Secara default, perintah ini menunjukkan diffstat, tetapi ia akan menerima format apa pun yang dikenal dengan git diff (misalnya, git stash show -p stash @ {1} untuk melihat simpanan terbaru kedua dalam bentuk tambalan).
stash@{0}adalah default; Anda hanya perlu argumen jika Anda ingin melihat simpanan sebelumnya.
Cascabel
52
Baik. Saya hanya menyediakannya sehingga jelas bagaimana cara melihat simpanan lain di samping {0}.
Amber
74
Ini tidak akan menampilkan perbedaan antara simpanan dan direktori kerja saat ini, tetapi antara simpanan dan induk asli. Baik? Dari manual: "Tampilkan perubahan yang dicatat di simpanan sebagai perbedaan antara status simpanan dan induk aslinya."
Magne
14
@ Ammber - Benar, meskipun jika pohon kerja Anda saat ini kotor, itu penting, dan membuatnya sedikit lebih rumit. Saya datang dari sudut itu, dan menemukan prosedur yang saya bagikan dalam jawaban saya di bawah ini.
Magne
6
apa artinya -pberdiri?
Gerald
308
Untuk melihat simpanan terbaru:
git stash show -p
Untuk melihat simpanan sewenang-wenang:
git stash show -p stash@{1}
Juga, saya menggunakan git diff untuk membandingkan simpanan dengan cabang apa pun.
Kamu bisa menggunakan:
git diff stash@{0} master
Untuk melihat semua perubahan dibandingkan dengan master cabang.
Ini tidak menjawab pertanyaan spesifik. Jika Anda membuat simpanan dari master (untuk menyimpan pekerjaan untuk nanti), kemudian melakukan beberapa komitmen untuk pekerjaan lain pada master, kemudian lakukan git diff stash@{0} master, Anda mendapatkan simpanan simpanan Anda terhadap master saat ini (yang mencakup pekerjaan yang dilakukan pada master setelah simpanan dibuat), bukan file / baris yang akan diubah simpanannya, yang menjadi pertanyaannya.
Tom De Leu
52
Saya senang Anda menjawab pertanyaan meskipun itu bukan jawaban untuk pertanyaan yang tepat. Itu memberi lebih banyak informasi, dan saya pikir itu bagus untuk mengetahui bagaimana mendapatkan perbedaan antara cabang dan cabang lain yang ingin Anda bandingkan. Saya juga suka mempelajari flag --name-only :)
Rebekah Waterbury
6
ini juga memungkinkan melihat perbedaan menggunakan penampil diff kustom, misalnyagit difftool --tool=... stash@{0} HEAD
Andre Holzner
9
@ TomDeLeu Pengamatan yang bagus dan poin penting. Untuk membandingkan barang simpanan dengan induknya, ini sepertinya berhasil:git diff stash@{0}^ stash@{0}
erikprice
1
Anda juga dapat menambahkan nama file git diff stash@{0} master -- filenameuntuk mendapatkan perubahan pada file tertentu.
David
104
Jika cabang tempat Anda menyimpan simpanan perubahan telah berubah, perintah ini mungkin berguna:
git diff stash@{0}^!
Ini membandingkan simpanan dengan komit yang menjadi dasarnya.
"git beda simpanan @ {0} ^!" bermuara ke "git diff simpanan @ {0} ^ simpanan @ {0} ~ 1 ^ simpanan @ {0} ~ 2 ......." tetapi karena git diff hanya membutuhkan 2 komit, ini menunjukkan perbedaan antara simpanan @ {0} dan ^ simpanan @ {0} ~ 1 dan lihat ^ di awal komit ke-2 tidak ada bedanya dan git mengabaikannya.
Naga Kiran
Saya lebih suka versi ini untuk dapat menggunakan alat diff pilihan saya (Tentu saja Selain Bandingkan!). Ini juga menunjukkan perubahan simpanan ini yang saya percaya adalah pertanyaan awal, sebagai lawan dari alternatif yang disebutkan dalam komentar di atas "git diff simpanan @ {X} ^ simpanan @ {X}" yang menunjukkan lebih dari sekedar beda simpanan.
user107172
44
Jika pohon kerja Anda kotor , Anda dapat membandingkannya dengan simpanan dengan terlebih dahulu melakukan pohon kerja kotor, dan kemudian membandingkannya dengan simpanan. Setelah itu, Anda dapat membatalkan komit dengan pohon kerja kotor (karena Anda mungkin tidak ingin memiliki komit kotor di log komit Anda).
Anda juga dapat menggunakan pendekatan berikut untuk membandingkan dua simpanan satu sama lain (dalam hal ini Anda hanya mencabut salah satu simpanan pada awalnya).
Komit pohon kerja kotor Anda:
git add .
git commit -m "Dirty commit"
Bedakan simpanan dengan komit itu:
git diff HEAD stash@{0}
Kemudian, setelah itu, Anda dapat mengembalikan komit, dan memasukkannya kembali ke dir:
git reset --soft HEAD~1
git reset .
Sekarang Anda telah memisahkan pohon kerja kotor dengan simpanan Anda, dan kembali ke tempat Anda semula.
Menarik, saya tidak tahu git stash show -l . Apakah ini berbeda dengan simpanan terbaru terhadap copy pekerjaan (kotor)? Bagaimana Anda menggunakannya tanpa mendapatkan error: switch l requires a value?
Magne
Ya, memang berbeda dengan copy pekerjaan (mungkin kotor). Anda menggunakannya hanya dengan memasukkan git stash show -l. Mengapa ini tidak berhasil untuk Anda, saya hanya bisa menebak Anda mungkin menggunakan versi git yang lebih lama? Saya menggunakan git v2.20.1, dan berfungsi dengan sempurna tanpa kesalahan.
David Deprost
25
Jawaban @ Magne adalah satu-satunya tanggal (yang sangat terlambat) yang menjawab interpretasi pertanyaan yang paling fleksibel / berguna, tetapi ini sedikit lebih rumit daripada yang diperlukan. Daripada melakukan dan mengatur ulang, cukup sembunyikan salinan pekerjaan Anda, bandingkan, lalu lepaskan simpanan.
git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop
Itu menunjukkan kepada Anda perbedaan antara bagian atas tumpukan simpanan dan folder kerja Anda dengan sementara membuat perubahan folder kerja Anda menjadi bagian atas tumpukan simpanan (simpanan @ {0}), memindahkan yang asli dari atas ke bawah (simpanan @ {1} ) kemudian membandingkan dengan menggunakan atasan asli di posisi 'set baru' sehingga Anda melihat perubahan yang dihasilkan dari menerapkannya di atas pekerjaan Anda saat ini.
"Tapi bagaimana kalau aku tidak punya pekerjaan saat ini?" Maka Anda berada dalam kasus membosankan yang normal. Gunakan saja jawaban Amber
git stash show
atau jawaban @ czerasz
git diff stash@{0}
atau akui bahwa menyimpan dan melepaskan tidak cepat dan mudah, lepas saja perubahan dan periksa mereka. Jika Anda tidak ingin mereka membuangnya saat ini (indeks / folder kerja saat ini berubah). Secara penuh itu
Pendekatan sederhana ini (simpanan dan kemudian dibandingkan dengan simpanan lain) aman dan mudah dipahami. Untuk beberapa kasus penggunaan, Anda mungkin ingin juga menyimpan file yang tidak terlacak dengangit stash save -u
Menyesatkan! Pertanyaannya adalah: Bagaimana saya bisa melihat perubahan un-stashing akan membuat pohon kerja saat ini? Ini menunjukkan perbedaan antara simpanan dan KEPALA yang mungkin sangat berbeda dengan apa yang akan diterapkan git stash apply.
MikeJansen
Silakan baca pertanyaan lebih lanjut "Saya ingin tahu perubahan apa yang akan dilakukan sebelum menerapkannya!". Saya memberikan jawaban cepat untuk ini.
yerlilbilgin
Anda juga dapat melihat semua jawaban lain entah bagaimana tentang membedakan kepala saat ini (atau set kerja) terhadap simpanan. Mengapa hanya jawaban saya yang menyesatkan? Itu tidak adil.
yerlilbilgin
@yerlilbilgin Lihat jawaban saya atas jawaban Anda di bawah ini.
MikeJansen
Kita dapat menonaktifkan KEPALA, secara default, bukan?
Al.G.
10
Untuk berjaga-jaga, untuk membandingkan file di pohon kerja dan simpanan, gunakan perintah di bawah ini
Menyesatkan! Pertanyaannya adalah: Bagaimana saya bisa melihat perubahan un-stashing akan membuat pohon kerja saat ini? Ini menunjukkan perbedaan antara simpanan dan KEPALA yang mungkin sangat berbeda dengan apa yang akan diterapkan git stash apply.
MikeJansen
1
Jika menurut Anda ini menyesatkan, silakan periksa semua jawaban lainnya. Itu tidak adil!
yerlilbilgin
1
Anda akan perhatikan bahwa saya menyalin komentar yang sama ke jawaban lain yang sama menyesatkannya (jawaban yang hampir sama). Jawaban lain yang sudah ada komentar serupa saya tinggalkan sendiri. Jika Anda memahami cara kerja git simpanan, maka Anda akan menyadari bahwa membedakan simpanan terhadap HEAD bukanlah yang diterapkan (yang diminta OP). "Stash" yang sebenarnya adalah perbedaan antara komit simpanan dan apa yang sebelumnya. Patch ini kemudian diterapkan ke HEAD. Jadi jika Anda ingin tahu apa yang diminta OP, Anda harus menunjukkan perbedaan antara simpanan dan komit sebelumnya, yang dilakukan dengan jawaban yang benar.
MikeJansen
1
Ini menjawab pertanyaan lebih langsung daripada yang lain (tidak perlu) jawaban panjang, dan melakukan persis apa yang ditanyakan OP, singkatnya menghapus HEAD. Saya bisa memodifikasi jawaban @ yerlilbilgin untuk menghapus HEAD tapi saya pikir siapa pun yang menggunakan git dapat mengetahui bagian itu dan saya memperpanjang jawaban akan membuatnya kurang mudah dibaca. Jangan salahkan @yerlibilgin.
Sridhar Sarnobat
4
Salah satu cara untuk melakukan ini tanpa memindahkan apa pun adalah dengan mengambil keuntungan dari fakta yang patchdapat membaca git diff (unified diffs pada dasarnya)
git stash show -p | patch -p1 --verbose --dry-run
Ini akan menunjukkan kepada Anda pratinjau langkah demi langkah tentang apa yang biasanya dilakukan patch. Manfaat tambahan untuk ini adalah bahwa tambalan tidak akan mencegah dirinya dari menulis tambalan ke pohon kerja baik, jika karena alasan tertentu Anda hanya perlu git untuk tutup mulut tentang melakukan-sebelum-memodifikasi, silakan dan hapus --dry- jalankan dan ikuti instruksi verbose.
Menggabungkan apa yang saya pelajari di utas ini dan di utas ini , ketika saya ingin melihat "apa yang ada di dalam simpanan", saya pertama kali menjalankan:
git stash show stash@{0}
Itu akan menunjukkan file apa yang dimodifikasi. Lalu, untuk mendapatkan diff visual yang bagus di difftool, saya lakukan:
git difftool --dir-diff stash@{0} stash@{0}^
Ini akan menampilkan semua perbedaan sekaligus dari simpanan yang diberikan terhadap induknya.
Anda dapat mengkonfigurasi alat diff di ~/.gitconfig, misalnya dengan Meld :
FWIW Ini mungkin sedikit berlebihan untuk semua jawaban lain dan sangat mirip dengan jawaban yang diterima yang tepat; tapi mungkin itu akan membantu seseorang.
git stash show --helpakan memberikan semua yang Anda butuhkan; termasuk info acara simpanan.
tampilkan [<stash>]
Perlihatkan perubahan yang direkam dalam simpanan sebagai perbedaan antara status simpanan dan induk aslinya. Ketika tidak diberikan, tunjukkan yang terbaru. Secara default, perintah ini menunjukkan diffstat, tetapi ia akan menerima format apa pun yang dikenal dengan git diff (misalnya, git stash show -p stash @ {1} untuk melihat simpanan terbaru kedua dalam bentuk tambalan). Anda dapat menggunakan variabel konfigurasi stash.showStat dan / atau stash.showPatch untuk mengubah perilaku default.
git stash list
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2
Jadi dapatkan nomor simpanan dan lakukan:
Anda dapat melakukan:
git stash show -p stash@{1}
Tetapi jika Anda ingin diff (ini berbeda untuk menunjukkan simpanan, itu sebabnya saya menulis jawaban ini. DiffPertimbangkan kode saat ini di cabang Anda dan showhanya tunjukkan apa yang akan Anda terapkan )
Kamu bisa menggunakan:
git diff stash@{0}
atau
git diff stash@{0} <branch name>
Hal lain yang menarik untuk dilakukan adalah:
git stash apply
git stash apply stash@{10}
Ini berlaku simpanan tanpa menghapusnya dari daftar, Anda dapat git checkout .menghapus perubahan itu atau jika Anda senanggit stash drop stash@{10} menghapus simpanan dari daftar.
Dari sini saya tidak pernah merekomendasikan untuk menggunakan git stash popdan menggunakan kombinasi dari git stash applydan git stash dropJika Anda menerapkan simpanan di cabang yang salah ... well kadang-kadang sulit untuk memulihkan kode Anda.
Bergantung pada apa yang Anda ingin membandingkan simpanan dengan (pohon kerja lokal / komit induk / komit kepala), sebenarnya ada beberapa perintah yang tersedia, di antaranya yang lama baik git diff, dan yang lebih spesifik git stash show:
╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff ║ git stash show ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree ║ git diff stash@{0} ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit ║ git diff stash@{0} HEAD ║ / ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝
Meskipun git stash showterlihat lebih ramah pengguna pada pandangan pertama, git diffsebenarnya lebih kuat karena memungkinkan menentukan nama file untuk diff yang lebih fokus. Saya pribadi mengatur alias untuk semua perintah ini di plugin zsh git saya .
Jawaban:
Lihat simpanan terbaru:
Lihat simpanan sewenang-wenang:
Dari halaman
git stash
manual:sumber
stash@{0}
adalah default; Anda hanya perlu argumen jika Anda ingin melihat simpanan sebelumnya.{0}
.-p
berdiri?Untuk melihat simpanan terbaru:
Untuk melihat simpanan sewenang-wenang:
Juga, saya menggunakan git diff untuk membandingkan simpanan dengan cabang apa pun.
Kamu bisa menggunakan:
Untuk melihat semua perubahan dibandingkan dengan master cabang.
Atau Anda dapat menggunakan:
Untuk mudah menemukan hanya mengubah nama file.
sumber
git diff stash@{0} master
, Anda mendapatkan simpanan simpanan Anda terhadap master saat ini (yang mencakup pekerjaan yang dilakukan pada master setelah simpanan dibuat), bukan file / baris yang akan diubah simpanannya, yang menjadi pertanyaannya.git difftool --tool=... stash@{0} HEAD
git diff stash@{0}^ stash@{0}
git diff stash@{0} master -- filename
untuk mendapatkan perubahan pada file tertentu.Jika cabang tempat Anda menyimpan simpanan perubahan telah berubah, perintah ini mungkin berguna:
Ini membandingkan simpanan dengan komit yang menjadi dasarnya.
sumber
~/.gitconfig
:laststash = diff stash@{0}^!
git difftool stash^!
untuk perbedaan simpanan terakhir terhadap komit yang menjadigit difftool stash HEAD
Jika pohon kerja Anda kotor , Anda dapat membandingkannya dengan simpanan dengan terlebih dahulu melakukan pohon kerja kotor, dan kemudian membandingkannya dengan simpanan. Setelah itu, Anda dapat membatalkan komit dengan pohon kerja kotor (karena Anda mungkin tidak ingin memiliki komit kotor di log komit Anda).
Anda juga dapat menggunakan pendekatan berikut untuk membandingkan dua simpanan satu sama lain (dalam hal ini Anda hanya mencabut salah satu simpanan pada awalnya).
Komit pohon kerja kotor Anda:
Bedakan simpanan dengan komit itu:
Kemudian, setelah itu, Anda dapat mengembalikan komit, dan memasukkannya kembali ke dir:
Sekarang Anda telah memisahkan pohon kerja kotor dengan simpanan Anda, dan kembali ke tempat Anda semula.
sumber
git stash show -l
. Apakah ini berbeda dengan simpanan terbaru terhadap copy pekerjaan (kotor)? Bagaimana Anda menggunakannya tanpa mendapatkanerror: switch l requires a value
?git stash show -l
. Mengapa ini tidak berhasil untuk Anda, saya hanya bisa menebak Anda mungkin menggunakan versi git yang lebih lama? Saya menggunakan git v2.20.1, dan berfungsi dengan sempurna tanpa kesalahan.Jawaban @ Magne adalah satu-satunya tanggal (yang sangat terlambat) yang menjawab interpretasi pertanyaan yang paling fleksibel / berguna, tetapi ini sedikit lebih rumit daripada yang diperlukan. Daripada melakukan dan mengatur ulang, cukup sembunyikan salinan pekerjaan Anda, bandingkan, lalu lepaskan simpanan.
Itu menunjukkan kepada Anda perbedaan antara bagian atas tumpukan simpanan dan folder kerja Anda dengan sementara membuat perubahan folder kerja Anda menjadi bagian atas tumpukan simpanan (simpanan @ {0}), memindahkan yang asli dari atas ke bawah (simpanan @ {1} ) kemudian membandingkan dengan menggunakan atasan asli di posisi 'set baru' sehingga Anda melihat perubahan yang dihasilkan dari menerapkannya di atas pekerjaan Anda saat ini.
"Tapi bagaimana kalau aku tidak punya pekerjaan saat ini?" Maka Anda berada dalam kasus membosankan yang normal. Gunakan saja jawaban Amber
atau jawaban @ czerasz
atau akui bahwa menyimpan dan melepaskan tidak cepat dan mudah, lepas saja perubahan dan periksa mereka. Jika Anda tidak ingin mereka membuangnya saat ini (indeks / folder kerja saat ini berubah). Secara penuh itu
sumber
git stash save -u
Ini berfungsi untuk saya di git versi 1.8.5.2:
sumber
git stash apply
.Untuk berjaga-jaga, untuk membandingkan file di pohon kerja dan simpanan, gunakan perintah di bawah ini
sumber
Jika Anda memiliki alat untuk diff (seperti luar biasa)
sumber
git stash apply
.HEAD
. Saya bisa memodifikasi jawaban @ yerlilbilgin untuk menghapus HEAD tapi saya pikir siapa pun yang menggunakan git dapat mengetahui bagian itu dan saya memperpanjang jawaban akan membuatnya kurang mudah dibaca. Jangan salahkan @yerlibilgin.Salah satu cara untuk melakukan ini tanpa memindahkan apa pun adalah dengan mengambil keuntungan dari fakta yang
patch
dapat membaca git diff (unified diffs pada dasarnya)Ini akan menunjukkan kepada Anda pratinjau langkah demi langkah tentang apa yang biasanya dilakukan patch. Manfaat tambahan untuk ini adalah bahwa tambalan tidak akan mencegah dirinya dari menulis tambalan ke pohon kerja baik, jika karena alasan tertentu Anda hanya perlu git untuk tutup mulut tentang melakukan-sebelum-memodifikasi, silakan dan hapus --dry- jalankan dan ikuti instruksi verbose.
sumber
Menggabungkan apa yang saya pelajari di utas ini dan di utas ini , ketika saya ingin melihat "apa yang ada di dalam simpanan", saya pertama kali menjalankan:
Itu akan menunjukkan file apa yang dimodifikasi. Lalu, untuk mendapatkan diff visual yang bagus di difftool, saya lakukan:
Ini akan menampilkan semua perbedaan sekaligus dari simpanan yang diberikan terhadap induknya.
Anda dapat mengkonfigurasi alat diff di
~/.gitconfig
, misalnya dengan Meld :sumber
FWIW Ini mungkin sedikit berlebihan untuk semua jawaban lain dan sangat mirip dengan jawaban yang diterima yang tepat; tapi mungkin itu akan membantu seseorang.
git stash show --help
akan memberikan semua yang Anda butuhkan; termasuk info acara simpanan.sumber
Dia daftar simpanan
Jadi dapatkan nomor simpanan dan lakukan:
Anda dapat melakukan:
Tetapi jika Anda ingin diff (ini berbeda untuk menunjukkan simpanan, itu sebabnya saya menulis jawaban ini.
Diff
Pertimbangkan kode saat ini di cabang Anda danshow
hanya tunjukkan apa yang akan Anda terapkan )Kamu bisa menggunakan:
atau
Hal lain yang menarik untuk dilakukan adalah:
Ini berlaku simpanan tanpa menghapusnya dari daftar, Anda dapat
git checkout .
menghapus perubahan itu atau jika Anda senanggit stash drop stash@{10}
menghapus simpanan dari daftar.Dari sini saya tidak pernah merekomendasikan untuk menggunakan
git stash pop
dan menggunakan kombinasi darigit stash apply
dangit stash drop
Jika Anda menerapkan simpanan di cabang yang salah ... well kadang-kadang sulit untuk memulihkan kode Anda.sumber
Bergantung pada apa yang Anda ingin membandingkan simpanan dengan (pohon kerja lokal / komit induk / komit kepala), sebenarnya ada beberapa perintah yang tersedia, di antaranya yang lama baik
git diff
, dan yang lebih spesifikgit stash show
:Meskipun
git stash show
terlihat lebih ramah pengguna pada pandangan pertama,git diff
sebenarnya lebih kuat karena memungkinkan menentukan nama file untuk diff yang lebih fokus. Saya pribadi mengatur alias untuk semua perintah ini di plugin zsh git saya .sumber