Jede Änderung umkehrbar machen
Rückgängig machen heißt bei einem Agenten, aufzuzeichnen, was jedes Schreiben ersetzt hat, damit sich die Dateien auf jeden früheren Schritt zurücksetzen lassen. Agenten irren sich in Schritt sieben, und der Fehler zeigt sich erst in Schritt neun.
Mit einem Änderungsprotokoll spulen Sie auf Schritt sechs zurück. Ohne eines lesen Sie ein Diff und raten.
Am Ende dieser Lektion
Notiz
Ich kann jede Änderung eines Laufs aufzeichnen, um die Dateien auf jeden Schritt zurückzuspulen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Schnappschuss | eine Kopie einer Datei, bevor sie sich ändert |
| Änderungsprotokoll | die Liste aller Änderungen, der Reihe nach |
| Schritt | eine nummerierte Aktion eines Laufs |
| Rückgängig | eine Datei wieder so machen, wie sie war |
| Zurückspulen | alle Änderungen nach einem gewählten Schritt rückgängig machen |
| Vorher-Text | was eine Datei vor einem Schreiben enthielt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Rückgängig ist nicht Fortsetzen
Ein Checkpoint sichert einen Lauf, damit er nach einem Stopp fortgesetzt werden kann. Das geht vorwärts. Rückgängig führt die Dateien rückwärts zu ihrem früheren Stand.
Beide führen verschiedene Aufzeichnungen. Ein Checkpoint hält den Zustand des Agenten. Ein Änderungsprotokoll hält, was jedes Schreiben ersetzt hat.
Den Vorher-Text protokollieren
Notieren Sie vor jedem Schreiben oder Löschen die Schrittnummer, den Pfad und was die Datei enthielt. Gab es sie nicht, notieren Sie auch das, als nichts.
Um bis Schritt n zurückzugehen, laufen Sie das Protokoll vom Ende bis Schritt n + 1 durch. Setzen Sie jeden Vorher-Text wieder ein. War das Vorher nichts, entfernen Sie die Datei. Den letzten zuerst, sonst werden zwei Änderungen an einer Datei in falscher Reihenfolge zurückgenommen.
Ein durchgerechnetes Beispiel: vier Schritte
| Schritt | Aktion | Vorher-Text |
|---|---|---|
| 1 | app.py schreiben | x = 1 |
| 2 | neu.py schreiben | nichts: es gab sie nicht |
| 3 | notizen.txt löschen | offen |
| 4 | app.py schreiben | x = 2 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele machen nur mit git rückgängig. Git geht aber nur bis zum letzten Commit zurück, nicht Schritt für Schritt, und eine neue Datei, die Git noch nicht verfolgt, bleibt dabei liegen. Führen Sie ein eigenes Protokoll jedes Schreibens.
Das Änderungsprotokoll schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const dateien = { \"app.py\": \"x = 1\", \"notizen.txt\": \"offen\" };' 'const ops = [' ' { op: \"schreiben\", pfad: \"app.py\", text: \"x = 2\" },' ' { op: \"schreiben\", pfad: \"neu.py\", text: \"y = 1\" },' ' { op: \"loeschen\", pfad: \"notizen.txt\" },' ' { op: \"schreiben\", pfad: \"app.py\", text: \"x = 3\" },' '];' 'function kopie(d) { return Object.assign({}, d); }' > rueckgaengig5.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Änderungsprotokoll schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Vor jeder Op notieren, was die Datei enthielt: ihren Text oder null, wenn es sie nicht gab.' 'function serieAnwenden(start, liste) {' ' const jetzt = kopie(start);' ' const protokoll = [];' ' liste.forEach(function (o, i) {' ' protokoll.push({ schritt: i + 1, pfad: o.pfad, vorher: o.pfad in jetzt ? jetzt[o.pfad] : null });' ' if (o.op === \"schreiben\") jetzt[o.pfad] = o.text;' ' else delete jetzt[o.pfad];' ' });' ' return { dateien: jetzt, protokoll: protokoll };' '}' >> rueckgaengig5.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Änderungsprotokoll schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Die Einträge nach einem Schritt rückgängig machen, den letzten zuerst.' 'function bisSchritt(aktuell, protokoll, schritt) {' ' const zurueck = kopie(aktuell);' ' for (const e of protokoll.slice().reverse()) {' ' if (e.schritt <= schritt) continue;' ' if (e.vorher === null) delete zurueck[e.pfad];' ' else zurueck[e.pfad] = e.vorher;' ' }' ' return zurueck;' '}' >> rueckgaengig5.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Änderungsprotokoll schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function zeigen(titel, d) { console.log(titel + \" \" + JSON.stringify(d)); }' 'const serie = serieAnwenden(dateien, ops);' 'zeigen(\"Anfang\", dateien);' 'zeigen(\"nach 4 Schritten\", serie.dateien);' 'zeigen(\"zurück bis 3\", bisSchritt(serie.dateien, serie.protokoll, 3));' 'zeigen(\"zurück bis 1\", bisSchritt(serie.dateien, serie.protokoll, 1));' 'zeigen(\"zurück bis 0\", bisSchritt(serie.dateien, serie.protokoll, 0));' 'console.log(\"Protokoll: \" + serie.protokoll.map(function (e) { return e.schritt + \":\" + e.pfad; }).join(\" \"));' >> rueckgaengig5.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ausführen und zurückspulen
docker exec -w /home/node/project agent node rueckgaengig5.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Dateien sind hier ein Dictionary
Die Dateien liegen in einem Dictionary im Skript, auf der Festplatte ändert sich also nichts. Ein echtes Harness schreibt echte Dateien und hält das Protokoll in einer eigenen Datei oder einem eigenen Speicher.
Der Run ruft kein Modell auf, braucht also keine Hilfe und hat nichts zu ersetzen.
Ausgabe des Runs
| Zeile | Was sie zeigt |
|---|---|
| Anfang {"app.py":"x = 1","notizen.txt":"offen"} | Die Dateien vor der Serie |
| nach 4 Schritten {"app.py":"x = 3","neu.py":"y = 1"} | Die Serie schrieb, fügte hinzu und löschte |
| zurück bis 3 {"app.py":"x = 2","neu.py":"y = 1"} | Nur Schritt 4 wurde zurückgenommen |
| zurück bis 1 {"app.py":"x = 2","notizen.txt":"offen"} | Die Schritte 2 bis 4 wurden zurückgenommen |
| zurück bis 0 ... | Die Dateien wie am Anfang |
| Protokoll: 1:app.py 2:neu.py 3:notizen.txt 4:app.py | Ein Eintrag je Schritt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.