Git bietet mit stash einen Befehl, um temporäre Änderungen zu speichern und diese zu einem späteren Zeitpunkt wiederherzustellen. Temporäre Änderungen lassen sich in Git allerdings auch sehr elegant ohne stash verwalten. Zunächst erzeugt man sich hierzu einen neuen temporären Branch:

$ git checkout -b temp-changes

Auf diesem neuen Branch können nun alle offenen Änderungen abgelegt werden (git add & git commit). Nach dem Commit der Änderungen sieht die Repository-Historie wie folgt aus:

$ git log --oneline --all --graph --decorate
* e405e76 (HEAD, temp-changes) Temp changes
* 6368ed7 (master) Commit on master branch

Zum Wiederherstellen dieser Änderungen eignet sich der Befehl reset:

$ git reset --mixed master
$ git checkout master

Die zuvor im Branch temp-changes versionierten Änderungen werden durch den Parameter --mixed als offene Änderungen in die Working Copy übernommen.

Falls allerdings zuvor auf dem Master-Branch ebenfalls Änderungen versioniert wurden, führt reset nicht zwingend zum gewünschten Erfolg. Als Beispiel soll die folgende Historie dienen:

$ git log --oneline --all --graph --decorate
* 0604c0b (HEAD, master) Second commit on master branch
| * e405e76 (HEAD, temp-changes) Temp changes
|/
* 6368ed7 Commit on master branch

In diesem Fall sollten die Änderungen auf dem temporären Branch vor dem Reset zunächst mit rebase verschoben werden:

$ git rebase master

Auf der daraus resultierenden Historie kann dann analog zu oben wieder ein git reset --mixed durchgeführt werden:

$ git log --oneline --all --graph --decorate
* 837bed1 (HEAD, temp-changes) Temp changes
* 0604c0b (master) Second commit on master branch
* 6368ed7 Commit on master branch