Pertanyaan Bagaimana cara memberi nama dan mengambil simpanan berdasarkan nama di git?


Saya selalu mendapat kesan bahwa Anda dapat memberikan nama dengan melakukan sesuatu git stash save stashname, yang nantinya bisa Anda terapkan dengan melakukan git stash apply stashname. Tetapi tampaknya dalam hal ini semua yang terjadi adalah itu stashname akan digunakan sebagai deskripsi simpanan.

Apakah tidak ada cara untuk memberi nama simpanan? Jika tidak, apa yang akan Anda rekomendasikan untuk mencapai fungsi yang setara? Pada dasarnya saya memiliki simpanan kecil yang saya secara berkala ingin menerapkan, tetapi tidak ingin selalu harus berburu git stash list berapa jumlah simpanan sebenarnya.


927
2018-06-29 21:33


asal


Jawaban:


Anda benar-benar dapat menemukan simpanan dengan nama menggunakan sintaks ekspresi reguler git untuk menangani objek:

stash^{/<regex>}
:/<regex>

Misalnya, saat menyimpan simpanan Anda dengan nama simpan:

git stash save "guacamole sauce WIP"

... Anda dapat menggunakan ekspresi reguler untuk mengatasi simpanan itu:

git stash apply stash^{/guacamo}

Ini akan menerapkan simpanan termuda yang cocok dengan ekspresi reguler guacamo. Dengan begitu, Anda tidak harus tahu nomor berapa simpanan di tumpukan, Anda hanya perlu tahu namanya. Tidak ada sintaks terser untuk ini, tetapi Anda dapat membuat alias di Anda .gitconfig mengajukan:

[alias]
sshow = "!f() { git stash show stash^{/$*} -p; }; f"
sapply = "!f() { git stash apply stash^{/$*}; }; f"

Anda dapat menggunakannya git sapply <regex> untuk menerapkan simpanan itu (tanpa menjatuhkan).
 Anda dapat menggunakannya git sshow <regex> untuk ditampilkan: file diubah, penyisipan, dan penghapusan

EDIT: Alat peraga untuk jawaban StackOverflow ini tentang cara menggunakan argumen bash di alias git.

EDIT 2: Jawaban ini biasanya mengandung drop dan list alias, tetapi sejak itu saya menghapusnya, sejak itu drop membutuhkan stash@{n} sintaks sementara list tidak menyaring simpanannya sama sekali. Jika ada yang tahu cara menyelesaikan simpanan SHA-1 hash ke stash ref, maka saya bisa menerapkan perintah lain juga.

EDIT 3: Per isyiSaran saya telah menambahkan bendera patch untuk menunjukkan apa isi simpanannya ketika menunjukkan satu.


1147
2017-07-27 13:17



Ini adalah bagaimana Anda melakukannya:

git stash save "my_stash"

di mana "my_stash" adalah nama simpanan ...

Beberapa hal yang lebih berguna untuk diketahui: Semua simpanan disimpan dalam tumpukan. Ketik:

git stash list

Ini akan mencantumkan semua simpanan Anda.

Untuk menerapkan simpanan dan menghapusnya dari tumpukan simpanan, Anda dapat memberi,

git stash pop stash@{n}

Untuk menerapkan simpanan dan menyimpannya di tumpukan simpanan, ketik:

git stash apply stash@{n}

Di mana n di indeks perubahan yang disembunyikan.


321
2018-03-04 08:18



Anda dapat mengubah simpanan menjadi cabang jika Anda merasa itu cukup penting:

git stash branch <branchname> [<stash>]

dari halaman manual:

Ini membuat dan memeriksa cabang baru bernama <branchname> mulai dari komit di mana <stash> pada awalnya dibuat, menerapkan perubahan yang tercatat dalam <simpanan> ke pohon kerja dan indeks baru, kemudian menjatuhkan <simpanan> jika itu selesai dengan sukses. Ketika tidak ada <stash> diberikan, terapkan yang terbaru.

Ini berguna jika cabang tempat Anda menyimpan simpanan git telah cukup berubah sehingga simpanan git berlaku gagal karena konflik. Karena simpanan diterapkan di atas komitmen yang HEAD pada saat simpanan git dijalankan, itu mengembalikan keadaan awalnya disembunyikan tanpa konflik.

Anda kemudian dapat mencabut cabang baru ini ke tempat lain yang merupakan keturunan dari tempat Anda ketika Anda menyembunyikannya.


64
2018-06-29 22:34



Stashes tidak dimaksudkan untuk menjadi benda permanen seperti yang Anda inginkan. Anda mungkin akan lebih baik dilayani menggunakan tag pada commit. Bangun barang yang ingin Anda simpan. Buat komitmen dari itu. Buat tag untuk commit itu. Kemudian gulung kembali cabang Anda ke HEAD^. Sekarang ketika Anda ingin mengajukan permohonan kembali simpanan yang dapat Anda gunakan git cherry-pick -n tagname (-n aku s --no-commit).


30
2018-06-29 21:39



git stash save aku s tidak lagi digunakan sekarang, Anda bisa menggunakan git stash push -m "message" 

Anda dapat melakukan seperti ini:

git stash push -m "message" 

di mana "pesan" adalah nama simpanan Anda ...


15
2018-03-29 15:08



Jika Anda hanya mencari cara yang ringan untuk menyimpan sebagian atau semua perubahan copy pekerjaan Anda saat ini dan kemudian menerapkannya kembali nanti, pertimbangkan file tambalan:

# save your working copy changes
git diff > some.patch

# re-apply it later
git apply some.patch

Sesekali saya bertanya-tanya apakah saya harus menggunakan simpanan untuk ini dan kemudian saya melihat hal-hal seperti kegilaan di atas dan saya puas dengan apa yang saya lakukan :)


12
2017-11-10 16:06



Alias

sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"

Pemakaian

git sapply "<regex>"

  • kompatibel dengan Git untuk Windows

Edit: Saya menempel pada solusi asli saya, tetapi saya melihat mengapa mayoritas lebih menyukai versi Etan Reisner (di atas). Jadi hanya untuk catatan:

sapply = "!f() { git stash apply \"$(git stash list | grep -E \"$*\" | awk \"{ print $ 1; }\" | sed -n \"s/://;1p\")\"; }; f"

7
2017-11-26 22:51



Jawaban ini sangat bergantung pada Klemen Slavič. Saya hanya akan mengomentari jawaban yang diterima tetapi saya belum punya cukup tenaga :(

Anda juga dapat menambahkan alias git untuk menemukan stash ref dan menggunakannya di alias lain untuk pertunjukan, berlaku, drop, dll.

[alias]
    sgrep = "!f() { ref=$(git --no-pager stash list | grep "$1" | cut -d: -f1 | head -n1); echo ${ref:-<no_match>}; }; f"
    sshow = "!f() { git stash show $(git sgrep "$1") -p; }; f"
    sapply = "!f() { git stash apply $(git sgrep "$1"); }; f"
    sdrop = "!f() { git stash drop $(git sgrep "$1"); }; f"

Perhatikan bahwa alasan untuk itu ref=$( ... ); echo ${ref:-<no_match>}; Pola begitu kosong tidak dikembalikan yang akan menyebabkan sshow, sapply dan sdrop untuk menargetkan simpanan terbaru, bukan gagal seperti yang diharapkan.


5
2018-01-11 01:30