- Es wurde ein Verhalten unter macOS gemeldet, bei dem Änderungen im Projekt alle 10 Minuten automatisch gelöscht wurden.
- Die Untersuchung ergab, dass die Ursache nicht Claude Code war, sondern ein vom Nutzer erstelltes separates lokales Automatisierungstool, das über GitPython periodisch
git reset --hard origin/main ausführte.
- Weil beide dasselbe Arbeitsverzeichnis nutzten, sah es so aus, als sei Claude Code die Ursache; tatsächlich führte jedoch ein externes Skript den Reset aus.
- Das Claude-Code-Team stellte klar, dass es in der internen Codebasis keine Logik zum Ausführen dieses Befehls gibt, und erklärte, dass ein ähnliches Verhalten nur bei Verwendung der Option
--dangerously-skip-permissions möglich ist.
- Abschließend wurde festgestellt, dass es sich nicht um einen Bug in Claude Code, sondern um ein Problem mit einem Nutzertool handelte; der Titel wurde geändert und das Issue geschlossen.
Problembild und Umgebung
- Es wurde beobachtet, dass Claude Code im Projekt-Repository des Nutzers alle 10 Minuten
git fetch origin und git reset --hard origin/main ausführt.
- Dieses Verhalten löscht sämtliche nicht committeten Änderungen an verfolgten Dateien; nicht verfolgte Dateien bleiben erhalten.
- In einer Git-worktree-Umgebung tritt ein solcher Reset nicht auf.
- Umgebungsinformationen
- Claude-Code-Version: 2.1.87 (Homebrew-Cask, Bun-Binärdatei)
- OS: macOS 15.4 (Darwin 25.3.0, arm64)
- Shell: zsh
Untersuchungsverlauf
- Im Git-Reflog wurden mehr als 95 Einträge von
reset: moving to origin/main im Abstand von 10 Minuten protokolliert.
- Der Offset war je nach Sitzung unterschiedlich, innerhalb einer Sitzung wiederholte sich das Muster jedoch exakt alle 600 Sekunden.
- In einem Echtzeit-Reproduktionstest wurde eine verfolgte Datei (
api.ts) beim Reset auf den ursprünglichen Zustand zurückgesetzt, während eine nicht verfolgte Datei (.canary-test.txt) unverändert blieb.
- Bei der Überwachung des
.git/-Verzeichnisses mit fswatch wurde zum Zeitpunkt des Resets ein Muster erkannt, bei dem .git/refs und .git/logs/HEAD geändert wurden.
- Laut lsof war der Claude-Code-CLI-Prozess der einzige Prozess, der dieses Repository als CWD verwendete.
- Da keine externen Git-Prozesse erkannt wurden, wurde vermutet, dass die Ausführung intern über libgit2 oder Ähnliches erfolgte.
- In einer worktree-Umgebung blieben Reset-Einträge im Reflog vollständig aus.
Ausgeschlossene Ursachen
- Git-Hooks, Claude-Code-Benutzer-Hooks, Plugin-Updates, macOS-Cloud-Synchronisierung, Cron/LaunchAgents, IDEs, Time Machine und Dateiüberwachungstools wurden sämtlich als nicht ursächlich bestätigt.
- Jeder dieser Punkte wurde durch Prüfung der tatsächlichen Konfigurationsdateien und Prozesse ausgeschlossen.
Binäranalyse (teilweise)
- Ein Teil der Funktionen in der Claude-Code-Binärdatei enthält Codefragmente, die den Befehl
["fetch","origin"] ausführen.
- Es gibt eine Wrapper-Funktion für
git pull sowie Logik zur Verwaltung des fileHistory-Status, jedoch wurde kein Timer mit 10-Minuten-Intervall identifiziert.
Auswirkungen
- Nicht committete Änderungen wurden alle 10 Minuten automatisch gelöscht, sodass in einer zweistündigen Sitzung Änderungen mindestens dreimal verloren gingen.
- Wenn alle Änderungen bereits committet waren, hatte der Reset keine praktische Auswirkung, weshalb das Problem nur sporadisch sichtbar erschien.
Antwort des Claude-Code-Teams
- Jarred-Sumner erklärte ausdrücklich: „Claude Code selbst enthält keinen Code, der
git reset --hard origin/main ausführt.“
- Bei Verwendung der Option
--dangerously-skip-permissions kann Claude ohne Rückfrage Shell-Befehle ausführen;
wenn der Befehl /loop 10m <prompt> periodisch eine „Synchronisierung mit dem Remote“ anfordert, kann git fetch && git reset --hard origin/main ausgeführt werden.
- Als Prüfmethoden wurden genannt:
grep -r "reset --hard" ~/.claude/projects/ zum Durchsuchen der Sitzungslogs
claude --debug-file /tmp/debug.txt --dangerously-skip-permissions ausführen, 10 Minuten warten und dann grep -i bash /tmp/debug.txt | grep reset ausführen
- Die
fileHistory-Funktion von Claude Code hat nichts mit Git zu tun und ruft intern kein git reset auf.
Endgültige Schlussfolgerung
- In einem Update vom 30. März 2026 wurde bestätigt, dass die eigentliche Ursache des Problems nicht Claude Code, sondern ein separates lokales Tool des Nutzers war.
- Dieses Tool verwendete GitPython, um alle 10 Minuten einen Hard Reset auszuführen, und überwachte dabei dasselbe Verzeichnis wie Claude Code.
- Das Issue wurde mit dem Status „not planned“ geschlossen, und der Titel wurde von „Claude Code führt einen Reset aus“ in „Mein Automatisierungstool führt einen Reset aus“ geändert.
Vorläufige Workarounds
- Bei Verwendung von git worktree gibt es keine Auswirkungen durch den Reset.
- Durch häufiges Committen lassen sich Änderungen schützen.
Verwandte Issues
#8072 — Problem, bei dem Codeänderungen wiederholt zurückgesetzt werden
#7232 — Datenverlust durch Ausführung von git reset --hard ohne Freigabe
#32793 — Problem, bei dem der Befehl claude install die Git-Remote-URL falsch ändert (ähnlicher, aber separater Fall)
1 Kommentare
Hacker-News-Kommentare
Das ist ein Update vom Autor selbst.
Laut dem Issue-Link war die eigentliche Ursache des Problems nicht Claude Code, sondern ein Bug in einem vom Autor für lokale Tests gebauten Tool.
Dieses Tool führte bei jedem Zyklus einen Hard Reset aus, um das lokale Arbeitsverzeichnis mit dem Remote zu synchronisieren, und löschte dabei alle nicht committeten Änderungen.
Wenn man den Titel in etwa zu „Entwickler erstellt ein Skript, das alle 10 Minuten das Git-Repo zurücksetzt, vergisst es und gibt dann Claude Code die Schuld“ ändern würde, würde ich die Markierung zurücknehmen.
Das eigentliche Problem ist, dass der doppelte Bindestrich im Titel auf HN automatisch in einen en dash umgewandelt wurde.
Ich habe das Problem auch selbst untersucht, und in Claude Code selbst gibt es keinen Code, der
git reset --hard origin/mainausführt.Wahrscheinlich hat der Entwickler einen Befehl wie
/loop 10mlaufen lassen oder einen Cron-Job eingerichtet, der alle 10 Minuten Git zurücksetzt.Dass man Prozesse im Abstand von 0,1 Sekunden überwacht hat und dabei keinen Git-Prozess sah, ist schwer glaubwürdig.
Git-Befehle sind so schnell, dass man sie in diesem Intervall leicht verpasst.
Besser ist es,
gitim$PATHzu wrappen und jede Ausführung mitzuprotokollieren.Vielleicht wurde er sogar ohne Eingabe des Nutzers „agentisch“ eingereicht, aber das ist reine Spekulation.
Issue-Link
Dieser Beitrag kann dazu führen, dass ein Problem einer einzelnen Person als Problem des Gesamtsystems missverstanden wird.
Wahrscheinlich gab es eine gewisse Beschädigung des Kontexts.
Claude hat es mit
stash→sed-Ersetzung → Konflikt →reset --hardkaputtgemacht.Deshalb habe ich ganz oben in
CLAUDE.mdfolgende Warnung notiert:„Keine Massenersetzungen mit
sed,git push --force,git reset --hardund andere destruktive Git-Befehle strikt verboten.“Seitdem ist es deutlich besser geworden.
Wenn man einen Hook einbaut, der bestimmte Git-Befehle blockiert, funktioniert das sicher unabhängig von der Vorhersageunsicherheit des Modells.
Bei so etwas denke ich oft, dass viele die alten Grundprinzipien des Engineerings vergessen haben — deterministische und reproduzierbare Prozesse.
Ich hatte ein ähnliches Problem auch schon.
Normalerweise lasse ich claude-code in einer Sandbox (bwrap, srt) laufen, aber wenn ich es außerhalb starte, ruft es jedes Mal
ghauf, wenn ich/commandlösche oder ein Menü schließe.Ich nutze KeepassXC als Secret Manager, deshalb fällt es sofort auf, weil jedes Mal ein Freigabe-Popup erscheint.
Als ich Claude fragte, sagte es, die Ursache sei die Git-Context-Funktion.
Da KeepassXC keine sitzungsweite Freigabe erlaubt, wird dadurch jedes Mal erneut eine Authentifizierung verlangt.
Man sollte meinen, dass sich so etwas durch Berechtigungen verhindern lässt.
Aber der Nutzer hat es mit der Option
--dangerously-skip-permissionsausgeführt, also muss man mit unvorhersehbarem Verhalten rechnen.Man könnte es auch so lesen, dass sie sich per Prompt Injection umgehen lassen.
Regeln, die nicht einmal einen Hard Reset verhindern können, sind reine Show.
Wie der Autor selbst erklärte, war die Ursache nicht Claude Code, sondern ein Bug in einem selbst gebauten lokalen Test-Tool.
Issue-Link
Es ist nicht überraschend, dass man solche schwer zu debuggenden Probleme bekommt, wenn man ein SaaS-basiertes Binary-Blob-Entwicklungswerkzeug benutzt.
Am Ende hat der Nutzer die Ursache selbst herausgefunden, und sein eigenes Tool war der Auslöser.
So etwas gab es schon früher und gibt es auch heute noch.
Ich habe auch schon oft genug ganz ohne Hilfe eines LLM eigenhändig Schaden angerichtet.
Deshalb entwickle ich immer mit Time Machine auf dem Mac.
Wenn Claude eine Datei gelöscht hat und dann „Soll sie wiederhergestellt werden?“ erscheint, wirkt es fast so, als wäre Claude erleichtert.
Backups sind wirklich die Lebensader.