UPDATE² : Mit Git 2.23 (August 2019) gibt es einen neuen Befehl
git restore
, der dies tut, siehe die akzeptierte Antwort .UPDATE : Dies wird ab Git 1.8.3 intuitiver funktionieren, siehe meine eigene Antwort .
Stellen Sie sich den folgenden Anwendungsfall vor: Ich möchte alle Änderungen in einem bestimmten Unterverzeichnis meines Git-Arbeitsbaums entfernen und alle anderen Unterverzeichnisse intakt lassen.
Ich kann
git checkout .
, aber git checkout. Fügt Verzeichnisse hinzu, die durch spärliches Auschecken ausgeschlossen sindEs gibt
git reset --hard
, aber ich kann es nicht für ein Unterverzeichnis tun:> git reset --hard . fatal: Cannot do hard reset with paths.
Nochmals: Warum kann git keine Hard / Soft-Resets nach Pfad durchführen?
Ich kann den aktuellen Status mithilfe von umgekehrt patchen
git diff subdir | patch -p1 -R
, aber dies ist eine ziemlich seltsame Art, dies zu tun.
Was ist der richtige Git-Befehl für diese Operation?
Das folgende Skript veranschaulicht das Problem. Fügen Sie den richtigen Befehl unter dem How to make files
Kommentar ein. Der aktuelle Befehl stellt die Datei wieder her, a/c/ac
die beim Auschecken mit geringer Dichte ausgeschlossen werden soll. Beachten Sie, dass ich nicht explizit wiederherstellen möchte a/a
und a/b
ich nur "weiß" a
und alles unten wiederherstellen möchte. EDIT : Und ich "weiß" auch nicht b
, oder welche anderen Verzeichnisse sich auf der gleichen Ebene befinden wie 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
akzeptiert kein
git stash && git stash drop
?