UPDATE² : ด้วย Git 2.23 (สิงหาคม 2019) มีคำสั่งใหม่
git restore
ที่ไม่นี้ให้ดูที่คำตอบที่ได้รับการยอมรับUPDATE : นี้จะทำงานขึ้นอย่างสังหรณ์ใจเป็นของ Git 1.8.3 ดูคำตอบของฉันเอง
ลองนึกภาพกรณีการใช้งานต่อไปนี้: ฉันต้องการกำจัดการเปลี่ยนแปลงทั้งหมดในไดเรกทอรีย่อยที่เฉพาะเจาะจงของแผนผังการทำงาน Git ของฉันโดยปล่อยให้ไดเรกทอรีย่อยอื่น ๆ ไม่เสียหาย
ฉันสามารถทำได้
git checkout .
แต่เช็คเอาต์คอมไพล์ เพิ่มไดเรกทอรีที่ไม่รวมด้วยการชำระเงินแบบเบาบางมี
git reset --hard
แต่มันจะไม่ให้ฉันทำเพื่อไดเรกทอรีย่อย:> git reset --hard . fatal: Cannot do hard reset with paths.
อีกครั้ง: เหตุใด git จึงไม่สามารถทำการฮาร์ด / รีเซ็ทตามเส้นทางได้
ฉันสามารถย้อนกลับแก้ไขสถานะปัจจุบันโดยใช้
git diff subdir | patch -p1 -R
แต่นี่เป็นวิธีที่ค่อนข้างแปลกในการทำเช่นนี้
คำสั่ง Git ที่เหมาะสมสำหรับการดำเนินการนี้คืออะไร?
สคริปต์ด้านล่างแสดงปัญหา แทรกคำสั่งที่เหมาะสมด้านล่างHow to make files
ความคิดเห็น - คำสั่งปัจจุบันจะคืนค่าไฟล์a/c/ac
ที่ควรจะแยกออกจากเช็คเอาต์กระจัดกระจาย โปรดทราบว่าฉันไม่ต้องการกู้คืนอย่างชัดเจนa/a
และa/b
ฉันเพียง "รู้" a
และต้องการคืนค่าทุกอย่างด้านล่าง แก้ไข : และฉันยังไม่ "รู้" b
หรือที่ไดเรกทอรีอื่น ๆ 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
ไม่ยอมรับอาร์กิวเมนต์พา ธ ...
git stash && git stash drop
อะไร