UPDATE² : Dengan Git 2.23 (Agustus 2019), ada perintah baru
git restore
yang melakukan ini, lihat jawaban yang diterima .UPDATE : Ini akan bekerja lebih intuitif pada Git 1.8.3, lihat jawaban saya sendiri .
Bayangkan use case berikut ini: Saya ingin menyingkirkan semua perubahan dalam subdirektori tertentu dari pohon kerja Git saya, membiarkan semua subdirektori lainnya tetap utuh.
Saya bisa melakukannya
git checkout .
, tetapi git checkout. menambahkan direktori yang dikecualikan oleh checkout jarangMemang ada
git reset --hard
, tetapi itu tidak akan membiarkan saya melakukannya untuk subdirektori:> git reset --hard . fatal: Cannot do hard reset with paths.
Lagi: Mengapa git tidak bisa melakukan hard / soft reset dengan jalan?
Saya dapat membalik-tambalan kondisi saat ini menggunakan
git diff subdir | patch -p1 -R
, tetapi ini adalah cara yang agak aneh untuk melakukan ini.
Apa perintah Git yang tepat untuk operasi ini?
Script di bawah ini menggambarkan masalah. Masukkan perintah yang tepat di bawah How to make files
komentar - perintah saat ini akan mengembalikan file a/c/ac
yang seharusnya dikecualikan oleh checkout jarang. Perhatikan bahwa saya tidak ingin mengembalikan secara eksplisit a/a
dan a/b
, saya hanya "tahu" a
dan ingin mengembalikan semuanya di bawah. EDIT : Dan saya juga tidak "tahu" b
, atau direktori lain yang berada pada tingkat yang sama dengan a
.
#!/bin/sh
rm -rf repo; git init repo; cd repo
for f in a b; do
for g in a b c; do
mkdir -p $f/$g
touch $f/$g/$f$g
git add $f/$g
git commit -m "added $f/$g"
done
done
git config core.sparsecheckout true
echo a/a > .git/info/sparse-checkout
echo a/b >> .git/info/sparse-checkout
echo b/a >> .git/info/sparse-checkout
git read-tree -m -u HEAD
echo "After read-tree:"
find * -type f
rm a/a/aa
rm a/b/ab
echo >> b/a/ba
echo "After modifying:"
find * -type f
git status
# How to make files a/* reappear without changing b and without recreating a/c?
git checkout -- a
echo "After checkout:"
git status
find * -type f
git checkout -- /path/to/subdir/
?
git stash
tidak menerima argumen jalur ...
git stash && git stash drop
?