git reset --hard HEAD hinterlässt nicht verfolgte Dateien

584

Wenn ich renne git reset --hard HEAD, soll es auf eine makellose Version von dem zurückgesetzt werden, was Sie gezogen haben, so wie ich es verstehe. Leider bleiben Dateien herumliegen, da git statuseine große Liste von nicht verfolgten Dateien angezeigt wird.

Wie sagst du git "Bring es einfach auf genau das zurück, was im letzten Zug war, nicht mehr und nicht weniger"?

Karl
quelle
44
git reset --hardSetzt Ihren Index zurück und setzt die verfolgten Dateien auf den Status in HEAD zurück. Es bleiben nicht verfolgte Dateien allein.
Fifigyuri

Antworten:

904

Sie müssen verwenden git clean -f -d, um nicht verfolgte Dateien und Verzeichnisse in Ihrer Arbeitskopie zu entfernen.

Wenn Sie das gesamte Repository einschließlich aller Git-Submodule auf Master zurücksetzen müssen, führen Sie dieses Skript aus:

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status
stricken
quelle
56
Auch -xwenn Sie Ihre .gitignored-Dateien entfernen und in einen makellosen Zustand zurückkehren möchten.
jtdubs
44
-nZum Test hinzufügen würde zuerst entfernt werden. Kombinieren Sie alle in einem Argument:-dfn
HyBRiD
31
Mein gemeinsamer Befehl ist git clean -qfdxhier. Entfernen Sie alles und tun Sie es leise.
Aragaer
3
-d -fzweimal decalred werden kann -dfffür -d -f -fdieses ALL untracked Verzeichnisse löschen, einschließlich geschützt untracked Verzeichnisse.
ThorSummoner
3
@ BKSpurgeon: Ja, es löscht Dateien. Was meinst du mit »Ich möchte nicht verfolgte Dateien wie zuvor«? Git weiß nichts über nicht verfolgte Dateien, außer dass sie existieren. Es ist nicht möglich, mehrere Versionen dieser Dateien verfolgen (da sie nicht verfolgt ).
Knittl
60

Wenn Sie Dateien haben, die Sie trotzdem behalten möchten:

git clean -di führt eine interaktive Bereinigung durch, bei der Sie nur die Dateien / Verzeichnisse löschen können, die Sie nicht mehr möchten.

Sogger
quelle
48
git reset --hard && git clean -dfx

oder zsh bietet einen 'gpristine'-Alias:

alias gpristine='git reset --hard && git clean -dfx'

Welches ist wirklich praktisch.

Wenn Sie an einem gegabelten Repo arbeiten, stellen Sie sicher, dass Sie das richtige Repo / den richtigen Zweig abrufen und zurücksetzen, zum Beispiel:

git fetch upstream && git reset --hard upstream/master && git clean -df
jjnevis
quelle
8
Entschuldigung, wenn dies kein sicherer Befehl ist - ich habe nicht versucht, sicher zu sein, ich habe versucht, die Frage zu beantworten. Könnten Sie kommentieren, ob dies die Frage beantwortet?
jjnevis
3
Dies funktioniert gut und sollte IMHO in Git eingebaut werden (obwohl ich nicht sicher bin, ob ich -x routinemäßig verwenden würde). So oft arbeite ich an einem lokalen Projekt, das noch nicht mit Github usw. synchronisiert ist, und ein unordentlicher Refactor geht über den IDE-Status "Rückgängig" hinaus. Mein Instinkt ist es, zum letzten Commit zurückzukehren, aber das Googeln erfordert normalerweise Antworten für das vorletzte Commit, nicht für das letzte Commit. Ich möchte nur zum letzten Commit zurückkehren. Das macht das. Sollte allerdings ein einfacher Weg sein. Danke Linus! ;-)
Dell Anderson
5
Es ist gefährlich, weil es auch ignorierte Dateien mit -xdergleichen löscht, wenn Sie gerade das Repo geklont hätten. Wenn Sie das wollen, ist es perfekt. Wenn Sie nur löschen wollen untracked Dateien, die das Entfernen -xfunktioniert Option gut.
Emile Bergeron
2
Gott sei Dank fürgpristine
Snowcrash
2
und löscht Intellij-Einstellungen;)
Kalpesh Soni
17

Benutzerinteraktiver Ansatz:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i für interaktiv
-f für force
-d für Verzeichnis
-x für ignorierte Dateien (bei Bedarf hinzufügen)

Hinweis: Fügen Sie -n oder --dry-run hinzu, um zu überprüfen, was es tun wird.

bit_cracker007
quelle
4

Sie können verwenden git stash. Sie müssen angeben --include-untracked, sonst erhalten Sie das ursprüngliche Problem.

git stash --include-untracked

Dann legen Sie einfach den letzten Eintrag im Vorrat ab

git stash drop

Sie können dafür einen praktischen Dandy-Alias ​​erstellen und ihn git wipebeispielsweise aufrufen :

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"
Nikola Diklic
quelle
2

Der Befehl, den Sie suchen, ist git clean

Jagriti Kumari
quelle
4
Fügen Sie beim nächsten Mal bitte etwas mehr Beschreibungen / Beispiele usw. hinzu. Was auch immer dem Benutzer hilft, zu verstehen, was es tut und in diesem Fall welche Parameter verwendet werden sollen.
Rugk
1

git-clean Verwenden Sie diese Option, um nicht verfolgte Dateien im Arbeitsbaum zu entfernen. Im Folgenden finden Sie einige Optionen (kurz), die mit dem git cleanBefehl verwendet werden können.

-dVerwenden Sie diese Option, wenn kein Pfad angegeben ist. Git-Rekurs in nicht verfolgte Verzeichnisse entfernen Sie sie.

-f/--force So entfernen Sie verschachtelte nicht verfolgte Dateien.

-i/--interactive Zeigen Sie, was getan werden würde, und bereinigen Sie Dateien interaktiv.

-n/--dry-run Zeigen Sie, was passieren wird, ohne etwas zu entfernen.

-x Dateien ignorieren

Beispiel: git clean -f -d-> Entfernen Sie alle nicht verfolgten Dateien im aktuellen Verzeichnis und alle Unterverzeichnisse.

Yuresh Karunanayake
quelle
-16

Möglicherweise haben Sie irgendwann einen Soft-Reset durchgeführt. Sie können dieses Problem lösen, indem Sie dies tun

git add .
git reset --hard HEAD~100
git pull
user3780587
quelle
7
Ich glaube nicht, dass OP dies wollte. Jede der anderen Antworten zeigt viel besser, wie dies behoben werden kann.
Avery
1
Dies kann auch langsam sein, wenn Sie viele Dateien hinzufügen müssen.
Devin G Rhode
4
völlig unabhängig.
Azeem Hassni
1
Dabei werden die nicht verfolgten Dateien entfernt. Aber als Programmierer sollte jeder versuchen, die richtige Lösung für Probleme zu finden, ohne Problemumgehungen und ein Lächeln zu verwenden.
Yuresh Karunanayake