Git Teil 2

Branches

Branches sind sowas wie Computerspielstände. In meinem Arbeitsverzeichniss kann ich wild zwischen den verschiedenen Branches hin und herwechseln, solange ich vor dem Wechseln commite:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 git status
Auf Branch master
nichts zu committen, Arbeitsverzeichnis unverändert
  ~/Dokumente/gtest/ $> cat meinedatei.txt 
master stand
   ~/Dokumente/gtest/ $>  git branch
  chef
  ~/Dokumente/gtest/ $> git checkout chef
Zu Branch 'chef' gewechselt
   ~/Dokumente/gtest/ $> cat meinedatei.txt 
bla  aenderung 

Wenn ich eine Datei geändert habe und zu einem anderen Branch wechseln will, lässt git das ohne ein commit oder force nicht zu:

1
2
3
4
5
6
7
8
git checkout master
error: Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken
überschrieben werden:
        meinedatei.txt
Bitte committen oder stashen Sie Ihre Änderungen, bevor Sie Branches
wechseln.
Abbruch
   ~/Dokumente/gtest/ $> 

Ein Branch als Spielwiese

Sinnvoll ist einen Branch als Spielwiese zu haben, dort einfach und schnell und häufig zu commiten. Diese Änderungen merged man dann in den Hauptzweig und commitet einmal sauber.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# Branch Spielwiese anlegen und dort hineinwechseln:

 ~/Dokumente/gtest/ $> git checkout -b spielwiese
Zu neuem Branch 'spielwiese' gewechselt
# 3 änderungen jeweils einzeln commiten:

 ~/Dokumente/gtest/ $> echo bla >> meinedatei.txt ; git commit -a  -m  'c1' 
[spielwiese 161c062] c1
 1 file changed, 5 insertions(+)
  ~/Dokumente/gtest/ $> echo bla >> meinedatei.txt ; git commit -a  -m  'c2' 
[spielwiese 5c0885e] c2
 1 file changed, 1 insertion(+)
   ~/Dokumente/gtest/ $> echo bla >> meinedatei.txt ; git commit -a  -m  'c3' 
[spielwiese 43d7f62] c3
 1 file changed, 1 insertion(+)
# jetzt die letzten 3 Commits rebasen:
 ~/Dokumente/gtest/ $> git rebase -i 'HEAD~3' 
[losgelöster HEAD 9c5630c] Merge branch 'spielwiese'
 Date: Tue Sep 12 18:21:15 2017 +0200
Successfully rebased and updated refs/heads/spielwiese.
   ~/Dokumente/gtest/ $> 

Dabei geht ein Editor mit Erklärungen auf, wir squashen das ganze:

1
2
3
squash 161c062 c1                                                                                                                                                                       
squash 5c0885e c2                                                                                                                                                                       
quash 43d7f62 c3                                                                                                                                                                       # Rebase von ad519e1..43d7f62 auf ad519e1 (3 Kommandos)              

Jetzt habe ich nur noch eine Logmeldung und kann mit

1
2
git checkout master
git merge spielwiese

den Spielwiese Branch mergen und mit

1
git branch -d spielwiese

den nicht mehr gebrauchten Branch löschen.