Bagaimana Anda menyimpan file yang tidak terlacak?


1437

Saya memiliki perubahan pada file, plus file baru, dan ingin menggunakan simpanan git untuk menyimpannya sementara saya beralih ke tugas lain. Tapi git simpanan dengan sendirinya menyimpan hanya perubahan ke file yang ada; file baru tetap di pohon kerja saya, mengacaukan pekerjaan masa depan saya. Bagaimana cara menyimpan file yang tidak terlacak ini?


27
Ketahuilah bahwa jika Anda hanya memiliki file yang tidak terlacak di simpanan Anda, itu akan terlihat seperti file kosong, karena git stash showtidak menghasilkan apa-apa dan Anda mungkin tergoda untuk menjatuhkannya (seperti yang baru saja saya lakukan saat berisi skrip berguna yang saya tulis beberapa bulan lalu) → cara memulihkan simpanan yang jatuh )
Maxime R.

Jawaban:


1925

Untuk menyimpan direktori kerja Anda termasuk file yang tidak dilacak (terutama yang ada di .gitignore) maka Anda mungkin ingin menggunakan cmd ini:

git stash --include-untracked

Keterangan lebih lanjut:

Pembaruan 17 Mei 2018:

Versi baru git sekarang memiliki git stash --allsimpanan semua file, termasuk file yang tidak dilacak dan diabaikan.
git stash --include-untrackedtidak lagi menyentuh file yang diabaikan (diuji pada git 2.16.2).

Jawaban asli di bawah ini:

Peringatan, melakukan ini akan menghapus file Anda secara permanen jika Anda memiliki entri direktori / * di file gitignore Anda.

Pada versi 1.7.7 Anda dapat menggunakan git stash --include-untrackedatau git stash save -uuntuk menyimpan file yang tidak terlacak tanpa mementaskannya.

Tambahkan ( git add) file dan mulai lacak. Lalu simpanan. Karena seluruh konten file baru, mereka akan disimpan, dan Anda dapat memanipulasi seperlunya.


4
Mengapa simpanan masih simpanan mengubah file yang ada meskipun perubahan itu belum dipentaskan?
Alan Christensen

6
@ alan-christensen Baca DESKRIPSI dari kernel.org/pub/software/scm/git/docs/git-stash.html . Intinya adalah memiliki pohon yang bekerja bersih setelah menyimpan.
Kelvin

3
@Kelvin apa yang saya maksudkan di komentar saya adalah bahwa ia tidak menyimpan file baru kecuali mereka telah dipentaskan tetapi menyimpan file yang ada bahkan jika mereka belum dipentaskan. Sepertinya tidak konsisten dengan saya.
Alan Christensen

11
@AlanChristensen intinya adalah untuk menyembunyikan hal-hal yang mungkin ditimpa dengan checkout dari cabang yang berbeda.
jwg

3
Karena Anda memiliki jawaban teratas di sini, saya akan meminta Anda mendaftar git stash --include-untrackedsebelumnya git stash --alldalam jawaban Anda karena dua alasan. Pertama itu menjawab pertanyaan OP lebih baik sekarang di 2019 dan kedua karena --semua melakukan sesuatu yang sebagian besar pengguna mungkin tidak inginkan karena itu menghapus semua file yang .gitignored
Daniel Flippance

411

Pada git 1.7.7, git stashmenerima --include-untrackedopsi (atau short-hand -u). Untuk memasukkan file yang tidak terlacak dalam simpanan Anda, gunakan salah satu dari perintah berikut:

git stash --include-untracked
git stash -u

Peringatan, melakukan ini akan menghapus file Anda secara permanen jika Anda memiliki entri direktori / * di file gitignore Anda.


15
Keren - akhirnya berfungsi seperti yang dijelaskan di halaman manual. Tidak menyembunyikan (dan membersihkan) file baru adalah perilaku yang rusak.
Steve Bennett

1
git versi saya adalah 1.9.1 dan bahkan jika apa yang saya miliki .gitignoreterlihat seperti ini ignoredDirectorydan bukan ignoredDirectory/*itu masih menghapus yang tidak terlacak. Bahkan file yang tidak terlacak bukan hanya direktori.
theUnknown777

22
Bisakah Anda jelaskan peringatannya? Mengapa itu menghapus file-file itu? Apakah itu menghapusnya dan tidak menyembunyikannya? Saya telah menggunakan Git untuk sementara waktu dan belum mengalami masalah ini.
Aleksandr Dubinsky

Apakah peringatan juga berlaku untuk *.extensionentri?
arekolek

3
@ aleksandr-dubinsky, @arekolek - git1.8.3 -u( --include-untracked) opsi dapat menyimpan dan mem-pop git stash showfile yang tidak di-
crack

77

Tambahkan file ke indeks:

git add path/to/untracked-file
git stash

Seluruh isi indeks, ditambah setiap perubahan yang tidak dipentaskan ke file yang ada, semua akan membuatnya menjadi simpanan.


Bagaimana jika Anda tidak ingin menyembunyikan perubahan yang sudah ada dalam indeks? Apakah menyimpan file baru masih dimungkinkan?
allyourcode

Komit indeks, simpanan file baru, lalu pulihkan komit dan / atau periksa file dari komit. Ini adalah solusi kludgy, tetapi harus berhasil.
Gdalya

git add .tidak mempertimbangkannya untuk beberapa alasan
TheBilTheory

53

Dalam git bash, menyimpan file yang tidak terpecahkan dicapai dengan menggunakan perintah

git stash --include-untracked

atau

git stash -u

http://git-scm.com/docs/git-stash

git stash menghapus semua file yang tidak terlacak atau tidak dikomit dari ruang kerja Anda. Dan Anda dapat mengembalikan git simpanan dengan menggunakan perintah berikut

git stash pop

Ini akan menempatkan file kembali di ruang kerja lokal Anda.

Pengalaman saya

Saya harus melakukan modifikasi pada file gitIgnore saya untuk menghindari perpindahan file .class dan .project ke repo jarak jauh. Saya tidak diizinkan untuk memindahkan .gitIgnore yang dimodifikasi ini di repo jarak jauh seperti sekarang.

File .classpath dan .project penting untuk eclipse - yang merupakan editor java saya.

Saya pertama-tama secara selektif menambahkan sisa file saya dan berkomitmen untuk pementasan. Namun, dorongan terakhir tidak dapat dilakukan kecuali file .gitIgnore yang dimodifikasi dan file yang tidak dilacak yaitu. .project dan .classpath tidak disimpan.

Saya menggunakan

 git stash 

untuk menyimpan file .gitIgnore yang dimodifikasi.

Untuk menyimpan file .classpath dan .project, saya menggunakan

git stash --include-untracked

dan itu menghapus file dari ruang kerja saya. Tidak adanya file-file ini menghilangkan kemampuan saya bekerja di lokasi kerja saya di gerhana. Saya melanjutkan dengan menyelesaikan prosedur untuk mendorong file yang dikomit ke remote. Setelah ini berhasil dilakukan, saya menggunakan

git stash pop

Ini menempel file yang sama kembali di ruang kerja saya. Ini memberi saya kembali kemampuan saya untuk bekerja pada proyek yang sama dalam gerhana. Semoga ini menepis kesalahpahaman.


2
Mengapa Anda tidak menggunakan global gitignore untuk file IDE? Yaitu. gunakan ~/.gitignore.
Antti Pihlaja

20

Seperti yang telah dikatakan di tempat lain, jawabannya adalah ke git addfile. misalnya:

git add path/to/untracked-file
git stash

Namun, pertanyaannya juga muncul di jawaban lain: Bagaimana jika Anda tidak benar-benar ingin menambahkan file? Sejauh yang saya tahu, Anda harus. Dan berikut ini TIDAK akan bekerja:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

ini akan gagal, sebagai berikut:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Jadi, apa yang bisa kamu lakukan? Nah, Anda harus benar-benar menambahkan file, namun , Anda dapat secara efektif membatalkannya nanti, dengan git rm --cached:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

Dan kemudian Anda dapat terus bekerja, dalam kondisi yang sama seperti sebelumnya git add(dengan file yang tidak terpantau disebut path/to/untracked-file; ditambah perubahan lain yang mungkin harus dilacak file).

Kemungkinan lain untuk alur kerja tentang ini adalah sesuatu seperti:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[Catatan: Seperti disebutkan dalam komentar dari @mancocapac, Anda mungkin ingin menambahkan --exclude-standardke git ls-filesperintah (jadi, git ls-files -o --exclude-standard).]

... yang juga dapat dengan mudah ditulis - bahkan alias akan melakukannya (disajikan dalam sintaks zsh; sesuaikan sesuai kebutuhan) [juga, saya mempersingkat nama file sehingga semuanya cocok di layar tanpa menggulirkan jawaban ini; jangan ragu untuk mengganti nama file alternatif yang Anda pilih]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

Perhatikan bahwa yang terakhir mungkin lebih baik sebagai skrip atau fungsi shell, untuk memungkinkan parameter diberikan git stash, jika Anda tidak ingin poptetapi apply, dan / atau ingin dapat menentukan simpanan tertentu, daripada hanya mengambil bagian atas satu. Mungkin ini (bukannya alias kedua, di atas) [spasi kosong dilucuti agar pas tanpa menggulir; tambahkan kembali untuk peningkatan keterbacaan]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Catatan : Dalam formulir ini, Anda perlu memberikan argumen tindakan serta pengidentifikasi jika Anda akan memberikan pengidentifikasi simpanan, misalnya unstashall apply stash@{1}atauunstashall pop stash@{1}

Yang tentu saja Anda masukkan ke dalam .zshrcatau setara untuk membuat ada jangka panjang.

Semoga jawaban ini bermanfaat bagi seseorang, menyatukan semuanya dalam satu jawaban.


1
git ls-files -o menunjukkan lebih banyak file daripada yang saya minati. Dari status git berikut, saya menemukan penambahan --exclude-standard works. git ls-files -o --exclude-standard. Menurut saya, ini hanya "termasuk" file-file tak terpecahkan yang biasanya tidak Anda abaikan, yaitu hanya menampilkan file-file yang tidak
ditelusur

20

Pada git versi 2.8.1: berikut ini berfungsi untuk saya.

Untuk menyimpan file yang dimodifikasi dan tidak terlacak dalam simpanan tanpa nama

git stash save -u

Untuk menyimpan file yang dimodifikasi dan tidak dilacak di simpanan dengan nama

git stash save -u <name_of_stash>

Anda dapat menggunakan sembulan atau melamar nanti sebagai berikut.

git stash pop

git stash apply stash@{0}

Ini tidak menghapus file yang tidak dilacak dari komputer saya, meskipun mereka tidak lagi terdaftar sebagai file yang tidak dilacak. git stash showtidak menunjukkannya. Ketika saya mencoba git stash apply, saya mendapat "kesalahan: tidak dapat mengembalikan file yang tidak terlacak dari simpanan". Namun, file-file itu sekali lagi terdaftar sebagai tidak terlacak, tetapi perubahan pada file yang dilacak tidak dikembalikan. Saya pikir file-file itu dapat dipulihkan secara individual dengan memeriksanya dari simpanan, tetapi solusi ini bukan yang saya harapkan.
hBrent

9

Saya dapat menyimpan hanya file yang tidak terlacak dengan melakukan:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

Yang terakhir muncul sebagai simpanan file yang dilacak, sehingga hanya menyisakan file yang tidak terlacak.


git stash save -utidak hanya menyimpan untrackedfile, tetapi juga menyimpan trackeddan untracked. Saya pikir penyelamatan pertama yang Anda lakukan tidak perlu dalam kasus ini. Ada diagram yang baik di atlassian.com/git/tutorials/saving-changes/...
Drenai

2
Pertanyaannya adalah bagaimana menyimpan hanya file yang tidak terlacak. Jika Anda melewatkan simpanan pertama, lalu apa yang akan Anda lepas? Idenya adalah untuk: 1) Stash dilacak. 2) Stash tidak terlacak. 3) Pop dilacak. Hasil: Sisa-sisa yang tidak dilacak disimpan.
Oded

3

Jika Anda ingin menyimpan file yang tidak dilacak, tetapi simpan file yang diindeks (yang akan Anda komit misalnya), tambahkan saja -k(simpan indeks) opsi ke-u

git stash -u -k


2

misalkan file yang baru dan tidak terlacak ini disebut: "views.json". jika Anda ingin mengubah cabang dengan menyembunyikan status aplikasi Anda, saya biasanya mengetik:

git add views.json

Kemudian:

git stash

Dan itu akan disimpan. Maka saya bisa mengganti cabang dengan

git checkout other-nice-branch

1

Ada beberapa jawaban yang benar di sini, tetapi saya ingin menunjukkan bahwa untuk seluruh direktori baru, TIDAK'git add path' akan berfungsi. Jadi jika Anda memiliki banyak file baru di jalur yang tidak dilacak dan lakukan ini:

git add untracked-path
git stash "temp stash"

ini akan disimpan dengan pesan berikut:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

dan jika jalur yang tidak dilacak adalah satu-satunya jalan yang Anda tempel, simpanan "temp temp" akan menjadi simpanan kosong. Cara yang benar adalah menambahkan seluruh path, bukan hanya nama direktori (mis. Akhiri path dengan '/'):

git add untracked-path/
git stash "temp stash"

Setidaknya di sistem saya anggapan Anda salah. Ini bekerja tanpa garis miring! Direktori kosong tetap diabaikan. (macos git 2.6.2)
phobie

0

Saya pikir ini bisa diselesaikan dengan memberi tahu git bahwa file itu ada, daripada melakukan semua konten ke area pementasan, dan kemudian memanggil git stash . Araqnid menjelaskan bagaimana melakukan yang pertama.

git add --intent-to-add path/to/untracked-file

atau

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

Namun, yang terakhir tidak berfungsi:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

1
Sejauh yang saya tahu, yang pertama tidak bekerja juga. Lihat jawaban saya untuk solusi untuk masalah ini.
lindes

0
git stash --include-untracked

favorit saya karena menyimpan juga file yang telah Anda tambahkan dan belum dipentaskan.


0

Saya mengalami masalah yang sama saat menggunakan Sourcetree dengan file yang baru dibuat (mereka juga tidak akan dimasukkan dalam simpanan).

Ketika saya pertama kali memilih 'panggung semua' dan kemudian menyimpan komponen yang baru ditambahkan di mana dilacak dan karena itu termasuk dalam simpanan.


Pertanyaan ini berumur 11 tahun dan sudah memiliki 14 jawaban. Sudahkah Anda membacanya sebelum memposting?
Mickael B.

-7

Saya biasa merenungkan dan menginginkan fitur yang sama. Tapi seiring waktu, saya perhatikan itu benar-benar tidak diperlukan. Ketika Anda menyimpan, tidak apa-apa untuk meninggalkan file baru. Tidak ada yang "buruk" dapat terjadi pada mereka (ketika Anda memeriksa sesuatu yang lain, git akan kesalahan dan tidak menimpa file yang tidak terlacak yang ada)

Dan karena biasanya kerangka waktu antara git stashdan git stash popagak kecil, Anda akan memerlukan file yang tidak terlacak dengan cepat lagi. Jadi saya akan mengatakan ketidaknyamanan file muncul di git statussaat Anda sedang mengerjakan sesuatu yang lain (antara git stashdan git stash pop) lebih kecil maka ketidaknyamanan yang disebabkan oleh pekerjaan dan membutuhkan perhatian yang seharusnya biaya untuk mencoba untuk menambahkan file tidak terlacak ke simpanan Anda.


15
Itu tergantung pada proyeknya. Katakanlah file yang tidak dilacak adalah uji unit (setengah tertulis), dan harness pengujian menjalankan semua tes unit dalam direktori. Dll
Steve Bennett

1
Contoh lain adalah jika Anda bekerja pada dua komputer, dan Anda diizinkan untuk memindahkan data dari A ke B, tetapi tidak dari B ke A. Jika Anda membuat potongan kode baru untuk memecahkan masalah yang pertama kali terjadi pada B tetapi Anda inginkan pada A dan B, Anda ingin dapat menyimpan file pada B sehingga ketika Anda membuat kembali file itu pada A dan kemudian membawanya dalam sebuah bundel, Anda dapat git diff versi simpanan untuk memverifikasi bahwa Anda tidak Membuat kesalahan.
Gdalya

7
Hanya karena file tidak dilacak di satu cabang, tidak berarti itu tidak akan bertentangan dengan file yang dilacak di cabang lain.
jwg

3
contoh-contoh sederhana: File konfigurasi dalam direktori .conf.d, atau lainnya yang hanya dengan berada di sana memodifikasi perilaku perangkat lunak.
fotanus

Tentu saja fungsionalitasnya dibutuhkan. Ini, sebagai contoh tambahan, tidak mungkin untuk beralih dari satu cabang ke cabang lain jika Anda memiliki file yang tidak terlacak secara lokal yang ingin Anda simpan.
Demitrian
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.