Simpan hanya satu file

174

Saya ingin menyimpan hanya perubahan dari satu file:

git stash save -- just_my_file.txt

Namun di atas tidak bekerja. Ada alternatif?

Eoghan
sumber
untuk file tunggal , alih-alih menyulap perintah simpanan, pendekatan yang jauh lebih mudah adalah menyalin file tunggal dan ketika Anda ingin mengembalikannya hanya dengan menyalin di atas aslinya. misalnya. cp just_my_file.txt just_my_file.txt.manualstash sekarang Anda dapat melakukan semua checkout dan hal-hal dan karena salinannya adalah "file tidak terlacak", Anda dapat bergerak melintasi cabang dan melakukan tanpa masalah. Ketika Anda berada di cabang kanan / komit di mana Anda ingin "menggabungkan file tunggal " lakukan saja mv just_my_file.txt.manualstash just_my_file.txtdan sekarang Anda dapat meninjau perubahan dan komit jika perlu
Dimitry K

Jawaban:

173

Saya pikir stash -pmungkin itu pilihan yang Anda inginkan, tetapi kalau-kalau Anda mengalami hal-hal yang bahkan lebih rumit di masa depan, ingatlah bahwa:

Stashbenar-benar hanya alternatif yang sangat sederhana untuk hanya branchset yang sedikit lebih kompleks . Stash sangat berguna untuk memindahkan barang dengan cepat, tetapi Anda dapat menyelesaikan hal-hal yang lebih kompleks dengan cabang tanpa banyak sakit kepala dan pekerjaan.

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

lanjutkan dan lakukan apa yang Anda inginkan, dan kemudian cukup rebasedan / atau mergetmpbranch. Ini benar-benar tidak bahwa pekerjaan banyak tambahan ketika Anda perlu melakukan pelacakan lebih berhati-hati dari simpanan akan memungkinkan.

Wes Hardaker
sumber
2
Pada terbalik, Anda dapat mengubah simpanan menjadi cabang nyata tanpa rasa sakit yang besar.
Wes Hardaker
87

Jika Anda tidak ingin menentukan pesan dengan perubahan simpanan Anda, berikan nama file setelah tanda hubung ganda.

$ git stash -- filename.ext

Jika ini file yang tidak dilacak / baru, Anda harus mengaturnya terlebih dahulu.

Namun, jika Anda tidak ingin menentukan sebuah pesan, penggunaan push.

git stash push -m "describe changes to filename.ext" filename.ext

Kedua metode bekerja di git versi 2.13+

sealocal
sumber
1
Jawaban ini tampaknya yang paling lurus ke depan untuk saya ketika pembuatan mengubah perubahan: git stash -- filename.ext, git commit --amend, git stash pop
Brandon Dewey
1
Saya pikir ini harus bergantung pada beberapa fungsi yang sangat baru. Itu tidak bekerja di git 2.1.4.
Richard Smith
Ini menghasilkan beberapa perilaku aneh bagi saya, dengan simpanan disimpan, tetapi file yang sama ditambahkan ke pementasan pada saat yang sama (git v2.20.1),
paradroid
58

Anda dapat secara interaktif menyimpan satu baris dengan git stash -p(analog dengan git add -p).

Itu tidak mengambil nama file, tetapi Anda bisa melewatkan file lain dengan dsampai Anda mencapai file yang Anda inginkan disimpan dan menyimpan semua perubahan di sana bersama a.

Benjamin Bannier
sumber
3
Ini membutuhkan waktu lama jika Anda memiliki banyak file yang tidak ingin disimpan.
jjj
23
Saya tidak tahu kapan ini berubah tetapi git 2.14.1Anda dapat menentukan nama filegit stash -p <filename>
muon
21

Opsi terbaik adalah mem-stage semuanya kecuali file ini, dan beri tahu simpanan untuk menyimpan indeksnya git stash save --keep-index, dengan demikian menyimpan file yang tidak dipentaskan:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

Seperti yang ditunjukkan Dan, thefiletostashadalah satu-satunya yang akan direset oleh simpanan, tetapi juga simpanan file lainnya, jadi bukan yang Anda inginkan.

CharlesB
sumber
2
Meskipun ini menjaga indeks dalam keadaan yang sama, bukankah ini juga menyimpan file yang ada dalam indeks? Dengan kata lain, jika setelah melakukan ini Anda mengkomit indeks ke cabang saat ini, kemudian beralih ke cabang lain dan lakukan git stash pop, bukankah itu akan menerapkan semua file, bukan hanya satu file yang ingin kami simpan?
Dan Moulding
@DanMoulding: Anda memang benar, saya belum memikirkan hal ini.
CharlesB
16

Kalau-kalau Anda benar-benar bermaksud 'buang perubahan' setiap kali Anda menggunakan 'git stash' (dan jangan benar-benar menggunakan git stash untuk menyimpannya sementara), dalam hal ini Anda dapat menggunakan

git checkout -- <file>

Perhatikan bahwa git simpanan hanyalah alternatif yang lebih cepat dan sederhana untuk bercabang dan melakukan hal-hal.

Devesh
sumber
Saya pikir ini adalah jawaban terbaik jika Anda ingin menghapus semua perubahan yang dimodifikasi untuk satu file.
Mohamed Haseel
dan saya akan ini adalah jawaban terbaik untuk tugas khusus itu
Zakir Hussain
6
Pertanyaannya cukup jelas dan tidak bertanya bagaimana mengembalikan perubahan ke satu file. Diturunkan.
Richard Smith
Ini adalah jawaban yang bagus, dengan jelas menunjukkan sebagai alternatif. Tetapi beberapa orang akan cukup keras kepala untuk menggunakan downvote sebagai fitur yang menyalahgunakan: +1
Mukul Jain
@MukulJain Saya sebenarnya perlu menggunakan stash-per-file dengan cara yang sangat sementara (pada dasarnya memisahkan beberapa perubahan dalam dua komit yang mempengaruhi baris yang sama, untuk satu file). Saya tidak akan benar-benar downvote, hanya menyatakan bahwa itu tidak berguna bagi saya.
Paul Stelian