CẬP NHẬT : Với Git 2.23 (tháng 8 năm 2019), có một lệnh mới
git restore
thực hiện điều này, hãy xem câu trả lời được chấp nhận .CẬP NHẬT : Điều này sẽ hoạt động trực quan hơn kể từ Git 1.8.3, xem câu trả lời của riêng tôi .
Hãy tưởng tượng trường hợp sử dụng sau: Tôi muốn loại bỏ tất cả các thay đổi trong một thư mục con cụ thể của cây làm việc Git của tôi, để lại tất cả các thư mục con khác.
Tôi có thể làm
git checkout .
, nhưng kiểm tra git. thêm thư mục loại trừ bởi thanh toán thưa thớtCó
git reset --hard
, nhưng nó sẽ không cho phép tôi làm điều đó cho một thư mục con:> git reset --hard . fatal: Cannot do hard reset with paths.
Một lần nữa: Tại sao git không thể thiết lập lại cứng / mềm theo đường dẫn?
Tôi có thể đảo ngược tình trạng hiện tại bằng cách sử dụng
git diff subdir | patch -p1 -R
, nhưng đây là một cách khá kỳ lạ để làm điều này.
Lệnh Git thích hợp cho hoạt động này là gì?
Kịch bản dưới đây minh họa vấn đề. Chèn lệnh thích hợp bên dưới How to make files
nhận xét - lệnh hiện tại sẽ khôi phục tệp a/c/ac
được cho là bị loại trừ bởi kiểm tra thưa thớt. Lưu ý rằng tôi không muốn khôi phục rõ ràng a/a
và a/b
tôi chỉ "biết" a
và muốn khôi phục mọi thứ bên dưới. EDIT : Và tôi cũng không "biết" b
, hoặc những thư mục khác nằm cùng cấp với 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
không chấp nhận đối số đường dẫn ...
git stash && git stash drop
cái gì