Git simpanan tidak di-cache: bagaimana cara menyingkirkan semua perubahan yang tidak dipentaskan?

96

Misalkan dua rangkaian perubahan dibuat dalam proyek yang diversi oleh git. Satu set dipentaskan dan yang lainnya tidak.

Saya ingin memeriksa ulang perubahan bertahap dengan menjalankan proyek saya pada keadaan ini (sebelum berkomitmen). Apa cara sederhana untuk menyingkirkan semua perubahan yang tidak dipentaskan dan membiarkannya hanya bertahap? Jadi saya perlu perubahan yang tidak bertahap untuk menghilang dari proyek saya, tetapi disimpan di suatu tempat untuk pekerjaan lebih lanjut.

Ini terdengar sangat mirip dengan git stashperintah. Tapi git stashakan menyingkirkan perubahan yang tidak dipentaskan dan bertahap dari proyek saya. Dan saya tidak dapat menemukan yang seperti itu git stash uncached.

klm123
sumber
Sampai hari ini dengan git 2.21 saya, masih belum ada jawaban yang bagus untuk ini. Semua jawaban di bawah salah ( -kopsi) atau tidak praktis untuk digunakan.
Penghe Geng

Jawaban:

100

Pembaruan 2:
Saya tidak yakin mengapa orang mengeluh tentang jawaban ini, tampaknya berfungsi dengan baik dengan saya, untuk file yang tidak ditangani Anda dapat menambahkan -ubendera

Perintah lengkapnya menjadi git stash --keep-index -u

Dan inilah cuplikan dari git-stashbantuan tersebut

Jika opsi --keep-index digunakan, semua perubahan yang sudah ditambahkan ke indeks dibiarkan utuh.

Jika opsi --include-untracked digunakan, semua file yang tidak terlacak juga disimpan dan kemudian dibersihkan dengan git clean, meninggalkan direktori kerja dalam keadaan yang sangat bersih. Jika opsi --all digunakan sebagai gantinya, maka file yang diabaikan akan disimpan dan dibersihkan selain file yang tidak terlacak.

Dan ini adalah gif tampilannya:

masukkan deskripsi gambar di sini

Memperbarui:

Meskipun ini adalah jawaban yang dipilih, banyak yang menunjukkan bahwa [jawaban di bawah] (https://stackoverflow.com/a/34681302/292408) adalah yang benar, saya sarankan untuk memeriksanya.

Saya menguji jawaban saya lagi hari ini (31/1/2020) terhadap versi git 2.24.0, dan saya masih percaya bahwa itu benar, saya menambahkan catatan kecil di atas tentang file yang tidak terlacak. Jika menurut Anda itu tidak berfungsi, sebutkan juga versi git Anda.

Jawaban lama :
Jika --keep-indexopsi digunakan, semua perubahan yang sudah ditambahkan ke indeks dibiarkan utuh:

git stash --keep-index

Dari dokumentasigit-stash :

Menguji komitmen parsial

Anda dapat menggunakan git stash save --keep-indexsaat Anda ingin membuat dua atau lebih komit dari perubahan di pohon kerja, dan Anda ingin menguji setiap perubahan sebelum melakukan:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

Tetapi, jika Anda hanya ingin memeriksa perubahan bertahap secara visual saja, Anda dapat mencoba difftool:

git difftool --cached
Mohammad AbuShady
sumber
4
lihat juga git stash [-p|--patch]yang terasa seperti penyimpanan interaktif. Dari man git stash"Dengan --patch, Anda dapat secara interaktif memilih hunks dari perbedaan antara HEAD dan pohon kerja yang akan disimpan."
sini
1
Saya biasanya add -p, checkout -pdan reset -p, tidak pernah mencoba stash -p, terima kasih atas tipnya: D
Mohammad AbuShady
19
Perhatikan bahwa jawaban ini juga akan menyembunyikan perubahan yang telah Anda lakukan.
Ben Flynn
1
Jawaban ini tidak terlalu berguna karena akan menimbulkan kebingungan. Jawaban ini lebih baik stackoverflow.com/a/34681302/292408 .
Elijah Lynn
1
@ElijahLynn Saya telah menautkan ke jawaban lain karena saya menemukan banyak orang mengatakan ini jawaban yang lebih baik, terima kasih atas komentar Anda
Mohammad AbuShady
102

Jawaban yang diterima juga menyembunyikan perubahan yang dipentaskan seperti yang ditunjukkan oleh beberapa orang. Berikut adalah cara untuk melakukannya tanpa mendapatkan perubahan bertahap Anda di simpanan.

Idenya adalah untuk melakukan komit sementara dari perubahan bertahap Anda, lalu menyimpan perubahan yang tidak bertahap, lalu batalkan komit sementara:

# temp commit of your staged changes:
$ git commit --message "WIP"

# -u option so you also stash untracked files
$ git stash -u

# now un-commit your WIP commit:
$ git reset --soft HEAD^

Pada titik ini, Anda akan memiliki simpanan perubahan yang tidak bertahap dan hanya akan memiliki perubahan bertahap yang ada dalam copy pekerjaan Anda.

stephen.hanson
sumber
22
Ini benar-benar jawaban yang benar IMO. The --keep-indexpilihan dalam jawaban yang diterima saat ini masih stashes apa yang ada di indeks, itu hanya juga menyimpannya dalam indeks. Jadi kemudian digandakan, dan keriuhan pun terjadi.
Ken Williams
4
@KenWiams <hilaritas </del> <ins> tragedi </ins>
tuespetre
@CenPas OP, bisakah Anda menyesuaikan jawaban yang dipilih?
MikeMurko
2
The git add .Langkah mungkin ingin ditingkatkan oleh git add --allkarena itu harus ambil file dalam direktori di atas direktori kerja saat ini juga.
Elijah Lynn
1
Ini adalah jawaban terbaik sejauh ini, karena opsi --keep-index dalam jawaban yang diterima menyesatkan. Ini harus menjadi jawaban yang diterima.
Elijah Lynn
21

Saya menemukan jawaban yang ditandai tidak berhasil untuk saya karena saya membutuhkan sesuatu yang benar-benar hanya menyembunyikan perubahan saya yang tidak dipentaskan. Jawaban yang ditandai,, git stash --keep-indexmenyembunyikan perubahan yang dipentaskan dan yang tidak dipentaskan. Bagian tersebut --keep-indexhanya membiarkan indeks tetap utuh pada copy pekerjaan juga. Itu berfungsi untuk OP, tetapi hanya karena dia mengajukan pertanyaan yang sedikit berbeda dari yang sebenarnya dia inginkan jawabannya.

Satu-satunya cara yang benar yang saya temukan untuk menyembunyikan perubahan tidak bertahap adalah dengan tidak menggunakan simpanan sama sekali:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .juga akan berfungsi sebagai pengganti apply -R.

Kerja kerja kerja...

git apply unstaged.diff
rm unstaged.diff
Phile Biner
sumber
1
Di sini git version 2.6.1.windows.1, git stash -kbekerja seperti yang dijelaskan.
koppor
Ini harus menjadi jawaban yang diterima! Ini adalah satu-satunya di beberapa utas stackoverflow yang melakukan apa yang diklaimnya dan tidak mengandalkan membuat komitmen sementara!
pengguna643011
1
@ user643011: Komit sementara bukanlah hal yang buruk di git. Mereka tidak memerlukan biaya dan tidak merugikan siapa pun.
Fritz
1
@ Fritz: Tidak ada komit sementara yang tidak dimungkinkan dalam beberapa skenario. Ini mungkin gagal jika Anda memiliki hook pra-komit yang memeriksa kode kerja saat ini. Jika perubahan bertahap Anda bagus tetapi perubahan yang tidak bertahap tidak, pendekatan ini akan gagal untuk melakukan perubahan bertahap.
Penghe Geng
1
Ini tidak termasuk file yang tidak terlacak. Anda perlu menggunakan "git ls-files" untuk menemukan & memasukkannya ke dalam patch diff
ACyclic
5

Git: Simpan perubahan yang tidak diatur

Ini akan menyembunyikan semua modifikasi yang tidak Anda tambahkan:

git stash -k

Perhatikan bahwa file yang baru dibuat (dan tidak ditambahkan) akan tetap berada di direktori kerja Anda kecuali Anda juga menggunakan -usakelar.

git stash -k -u 

Juga, direktori kerja Anda harus bersih (yaitu semua perubahan perlu ditambahkan) ketika Anda git stash pop nanti.

http://makandracards.com/makandra/853-git-stash-unstaged-changes

Cory Danielson
sumber
13
Ini sama dengan git stash --keep-index. File bertahap disertakan dalam simpanan.
Benjamin Cheah