Muncul dan menyembunyikan lagi tidak selalu merupakan pilihan, karena simpanan mungkin didasarkan pada keadaan yang sudah ketinggalan zaman dan mengakibatkan konflik ketika muncul. (Keadaan yang sudah ketinggalan zaman bahkan tidak harus ada di mana pun dalam sejarah lagi.)
Tom
Jawaban:
259
Anggap daftar simpanan Anda terlihat seperti ini:
$ git stash list
stash@{0}: WIP on master: Add some very important feature
stash@{1}: WIP on master: Fix some silly bug
Pertama, Anda harus menghapus entri simpanan yang ingin Anda ganti namanya:
$ git stash drop stash@{1}
Dropped stash@{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)
Sekarang tambahkan saja dengan pesan baru menggunakan sha of commit yang dikembalikan setelah dijatuhkan:
$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db
Dan itu dia:
$ git stash list
stash@{0}: Very descriptive message
stash@{1}: WIP on master: Add some very important feature
Solusi ini membutuhkan git 1.8.4 atau yang lebih baru, dan ya, ia bekerja dengan direktori kerja yang kotor juga.
git show stash@{0}masih menunjukkan informasi lama setelahnya. Bagaimana cara memperbaikinya? (Harap dicatat bahwa simpanan kemudian mendapatkan SHA yang berbeda.)
Tino
4
Rasanya lebih baik untuk mendapatkan hash dengan git showdan mulai dengan git stash store. Kemudian dengan git stash listAnda akan melihat simpanan lama dan baru. Akhirnya Anda dapat membersihkan simpanan lama dengan git stash drop.
hogi
6
Akankah git stash drop tidak kehilangan perubahan?
Shravya Boggarapu
4
@ ShravyaBoggarapu, tidak, git tidak menghapus commit sampai git gcdijalankan. Setelah stash dropAnda dapat dengan mudah menemukan komit yang biasanya tidak dapat diakses ini menggunakan git fsck | grep commitperintah.
qzb
2
@ ÐerÆndi hanya menerapkan dan menyimpan adalah pilihan yang mudah, tetapi tidak berfungsi ketika perubahan tidak dapat diterapkan kembali karena konflik. Sementara itu, menjatuhkan dan menyimpan karya dalam kondisi apa pun. Saya telah menguji solusi saya sekali lagi - ini berfungsi dengan baik pada versi git terbaru (2.17.0).
qzb
62
Kecuali Anda melakukannya secara manual atau menyumbang peningkatan pada Git, Anda dapat menggunakan alias:
Dengan [save options]opsi git stash save:[-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]
Contoh:
$ git stash list
stash@{0}: On master: Pep8 format
stash@{1}: On master: co other than master with local changes
stash@{2}: On master: tests with deployAtEnd
# Let's say I want to rename the stash@{2} adding an issue reference:
$ git stash-rename stash@{2} NXP-13971-deployAtEnd
$ git stash list
stash@{0}: On master: NXP-13971-deployAtEnd
stash@{1}: On master: Pep8 format
stash@{2}: On master: co other than master with local changes
Itu akan bekerja bahkan jika Anda memiliki perubahan unstaged lokal :)
Luar biasa! Lebih keren lagi jika Anda bisa melakukannyagit stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
mikemaccana
3
jadi jawabannya adalah 1) bersihkan copy pekerjaan, 2) terapkan simpanan yang ingin Anda ganti namanya, 3) jatuhkan dari daftar simpanan, 4) buat simpanan baru dengan pesan yang benar.
gcb
2
Untuk memperjelas, Anda mengganti nama simpanan terakhir, dan setelah tindakan itu menjadi simpanan teratas?
onebree
2
Saya menghapus simpanan untuk mengganti nama, menyimpan perubahan saat ini jika ada, membuat ulang simpanan yang dihapus dengan nama yang diinginkan, mengajukan kembali perubahan saat ini jika ada.
Julien Carsique
3
Versi ini memeriksa untuk memastikan kedua argumen ada sehingga tidak hanya menyimpan simpanan terakhir Anda secara tidak sengaja. Itu juga hanya membutuhkan nomor simpanan, bukan keseluruhan stash@{0}referensi. gist.github.com/jdforsythe/f248bf6c72fc020225cc3e315a32e922git config --global alias.stash-rename '!_() { if [ -z \"$1\" ] || [ -z \"$2\" ]; then echo \"git stash-rename 0 NewName\" && echo \"\" && git stash list && exit 1; else stash=\"stash@{$1}\"; rev=$(git rev-parse \"${stash}\"); git stash drop \"${stash}\" || exit 1; git stash store -m \"$2\" \"$rev\" || exit 1; git stash list; fi }; _'
jdforsythe
6
Ini sangat sederhana. Pertama, batalkan simpanan terakhir dengan:
git stash pop
Setelah ini, Anda dapat menyimpan simpanan dengan nama yang disesuaikan dengan cara ini:
Terapkan git reflog updateperintah baru yang memperbarui pesan yang terkait dengan entri reflog tertentu. Untuk melakukan ini, update_reflog_ent()fungsi baru (dalam reflog.c ) akan mengubah pesan yang terkait dengan entri reflog spesifik untuk diperbarui. Sebuah update_reflog()fungsi akan menggunakan for_each_reflog_ent()dengan update_reflog_entbenar-benar melakukan perubahan.
Sebuah git stash renameperintah akan kemudian hanya perlu menelepon git
reflog updatedengan ref yang tepat dan pesan baru.
Atau Anda bisa, tentu saja, membuang simpanan dan melakukan git stash save [message]
Jika Anda tidak hanya ingin memperbaiki pesan simpanan dan juga ingin memperbaiki pesan komit simpanan, sedemikian rupa
git stash list
dan
git log --oneline -1 stash
keduanya setuju dengan apa yang ditampilkan, Anda perlu lebih banyak. Mungkin ada cara yang lebih baik untuk melakukannya, tetapi resep ini mudah dimengerti, saya harap.
Untuk dapat melakukannya, git commit --amendAnda harus berada di TIP cabang. Maka solusinya adalah:
git checkout -b scratch stash@{1}
git stash drop stash@{1}
git commit --amend -m "$MESSAGE"
git stash store -m "$MESSAGE" HEAD
git checkout master
git branch -D scratch
Dijelaskan:
Buat cabang "awal" baru (belum ada) dari "simpanan yang dipermasalahkan" dan alihkan ke cabang itu
Hapus simpanan lama. Ini aman, karena kami masih memiliki ini di cabang.
Gunakan git commit --amenduntuk mengganti pesan komit, ini mengubah SHA dari "simpanan yang dipertanyakan"
Beralih kembali (yang menganggap Anda berasal dari "master") dan pembersihan
Kekurangan:
Ini beralih cabang sementara. Jadi resep ini hanya bisa diterapkan ketika git status --porcelainsudah bersih (baca: tidak mengeluarkan apa-apa)
Itu menumpuk kembali simpanan, sehingga simpanan yang diubah menjadi stash@{0}
Anda harus memasukkan $MESSAGEdua kali atau menggunakan beberapa variabel lingkungan (dalam contoh MESSAGE:)
Anda perlu menemukan nama cabang yang tidak digunakan
Ada cara untuk melakukan ini tanpa berpindah cabang, tetapi ini berada di luar cakupan jawaban ini.
Contoh
git init scratch
cd scratch
for a in A B C D; do date >$a; git add $a; git commit -m $a; done
for a in X Y; do echo $a > Z; git stash save --all; done
git log --oneline --graph --decorate --all; git stash list
Keluaran
*-. e0e281b (refs/stash) WIP on master: 8bdcc32 D
|\ \
| | * 4d62f52 untracked files on master: 8bdcc32 D
| * 096f158 index on master: 8bdcc32 D
|/
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: WIP on master: 8bdcc32 D
stash@{1}: WIP on master: 8bdcc32 D
Sekarang tanpa mengubah komit (catatan: SHA berikut akan berbeda di sisi Anda):
git stash drop stash@{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list
Keluaran
*-. 2fbf900 (refs/stash) WIP on master: 8bdcc32 D
|\ \
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D
Seperti yang Anda lihat, stash@{0}masih ditampilkan seperti 2fbf900 (refs/stash) WIP on master: 8bdcc32 Dpada git log. Jika Anda perhatikan dengan teliti, Anda akan melihat, bahwa beberapa komit telah mengubah SHA. Ini karena cara penanganan simpanan (orang tua termasuk dalam SHA, dan simpanan memiliki simpanan sebagai orangtua).
Perbaiki itu:
git checkout -b scratch stash
git stash drop
git commit --amend -m ...changed...
git stash store -m ...changed... HEAD
git checkout master
git branch -D scratch
git log --oneline --graph --decorate --all; git stash list
Keluaran
*-. 4d55186 (refs/stash) ...changed...
|\ \
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D
Seperti yang juga Anda lihat, refs/stashada SHA yang berubah juga.
Layak disebutkan: ini menghancurkan indeks yang disimpan dengan simpanan asli, menggantinya dengan indeks baru yang cocok dengan komit induk dari simpanan asli. Jika seseorang tidak berencana untuk menggunakan indeks tersimpan asli (atau sudah cocok dengan induk simpanan asli), ini bukan masalah.
torek
1
Ini adalah versi modifikasi alias Julien yang memungkinkan Anda menangani On <branch>awalan yang biasanya diawali dengan nama simpanan:
repo[master] % touch tmp && git add tmp && git stash save first
Saved working directory and index state On master: first
HEAD is now at bd62064 Initial commit
repo[master] % touch tmp && git add tmp && git stash save second
Saved working directory and index state On master: second
HEAD is now at bd62064 Initial commit
repo[master] % git stash list
stash@{0}: On master: second
stash@{1}: On master: first
repo[master] % git stash-rename renamed
stash@{0}: On master: renamed
stash@{1}: On master: first
repo[master] % git stash-rename also-renamed stash@{1}
stash@{0}: On master: also-renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-changed stash@{0} new-branch
stash@{0}: On new-branch: branch-changed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-name-persists
stash@{0}: On new-branch: branch-name-persists
stash@{1}: On master: renamed
repo[master] % git stash-rename no-branch stash@{0} .
stash@{0}: no-branch
stash@{1}: On master: renamed
repo[master] % git stash-rename renamed
stash@{0}: renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename readd-branch stash@{0} develop
stash@{0}: On develop: readd-branch
stash@{1}: On master: renamed
Sebagian besar perintah adalah untuk menguraikan argumen dan mencari tahu apa yang harus dilakukan untuk nama cabang. The gitalat yang digunakan adalah sebagai berikut:
git rev-parse <stash> untuk menemukan SHA simpanan.
git stash list --format=%gs -1 <stash>untuk menemukan subjek reflog simpanan. Perhatikan bahwa ini berbeda dari pesan komit simpanan, yang tidak diubah oleh perintah ini. Subjek reflog adalah apa yang muncul di dalamnya git stash list, dan Anda dapat mengubah subjek reflog tanpa mengubah hash dari commit yang terkait dengan simpanan. Namun, Anda selalu dapat menemukan pesan komit asli, jadi jangan gunakan git stash-renameuntuk menghapus informasi sensitif!
git stash drop <stash>untuk menjatuhkan referensi lama ke simpanan (tapi kami masih memiliki SHA, jadi tidak hilang).
git stash store -m <new-message> <sha>untuk menyimpan referensi baru ke simpanan dengan informasi komit yang sama tetapi subjek reflog berbeda .
git stash listuntuk mendaftarkan simpanan setelah operasi selesai. Perhatikan bahwa simpanan baru selalu didorong ke awal daftar. Penting untuk mendorong kembali semua simpanan sebelum simpanan bunga untuk memulihkan posisi semula.
Jawaban:
Anggap daftar simpanan Anda terlihat seperti ini:
Pertama, Anda harus menghapus entri simpanan yang ingin Anda ganti namanya:
Sekarang tambahkan saja dengan pesan baru menggunakan sha of commit yang dikembalikan setelah dijatuhkan:
Dan itu dia:
Solusi ini membutuhkan git 1.8.4 atau yang lebih baru, dan ya, ia bekerja dengan direktori kerja yang kotor juga.
sumber
git show stash@{0}
masih menunjukkan informasi lama setelahnya. Bagaimana cara memperbaikinya? (Harap dicatat bahwa simpanan kemudian mendapatkan SHA yang berbeda.)git show
dan mulai dengangit stash store
. Kemudian dengangit stash list
Anda akan melihat simpanan lama dan baru. Akhirnya Anda dapat membersihkan simpanan lama dengangit stash drop
.git gc
dijalankan. Setelahstash drop
Anda dapat dengan mudah menemukan komit yang biasanya tidak dapat diakses ini menggunakangit fsck | grep commit
perintah.Kecuali Anda melakukannya secara manual atau menyumbang peningkatan pada Git, Anda dapat menggunakan alias:
Penggunaan: "
git stash-rename <stash> [save options] [<message>]
"Dengan
[save options]
opsigit stash save
:[-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]
Contoh:
Itu akan bekerja bahkan jika Anda memiliki perubahan unstaged lokal :)
EDIT 2016/02/22
Skrip sederhana, kredit ke qzb , https://stackoverflow.com/a/35549615/515973
Penggunaan: "
git stash-rename <stash> [<message>]
"sumber
git stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
stash@{0}
referensi. gist.github.com/jdforsythe/f248bf6c72fc020225cc3e315a32e922git config --global alias.stash-rename '!_() { if [ -z \"$1\" ] || [ -z \"$2\" ]; then echo \"git stash-rename 0 NewName\" && echo \"\" && git stash list && exit 1; else stash=\"stash@{$1}\"; rev=$(git rev-parse \"${stash}\"); git stash drop \"${stash}\" || exit 1; git stash store -m \"$2\" \"$rev\" || exit 1; git stash list; fi }; _'
Ini sangat sederhana. Pertama, batalkan simpanan terakhir dengan:
Setelah ini, Anda dapat menyimpan simpanan dengan nama yang disesuaikan dengan cara ini:
Semoga bermanfaat untuk Anda. :)
sumber
Saya pikir itu tidak mungkin. Sudah ada proposal untuk mengubah nama simpanan, tetapi belum diimplementasikan.
Atau Anda bisa, tentu saja, membuang simpanan dan melakukan
git stash save [message]
sumber
Untuk kepentingan pembaca, berikut ini adalah ekstensi untuk jawaban yang saat ini diterima dan benar .
Jika Anda tidak hanya ingin memperbaiki pesan simpanan dan juga ingin memperbaiki pesan komit simpanan, sedemikian rupa
dan
keduanya setuju dengan apa yang ditampilkan, Anda perlu lebih banyak. Mungkin ada cara yang lebih baik untuk melakukannya, tetapi resep ini mudah dimengerti, saya harap.
Untuk dapat melakukannya,
git commit --amend
Anda harus berada di TIP cabang. Maka solusinya adalah:Dijelaskan:
git commit --amend
untuk mengganti pesan komit, ini mengubah SHA dari "simpanan yang dipertanyakan"Kekurangan:
Ini beralih cabang sementara. Jadi resep ini hanya bisa diterapkan ketika
git status --porcelain
sudah bersih (baca: tidak mengeluarkan apa-apa)Itu menumpuk kembali simpanan, sehingga simpanan yang diubah menjadi
stash@{0}
Anda harus memasukkan
$MESSAGE
dua kali atau menggunakan beberapa variabel lingkungan (dalam contohMESSAGE
:)Anda perlu menemukan nama cabang yang tidak digunakan
Ada cara untuk melakukan ini tanpa berpindah cabang, tetapi ini berada di luar cakupan jawaban ini.
Contoh
Keluaran
Sekarang tanpa mengubah komit (catatan: SHA berikut akan berbeda di sisi Anda):
Keluaran
Seperti yang Anda lihat,
stash@{0}
masih ditampilkan seperti2fbf900 (refs/stash) WIP on master: 8bdcc32 D
padagit log
. Jika Anda perhatikan dengan teliti, Anda akan melihat, bahwa beberapa komit telah mengubah SHA. Ini karena cara penanganan simpanan (orang tua termasuk dalam SHA, dan simpanan memiliki simpanan sebagai orangtua).Perbaiki itu:
Keluaran
Seperti yang juga Anda lihat,
refs/stash
ada SHA yang berubah juga.sumber
Ini adalah versi modifikasi alias Julien yang memungkinkan Anda menangani
On <branch>
awalan yang biasanya diawali dengan nama simpanan:Sintaksis:
Contoh penggunaan:
Sebagian besar perintah adalah untuk menguraikan argumen dan mencari tahu apa yang harus dilakukan untuk nama cabang. The
git
alat yang digunakan adalah sebagai berikut:git rev-parse <stash>
untuk menemukan SHA simpanan.git stash list --format=%gs -1 <stash>
untuk menemukan subjek reflog simpanan. Perhatikan bahwa ini berbeda dari pesan komit simpanan, yang tidak diubah oleh perintah ini. Subjek reflog adalah apa yang muncul di dalamnyagit stash list
, dan Anda dapat mengubah subjek reflog tanpa mengubah hash dari commit yang terkait dengan simpanan. Namun, Anda selalu dapat menemukan pesan komit asli, jadi jangan gunakangit stash-rename
untuk menghapus informasi sensitif!git stash drop <stash>
untuk menjatuhkan referensi lama ke simpanan (tapi kami masih memiliki SHA, jadi tidak hilang).git stash store -m <new-message> <sha>
untuk menyimpan referensi baru ke simpanan dengan informasi komit yang sama tetapi subjek reflog berbeda .git stash list
untuk mendaftarkan simpanan setelah operasi selesai. Perhatikan bahwa simpanan baru selalu didorong ke awal daftar. Penting untuk mendorong kembali semua simpanan sebelum simpanan bunga untuk memulihkan posisi semula.sumber
Cara termudah: pop simpanan Anda dengan git simpanan pop lalu simpan lagi dengan simpanan git simpan nama Anda
sumber