Force git stash untuk menimpa file yang ditambahkan

223

Saya memiliki beberapa file yang tidak dapat dilacak di git. Saya membuat beberapa perubahan dan ingin mengkomitnya, tetapi menyadari saya lupa untuk memeriksa file yang belum dimodifikasi terlebih dahulu. Jadi saya menyimpan file, lalu menambahkan versi yang tidak dimodifikasi.

Kemudian ketika saya menerapkan simpanan ke repositori, saya mendapatkan konflik karena file telah ditambahkan.

Bagaimana saya bisa menerapkan simpanan, dan memaksa versi dalam simpanan untuk digunakan dalam preferensi ke aslinya dalam repositori?

Terima kasih

Stefan
sumber
7
Solusi yang jelek sampai seseorang menghasilkan yang lebih baik: hapus file baru git rmsebelum melakukannya git stash apply.
tom
Bukankah itu akan kehilangan sejarah? Alasan untuk menambahkan versi yang tidak dimodifikasi adalah untuk menjaga sejarah.
Stefan
1
Tidak, itu tidak akan kehilangan sejarah. Jika Anda menghapus file, tambahkan kembali dengan modifikasi kecil, lalu komit, gitakan memperlakukannya hanya sebagai modifikasi kecil.
tom

Jawaban:

365

Gunakan git checkoutalih-alih git stash apply:

$ git checkout stash -- .
$ git commit

Ini akan mengembalikan semua file di direktori saat ini ke versi simpanan mereka.


Jika ada perubahan pada file lain di direktori kerja yang harus disimpan, berikut ini adalah alternatif yang tidak terlalu berat:

$ git merge --squash --strategy-option=theirs stash

Jika ada perubahan dalam indeks, atau gabungan akan menyentuh file dengan perubahan lokal, git akan menolak untuk menggabungkan. File individual dapat diperiksa dari simpanan menggunakan

$ git checkout stash -- <paths...>

atau secara interaktif dengan

$ git checkout -p stash
tom
sumber
Tak satu pun dari ini bekerja dalam kasus penggunaan saya. Temuan dan solusi saya ada di sini stackoverflow.com/a/26685296/496046 - ini juga harus menyelesaikan situasi Anda,
@AlexanderBird
2
git checkout stash -- .Perintah ini benar-benar tidak melakukan apa pun ketika saya menjalankannya.
Rotsiser Mho
3
@RotsiserMho Git tidak begitu baik dalam memberikan pesan konfirmasi. Apakah Anda yakin itu tidak melakukan apa-apa? Bekerja dengan baik untuk saya.
Sinjai
5
Saya harus menjalankan git checkout stash -- .di folder induk tertinggi yang berisi perubahan saya, kalau tidak itu hanya menerapkan perubahan pada folder dari mana saya menjalankan perintah.
Leo
1
@ Leo: Itu benar, itu karena .menentukan direktori saat ini (Anda bisa menggantinya dengan jalur yang berbeda daripada mengubah direktori). Saya memperbarui jawaban saya untuk membuatnya lebih jelas.
tom
13

git stash show -p | git apply

dan kemudian git stash dropjika Anda ingin menjatuhkan barang simpanan.

TBT Hasan
sumber
2
Catatan: Anda harus di root repositori untuk bekerja dengan benar, jika tidak, anda akan mendapatkan ini .
Ruslan
@PengheGeng Seperti yang Anda lihat, saya menjawab sekitar setahun sebelum NetEmmanuel
Hasan TBT
@Ruslan Saya mendapatkan itu sementara di root repo saya 🤔
Leo
6

Untuk memaksa git stash popmenjalankan perintah ini

git stash show -p | git apply && git stash drop
NetEmmanuel
sumber
1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Versi panjang:

Anda mendapatkan kesalahan ini karena perubahan yang tidak dikomit yang ingin Anda timpa. Batalkan perubahan ini dengan git checkout HEAD. Anda dapat membatalkan perubahan ke file tertentu dengan git checkout HEAD path/to/file. Setelah menghapus penyebab konflik, Anda dapat menerapkan seperti biasa.

User12547645
sumber