Menyimpan perubahan sambil menyimpan perubahan di direktori kerja di Git


145

Apakah ada git stashperintah yang menyembunyikan perubahan Anda, tetapi menyimpannya di direktori kerja juga? Jadi pada dasarnya git stash; git stash applysatu langkah?




1
@MariuszPawelski Tidak, tidak juga. Pertanyaan itu lebih spesifik daripada pertanyaan saya. Jawaban atas pertanyaan saya hanyalah "tidak". Terima kasih atas tautannya, mungkin bermanfaat bagi sebagian orang, atau bahkan saya sendiri di lain waktu.
Michael Dorst

Agar jelas, pertanyaan saya berbeda karena saya tidak memiliki persyaratan bahwa file tetap tidak tersentuh. Saya hanya mencari alternatif git stash && git stash apply. Anda akan melihat bahwa jawaban untuk pertanyaan itu sangat berbeda dari saya.
Michael Dorst

ah, benar, pertanyaanmu sedikit kurang spesifik. Tetapi saya mengajukan pertanyaan itu karena jawabannya juga memenuhi kebutuhan Anda. Dan dengan cara itu pertanyaan ini muncul sebagai "Tertaut" di bilah sisi, jadi mungkin bermanfaat bagi seseorang.
Mariusz Pawelski

Jawaban:


156

Untuk apa nilainya, cara lain untuk melakukan ini adalah dengan membuat perubahan yang ingin Anda pertahankan, dan kemudian menyimpan semuanya menggunakan --keep-index:

$ git add modified-file.txt
$ git stash push --keep-index

Perintah di atas akan menyimpan semuanya, tetapi akan membiarkan file-file tersebut dipentaskan di direktori kerja Anda.

Dari dokumentasi Linux Kernel Git resmi untukgit stash atau dari git-scm :

Jika --keep-indexopsi ini digunakan, semua perubahan yang sudah ditambahkan ke indeks dibiarkan utuh.


3
sejauh ini penjelasan yang paling jelas tentang --keep-index yang pernah saya lihat. Saya tidak mendapatkan cukup makna dengan cara itu tertulis di dokumen.
detektif

52

git stashdan kemudian git stash apply( git stash && git stash apply) akan menyimpan file dan menerapkan simpanan segera setelah itu. Jadi setelah semua Anda akan memiliki perubahan Anda di simpanan dan dir bekerja.

Anda dapat membuat alias jika Anda menginginkannya utuh. Masukkan sesuatu seperti ini ke ~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"

Kelemahan dari pendekatan ini adalah bahwa semua file disimpan dan dibuat ulang. Ini berarti cap waktu pada file yang dimaksud akan diubah. (Menyebabkan Emacs mengeluh ketika saya mencoba menyimpan file jika dibuka sebelum saya melakukannya git sta, dan dapat menyebabkan pembangunan kembali yang tidak perlu jika Anda menggunakan makeatau teman.)


1
juga, apa perbedaan antara git stash; git stash applydan git stash && git stash apply?
Michael Dorst


2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"harus melakukannya.

Bagaimana saya bisa memodifikasi alias ini untuk digunakan git stash savedengan argumen dan kemudian lakukan git stash apply?
spinningarrow

1
@ Jayayri, bang berarti itu sebenarnya perintah eksternal, bukan argumen git itu sendiri. Sesuai dokumen : "Seperti yang Anda tahu, Git hanya mengganti perintah baru dengan apa pun yang Anda inginkan. Namun, mungkin Anda ingin menjalankan perintah eksternal, bukan subperintah Git. Dalam hal ini, Anda memulai perintah dengan ! karakter! "
Madhead

10

Peningkatan kecil dalam jawaban yang secara praktis mungkin digunakan.

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"

CATATAN: tidak berfungsi tanpa "git add" (mis. Untuk modifikasi tetapi tidak ditambahkan ke file komit)
alex_1948511

4

Ada trik yang dapat membantu Anda, bukan menyembunyikan tetapi FWIW:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

Dan sekarang Anda memiliki simpanan tagged komit yang Anda inginkan, git stash poptoh tidak mungkin untuk melakukan apa pun , tetapi Anda dapat melakukan hal-hal seperti membuat tambalan atau mengatur ulang file dll dari sana, file dir Anda yang berfungsi juga dibiarkan BTW utuh.


2

Anda dapat menggunakan git stash createuntuk membuat simpanan simpanan, dan kemudian menyimpannya ke simpanan menggunakan git stash store:

git stash store $(git stash create) -m "Stash commit message"

Ini dapat disimpan ke alias git agar lebih nyaman:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

Perhatikan bahwa ini tidak melakukan semua yang git stash pushdilakukannya. Misalnya, itu tidak menambahkan nama cabang ke komit, misalnya " stash@{0}: On myBranch: Stash commit message".


1
Cintai yang ini !! Satu koreksi meskipun: man git-stashmengatakan -m <message>harus datang sebelum hash komit. Kecuali ada perubahan git terbaru.
tanius
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.