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?

Michael Dorst
sumber
Pertanyaan yang sama: stackoverflow.com/q/6315459/350384
Mariusz Pawelski
Apakah ini menjawab pertanyaan Anda? Perintah Git untuk menyimpan simpanan tanpa memodifikasi pohon yang berfungsi?
Mariusz Pawelski
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.

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

orang gila
sumber
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"
Premchandra Singh
sumber
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.

Kenchi
sumber
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".

M. Justin
sumber
1
Cintai yang ini !! Satu koreksi meskipun: man git-stashmengatakan -m <message>harus datang sebelum hash komit. Kecuali ada perubahan git terbaru.
tanius