Git berbeda dengan simpanan

Jawaban:

1872

Lihat simpanan terbaru:

git stash show -p

Lihat simpanan sewenang-wenang:

git stash show -p stash@{1}

Dari halaman git stashmanual:

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).

Amber
sumber
72
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.


Atau Anda dapat menggunakan:

git diff --name-only stash@{0} master

Untuk mudah menemukan hanya mengubah nama file.

Czerasz
sumber
10
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.

t.heintz
sumber
so good Saya menambahkan alias ke ~/.gitconfig:laststash = diff stash@{0}^!
sbeam
5
Pasangan sempurna: git difftool stash^!untuk perbedaan simpanan terakhir terhadap komit yang menjadi git difftool stash HEAD
dasarnya
17
Bagi mereka yang seperti saya dan belum pernah melihat ^! sebelum: melakukan ^! adalah penentu rentang yang berarti: ini melakukan, tetapi tidak ada orang tuanya.
Jonathan Gawrych
"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.

Magne
sumber
Apakah ada cara untuk melakukan ini tetapi hanya untuk melihat perbedaan file yang akan diubah oleh apa yang ada di simpanan?
lagweezle
Pada tahun 2020 ini jauh lebih sederhana; lihat jawaban saya yang terbaru .
David Deprost
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

git stash apply
git diff
git reset
git checkout
SensorSmith
sumber
3
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
mleonard
19

Ini berfungsi untuk saya di git versi 1.8.5.2:

git diff stash HEAD
Rimian
sumber
2
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

git diff stash@{0} -- fileName (with path)
Pramod BR
sumber
9

Jika Anda memiliki alat untuk diff (seperti luar biasa)

git difftool stash HEAD
yerlilbilgin
sumber
1
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.

xenithorb
sumber
2

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 :

...
[diff]
    tool = meld
Ferrard
sumber
1

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.

Rockin4Life33
sumber
1

Dia daftar simpanan

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.

Raúl Martín
sumber
1

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 .

David Deprost
sumber