Wie kann ich einen abgelegten Vorrat in Git wiederherstellen?


1737

Ich verwende git stashund git stash popspeichere häufig Änderungen in meinem Arbeitsbaum und speichere sie. Gestern hatte ich einige Änderungen an meinem Arbeitsbaum, die ich versteckt und geknallt hatte, und dann habe ich weitere Änderungen an meinem Arbeitsbaum vorgenommen. Ich würde gerne zurückgehen und die gestrigen Änderungen überprüfen, aber git stash popanscheinend alle Verweise auf das zugehörige Commit entfernen.

Ich weiß, wenn ich git stashdann .git / refs / Stash enthält die Referenz des verwendeten commit das Versteck zu erstellen. Und .git / logs / refs / stash enthält den gesamten Stash. Aber diese Referenzen sind weg git stash pop. Ich weiß, dass sich das Commit noch irgendwo in meinem Repository befindet, aber ich weiß nicht, was es war.

Gibt es eine einfache Möglichkeit, die gestrige Stash-Commit-Referenz wiederherzustellen?

Beachten Sie, dass dies für mich heute nicht kritisch ist, da ich tägliche Backups habe und zum gestrigen Arbeitsbaum zurückkehren kann, um meine Änderungen zu erhalten. Ich frage, weil es einen einfacheren Weg geben muss!


74
Hinweis für die Zukunft: Wenn Sie Ihre Vorräte nicht jedes Mal verlieren möchten git stash pop, können Sie dies git stash applystattdessen tun . Es macht dasselbe, außer dass es den Verweis auf den angewendeten Stash nicht entfernt.
Kevin

3
Versuchte alles hier, konnte kein Versteck finden, das bereits geknallt worden war. Ich
Juan Mendes


Ich hatte dieses Problem. Zu meinem Repo zu aktualisieren, lief ich git stash, git pull -r upstream, git push -f origin, git stash pop, und Pop sagte : "fatal: log für refs / Stash ist leer". 😲 Ich habe einige dieser Antworten ausprobiert, nichts hat funktioniert. Als ich in .git / refs / stash nachgesehen habe , war der SHA da drin . Möglicherweise ein Problem beim Markieren eines Windows-Netzlaufwerks für die Offline-Synchronisierung? 🤷‍♂️
Brian

Antworten:


2785

Sobald Sie den Hash des von Ihnen abgelegten Stash-Commits kennen, können Sie ihn als Stash anwenden:

git stash apply $stash_hash

Oder Sie können einen separaten Zweig dafür mit erstellen

git branch recovered $stash_hash

Danach können Sie mit allen normalen Werkzeugen tun, was Sie wollen. Wenn Sie fertig sind, blasen Sie einfach den Ast weg.

Den Hash finden

Wenn Sie es gerade erst geöffnet haben und das Terminal noch geöffnet ist, wird der Hash-Wert weiterhin git stash popauf dem Bildschirm gedruckt (danke, Dolda).

Andernfalls können Sie es unter Linux, Unix oder Git Bash für Windows finden:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

... oder mit Powershell für Windows:

git fsck --no-reflog | select-string 'dangling commit' | foreach { $bits = $_ -split ' '; echo $bits[2];}

Dies zeigt Ihnen alle Commits an den Spitzen Ihres Commit-Diagramms, auf die von keinem Zweig oder Tag mehr verwiesen wird. Jedes verlorene Commit, einschließlich jedes Stash-Commits, das Sie jemals erstellt haben, befindet sich irgendwo in diesem Diagramm.

Der einfachste Weg, das gewünschte Stash-Commit zu finden, besteht wahrscheinlich darin, diese Liste an gitkfolgende Adresse zu übergeben :

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

... oder sehen Sie die Antwort von Emragins, wenn Sie Powershell für Windows verwenden.

Dadurch wird ein Repository-Browser gestartet, der Ihnen jedes einzelne Commit im Repository anzeigt , unabhängig davon, ob es erreichbar ist oder nicht.

Sie können gitkdort durch etwas ersetzen , git log --graph --oneline --decoratewenn Sie ein schönes Diagramm auf der Konsole einer separaten GUI-App vorziehen.

Suchen Sie nach Festschreibungsnachrichten dieses Formulars, um Stash-Commits zu erkennen:

        WIP on somebranch : commithash Eine alte Commit-Nachricht

Hinweis : Die Festschreibungsnachricht liegt nur in dieser Form vor (beginnend mit "WIP ein"), wenn Sie zu diesem Zeitpunkt keine Nachricht angegeben haben git stash.


49
Jaydel nahm die Worte aus meinem Mund. Dieser Beitrag hat meinen Job gerettet :) Ich möchte nur hinzufügen: Wenn Sie sich an das Datum erinnern, an dem Sie an dem gearbeitet haben, was Sie verloren haben, ist es einfacher, in gitk nach dem zu suchen, wonach Sie suchen.
Sridhar Sarnobat

4
@ Codey: Weil PowerShell. Ich weiß nicht, ob MsysGit eine AWK-Binärdatei ausliefert. Googeln sagt mir, dass so etwas wie %{ $_.Split(' ')[2]; }das {print $3}in diesem awkBefehl in PowerShell entspricht, aber ich habe kein Windows-System, um das zu testen, und Sie benötigen immer noch ein Äquivalent für das /dangling commit/Teil. Wie auch immer, lauf einfach git fsck --no-reflogund schau dir die Ausgabe an. Sie möchten die Hashes aus den Zeilen "Dangling Commit <commitID>".
Aristoteles Pagaltzis

7
Es ist erwähnenswert, dass die Festschreibungsnachricht nur dann die Zeichenfolge "WIP" enthält, wenn Sie beim Verstecken keine eigene Nachricht angegeben haben (dh wenn Sie dies tun git stash save "<message>").
Samir Aguiar

12
Wenn Sie wissen, wann der Abwurf stattgefunden hat, können Sie diesen Einzeiler verwenden, um die Liste der baumelnden Commits zu erhalten, indem Sie die Zeit verlängern: git fsck --no-reflog | awk '/dangling commit/ {print $3}' | xargs -L 1 git --no-pager show -s --format="%ci %H" | sortDer letzte Eintrag ist wahrscheinlich der, den Sie möchten stash apply.
ris8_allo_zen0

3
git stash apply {ref}restaurierte einen abgelegten Vorrat! gitist so toll, dass es illegal sein sollte!
Tom Russell

707

Wenn Sie das Terminal nicht geschlossen haben, sehen Sie sich einfach die Ausgabe von an git stash popund Sie haben die Objekt-ID des abgelegten Stashs. Normalerweise sieht es so aus:

$ git stash pop
[...]
Dropped refs/stash@{0} (2ca03e22256be97f9e40f08e6d6773c7d41dbfd1)

(Beachten Sie, dass git stash dropauch dieselbe Zeile erzeugt wird.)

Um diesen Vorrat zurückzubekommen, laufen git branch tmp 2cae03eSie einfach und Sie erhalten ihn als Zweig. Führen Sie Folgendes aus, um dies in einen Stash zu konvertieren:

git stash apply tmp
git stash

Wenn Sie es als Zweig haben, können Sie es auch frei manipulieren. Zum Beispiel, um es zu pflücken oder zusammenzuführen.


54
Sie können auch tun git stash apply commitiddann git stashein neues Versteck zu bekommen.
Matthew Flaschen

32
Beachten Sie, dass git den Hash nicht anzeigt, wenn git den Stash automatisch zusammenführt und Konflikte aufweist.
James

31
@James: Wenn diese Konflikte auf das Ausführen zurückzuführen sind git stash pop, wird der Stash auch nicht gelöscht, sodass dies normalerweise kein Problem darstellt.
Dolda2000

2
In meiner Git-Stash-Pop-Ausgabe war kein SHA enthalten. :(
Wegwerfen Konto

2
@Honey: Darum geht es git stash pop. Wenn Sie den Stash anwenden möchten, ohne ihn fallen zu lassen, verwenden Sie git stash applystattdessen. Wenn Sie eine Änderung auf mehrere Zweige anwenden möchten, können Sie stattdessen auch das Commit auswählen.
Dolda2000

271

Ich wollte nur diesen Zusatz zur akzeptierten Lösung erwähnen. Es war mir nicht sofort klar, als ich diese Methode zum ersten Mal ausprobierte (vielleicht hätte es so sein sollen), aber um den Stash aus dem Hash-Wert anzuwenden, verwenden Sie einfach "git stash apply":

$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219

Als ich neu bei Git war, war mir das nicht klar und ich habe verschiedene Kombinationen von "Git Show", "Git Apply", "Patch" usw. ausprobiert.


3
Beachten Sie, dass dies (duh!) Den Vorrat auf den aktuellen Arbeitsbaum anwendet. Wenn der Baum schmutzig ist, möchten Sie möglicherweise zuerst einen temporären Zweig oder einen Stash verwenden, den Stash aus dem SHA-1 anwenden, erneut verstauen und dann den vorletzten Stash (genannt stash @ {1}) einfügen.
musiKk

111

So erhalten Sie eine Liste der Verstecke, die sich noch in Ihrem Repository befinden, aber nicht mehr erreichbar sind:

git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk --grep=WIP

Wenn Sie Ihrem Vorrat einen Titel gegeben haben, ersetzen Sie "WIP" -grep=WIPam Ende des Befehls durch einen Teil Ihrer Nachricht, z -grep=Tesselation.

Der Befehl sucht nach "WIP", da die Standard-Commit-Nachricht für einen Stash im Formular vorliegt WIP on mybranch: [previous-commit-hash] Message of the previous commit.


1
echo 'git fsck --unreachable | grep commit | cut -d "" -f3 | xargs git log --merges --no-walk --grep = WIP '> / usr / local / bin / git-stashlog; chmod a + rx / usr / local / bin / git-stashlog # git stashlog
Erik Martino

Oder Sie können dies als Alias ​​zu Ihrer .gitconfig hinzufügen (vor dem Befehl ein !).
Asmeurer

Ich habe meinen Speck gespeichert - nun ja, nicht wirklich, aber ich habe mir das Umcodieren der Arbeitstage erspart - geschätzt - da ich erst kürzlich abgelegt habe, habe ich gerade die oberste SHA aus der Ausgabe Ihres Befehls ausgewählt - dann ... git stash apply SHA ... wie in anderen Antworten erwähnt - viele thx
danday74

75

Ich habe gerade einen Befehl erstellt, der mir geholfen hat, mein verlorenes Stash-Commit zu finden:

for ref in `find .git/objects | sed -e 's#.git/objects/##' | grep / | tr -d /`; do if [ `git cat-file -t $ref` = "commit" ]; then git show --summary $ref; fi; done | less

Dadurch werden alle Objekte im Baum .git / objects aufgelistet, diejenigen Objekte vom Typ commit gefunden und anschließend eine Zusammenfassung der einzelnen Objekte angezeigt. Von diesem Punkt an ging es nur noch darum, die Commits zu durchsuchen, um einen geeigneten "WIP on work: 6a9bb2" zu finden ("work" ist mein Zweig, 619bb2 ist ein kürzlich abgeschlossener Commit).

Ich stelle fest, dass ich dieses Problem nicht hätte, wenn ich "git stash apply" anstelle von "git stash pop" verwenden würde, und wenn ich "git stash save message " verwende, wäre das Commit möglicherweise leichter zu finden gewesen.

Update: Mit Nathans Idee wird dies kürzer:

for ref in `git fsck --unreachable | grep commit | cut -d' ' -f3`; do git show --summary $ref; done | less

41

git fsck --unreachable | grep commitsollte sha1 anzeigen, obwohl die zurückgegebene Liste möglicherweise ziemlich groß ist. git show <sha1>zeigt an, ob es sich um das gewünschte Commit handelt.

git cherry-pick -m 1 <sha1> führt das Commit in den aktuellen Zweig ein.


37

Windows PowerShell-Äquivalent mit gitk:

gitk --all $(git fsck --no-reflog | Select-String "(dangling commit )(.*)" | %{ $_.Line.Split(' ')[2] })

Es gibt wahrscheinlich einen effizienteren Weg, dies in einem Rohr zu tun, aber das macht den Job.


1
Ich bin sehr dankbar für Ihre Antwort
Виталий Шебаниц

32

Wenn Sie einen verlorenen Vorrat wiederherstellen möchten, müssen Sie zuerst den Hash Ihres verlorenen Vorrats ermitteln.

Wie Aristoteles Pagaltzis vorschlug, git fscksollte ein Ihnen helfen.

Persönlich verwende ich meinen log-allAlias, der mir jedes Commit (wiederherstellbare Commits) anzeigt, um einen besseren Überblick über die Situation zu erhalten:

git log --graph --decorate --pretty=oneline --abbrev-commit --all $(git fsck --no-reflogs | grep commit | cut -d' ' -f3)

Sie können eine noch schnellere Suche durchführen, wenn Sie nur nach "WIP on" -Nachrichten suchen.

Sobald Sie Ihren sha1 kennen, ändern Sie einfach Ihr Stash-Reflog, um das alte Stash hinzuzufügen:

git update-ref refs/stash ed6721d

Sie werden es wahrscheinlich vorziehen, eine zugehörige Nachricht zu haben, also a -m

git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721d

Und Sie möchten dies sogar als Alias ​​verwenden:

restash = !git update-ref -m $(git log -1 --pretty=format:'%s' $1) refs/stash $1

2
Allerdings -d\\ sollte das sein -d\ (oder noch klarer -d' ')
joeytwiddle

Ich habe einen Fehler erhalten: "fatal: mehrdeutiges Argument 'baumeln': unbekannte Revision oder Pfad nicht im Arbeitsbaum."
Daniel Ryan

Sie müssen auch Unterbefehl mit Anführungszeichen git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721
umschließen

18

Ich mochte Aristoteles 'Ansatz, mochte aber nicht GITK ... da ich es gewohnt bin, GIT über die Befehlszeile zu verwenden.

Stattdessen nahm ich die baumelnden Commits und gab den Code zur Überprüfung in meinem Code-Editor in eine DIFF-Datei aus.

git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff

Jetzt können Sie die resultierende diff / txt-Datei (in Ihrem Home-Ordner) in Ihren txt-Editor laden und den tatsächlichen Code und die resultierende SHA anzeigen.

Dann einfach benutzen

git stash apply ad38abbf76e26c803b27a6079348192d32f52219

17

Sie können alle nicht erreichbaren Commits auflisten, indem Sie diesen Befehl in Terminal schreiben -

git fsck --unreachable

Überprüfen Sie den nicht erreichbaren Commit-Hash -

git show hash

Schließlich bewerben, wenn Sie den verstauten Artikel finden -

git stash apply hash

15

Warum stellen die Leute diese Frage? Weil sie das Reflog noch nicht kennen oder verstehen.

Die meisten Antworten auf diese Frage enthalten lange Befehle mit Optionen, an die sich fast niemand erinnern wird. Also kommen die Leute in diese Frage und kopieren und fügen alles ein, was sie für nötig halten, und vergessen es fast unmittelbar danach.

Ich würde jedem mit dieser Frage raten, nur das Reflog (Git Reflog) zu überprüfen, nicht viel mehr. Sobald Sie diese Liste aller Commits sehen, gibt es hundert Möglichkeiten, herauszufinden, nach welchem ​​Commit Sie suchen, und es auszuwählen oder einen Zweig daraus zu erstellen. Dabei haben Sie das Reflog und die nützlichen Optionen für verschiedene grundlegende Git-Befehle kennengelernt.


1
Hallo Robby. Dies ist relevant, wenn Sie gearbeitet haben, von der Seite verfolgt wurden und wieder dort weitermachen müssen, wo Sie vor ein paar Wochen aufgehört haben, nur um zu erfahren, dass Sie Ihre versteckte Arbeit nicht finden können - sie ist wahrscheinlich irgendwo in dem anderen Zeug verloren gegangen, das Sie haben machten. Reflog ist großartig, wenn es sich um die jüngste Geschichte handelt, aber nicht für lange Zeitlücken.
Emragins

1
Hey Emragins, ich stimme zu, aber das war genau der Anwendungsfall des OP. Ich weiß nicht genau, wie sich die anderen hier veröffentlichten Befehle verhalten würden, aber mein Geuss wäre, dass sie auch aufhören würden zu arbeiten, sobald der Verweis auf sein verstecktes Commit bereinigt wird.
RobbyD

1
Hmm ... das obige Szenario hat mich zu dieser Frage gebracht, und ich weiß, dass es mindestens ein paar Wochen, wenn nicht sogar noch näher an einem Monat war, zwischen dem ich (unwissentlich) meinen Vorrat verloren habe und dem ich ihn wiederherstellen konnte.
Emragins

15

In OSX mit git v2.6.4 habe ich versehentlich git stash drop ausgeführt und es dann gefunden, indem ich die folgenden Schritte durchlaufen habe

Wenn Sie den Namen des Lagers kennen, verwenden Sie:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show | grep -B 6 -A 2 <name of the stash>

Andernfalls finden Sie die ID aus dem Ergebnis manuell mit:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show

Wenn Sie dann die Commit-ID finden, klicken Sie einfach auf den Git-Stash Apply {Commit-ID}.

Hoffe das hilft jemandem schnell


12

Ich möchte der akzeptierten Lösung einen weiteren guten Weg hinzufügen, um alle Änderungen durchzugehen, wenn Sie entweder kein Gitk zur Verfügung haben oder kein X für die Ausgabe.

git fsck --no-reflog | awk '/dangling commit/ {print $3}' > tmp_commits

for h in `cat tmp_commits`; do git show $h | less; done

Dann werden alle Unterschiede für diese Hashes nacheinander angezeigt. Drücken Sie 'q', um zum nächsten Diff zu gelangen.


12

Ich konnte keine der Antworten erhalten, um unter Windows in einem einfachen Befehlsfenster zu arbeiten (in meinem Fall Windows 7). awk, grepUnd Select-stringwurden als Befehle nicht erkannt. Also habe ich einen anderen Ansatz versucht:

  • erster Lauf: git fsck --unreachable | findstr "commit"
  • Kopieren Sie die Ausgabe in den Editor
  • find ersetze "nicht erreichbares Commit" durch start cmd /k git show

wird ungefähr so ​​aussehen:

start cmd /k git show 8506d235f935b92df65d58e7d75e9441220537a4 start cmd /k git show 44078733e1b36962571019126243782421fcd8ae start cmd /k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1 start cmd /k git show d00aab9198e8b81d052d90720165e48b287c302e

  • Speichern Sie als .bat-Datei und führen Sie sie aus
  • Das Skript öffnet eine Reihe von Befehlsfenstern, in denen jedes Commit angezeigt wird
  • Wenn Sie die gesuchte gefunden haben, führen Sie Folgendes aus: git stash apply (your hash)

ist vielleicht nicht die beste Lösung, hat aber für mich funktioniert


Sie können Git Bash auch unter Windows verwenden. In Git Bash haben Sie alle (unixoiden) Befehlszeilen-Tools, die Sie benötigen.
Adrian W

10

Die von Aristoteles akzeptierte Antwort zeigt alle erreichbaren Commits, einschließlich nicht versteckter Commits. So filtern Sie das Rauschen heraus:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3

Dies schließt nur Commits ein, die genau 3 übergeordnete Commits haben (die ein Stash haben wird) und deren Nachricht "WIP on" enthält.

Beachten Sie, dass beim Speichern Ihres Stashs mit einer Nachricht (z. B. git stash save "My newly created stash") die Standardnachricht "WIP on ..." überschrieben wird.

Sie können weitere Informationen zu jedem Commit anzeigen, z. B. die Commit-Nachricht anzeigen oder an folgende Adresse übergeben git stash show:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3 | \
xargs -n1 -I '{}' bash -c "\
  git log -1 --format=medium --color=always '{}'; echo; \
  git stash show --color=always '{}'; echo; echo" | \
less -R

6

Mein Favorit ist dieser Einzeiler:

git log --oneline  $( git fsck --no-reflogs | awk '/dangling commit/ {print $3}' )

Dies ist im Grunde die gleiche Idee wie diese Antwort, aber viel kürzer. Natürlich können Sie noch hinzufügen --graph, um eine baumartige Anzeige zu erhalten.

Wenn Sie das Commit in der Liste gefunden haben, bewerben Sie sich mit

git stash apply THE_COMMIT_HASH_FOUND

Für mich hat die Verwendung --no-reflogsden verlorenen Stash-Eintrag enthüllt, aber --unreachable(wie in vielen anderen Antworten gefunden) nicht.

Führen Sie es auf Git Bash aus, wenn Sie unter Windows sind.

Credits: Die Details der oben genannten Befehle stammen von https://gist.github.com/joseluisq/7f0f1402f05c45bac10814a9e38f81bf


5

Stellen Sie es mithilfe der folgenden Schritte wieder her:

  1. Identifizieren Sie den gelöschten Stash-Hash-Code:

    gitk --all $ (git fsck --no-reflog | awk '/ dangling commit / {print $ 3}')

  2. Cherry Pick the Stash:

    git cherry-pick -m 1 $ stash_hash_code

  3. Lösen Sie Konflikte, falls vorhanden:

    Git Mergetool

Außerdem haben Sie möglicherweise Probleme mit der Festschreibungsnachricht, wenn Sie Gerrit verwenden. Bitte bewahren Sie Ihre Änderungen auf, bevor Sie die nächsten Alternativen befolgen:

  1. Verwenden Sie den Hard-Reset zum vorherigen Commit und übernehmen Sie diese Änderung erneut.
  2. Sie können die Änderung auch aufbewahren, neu starten und erneut festlegen.

@ miva2 Ihre Bearbeitung hat den Link zur korrektesten Antwort in dieser Frage entfernt. Hinzufügen des Links zurück in den Kommentar stackoverflow.com/questions/89332/…
Abhijeet

4

Was ich hierher gebracht habe, ist, wie ich den Vorrat tatsächlich zurückbekomme, unabhängig davon, was ich ausgecheckt habe. Insbesondere hatte ich etwas verstaut, dann eine ältere Version ausgecheckt und sie dann geöffnet, aber das Versteck war zu diesem früheren Zeitpunkt ein No-Op, sodass das Versteck verschwand; Ich konnte es nicht einfach git stashzurückschieben. Das hat bei mir funktioniert:

$ git checkout somethingOld
$ git stash pop
...
nothing added to commit but untracked files present (use "git add" to track)
Dropped refs/stash@{0} (27f6bd8ba3c4a34f134e12fe69bf69c192f71179)
$ git checkout 27f6bd8ba3c
$ git reset HEAD^    # Make the working tree differ from the parent.
$ git stash # Put the stash back in the stack.
Saved working directory and index state WIP on (no branch): c2be516 Some message.
HEAD is now at c2be516 Some message.
$ git checkout somethingOld # Now we are back where we were.

Im Nachhinein hätte ich git stash applynicht verwenden sollen git stash pop. Ich machte einen bisectund hatte einen kleinen Patch, den ich bei jedem bisectSchritt anwenden wollte . Jetzt mache ich das:

$ git reset --hard; git bisect good; git stash apply
$ # Run tests
$ git reset --hard; git bisect bad; git stash apply
etc.

Ist das eine Antwort oder die Fortsetzung der Frage?
Alex Brown

Ein bisschen von beidem. Ich habe diese Seite gefunden, weil ich einen Vorrat verloren habe und versucht habe, ihn zurückzubekommen. Der Anwendungsfall für mich ist eine Halbierung, bei der ich vor dem Testen bei jedem Schritt eine Änderung anwenden möchte. Ich habe auf die harte Tour gelernt, dass man nicht einfach platzen, testen, verstauen, halbieren kann, weil dies ein anderes Commit auf dem Versteck hinterlassen kann stash apply.
Ben
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.