17. August 2013

Branch wechseln mit Änderungen, git stash

Beim Wechsel zu einem anderen Branch übernimmt git checkout Änderungen an Working Tree und Index soweit möglich mit in den Ziel-Branch. Dazu wird ein Patch erstellt und versucht, diesen auf dem Ziel-Branch anzuwenden. Dieses Verhalten ist nützlich um die Arbeit an einer im aktuellen Branch begonnenen Änderung in einem neuen Branch fortzusetzen:

$ git checkout -b [newbranch]
M    readme.txt            # <-- Änderungen an readme.txt wurden übernommen
Switched to a new branch 'newbranch'

Wenn ein Konflikt die Mitnahme der Änderungen verhindert, wird der Wechsel des Branches verweigert:

$ git checkout <branch>
error: Your local changes to the following files would be overwritten by checkout:
readme.txt
Please, commit your changes or stash them before you can switch branches.
Aborting

In diesem Fall empfiehlt es sich, die Änderungen wie im ersten Beispiel beschrieben in einen neuen Branch zu übertragen und dort zu committen. Alternativ können Änderungen an Working Tree und Index mit git stash zur Seite gelegt werden und später wieder angewendet werden:

$ git stash
Saved working directory and index state WIP on master: 0f75859 Fixed bug
HEAD is now at 0f75859 Fixed bug

$ git stash list
stash@{0}: WIP on master: 0f75859 Fixed bug

$ git stash apply       # Alle anwenden
$ git stash apply@{0}   # Einzeln anwenden