Git

Commands (Auswahl)


Hilfe

Hilfe zu einem Befehl (öffnet man-pages)
 git help [Befehl]

Initialisierung

(Erstellt im aktuellen Verzeichnis den Ordner ".git")
  1. neues, leeres Repository durch
 git init

  1. kopieren eines bestehenden Repositories durch
 // open source projekte
 git clone http://github.com/benutzername/projektname

 // EIS-Übungsgruppe
 git clone eis:eis15-groupXX

Glob

  • vereinfachte reguläre Ausdrücke bei angaben von Dateipfaden
  • * bezeichnet beliebige (oder kein) Zeichen
  • ? bezeichnet ein beliebiges, einzelnes Zeichen
  • bezeichnet eines der in den eckigen Klammern angegebenen Zeichen (hier a,b,c,d oder e)
  • 0-9 bezeichnet eines der Zeichen zwischen 0 und 9
  • **\/ beliebiges Verzeichnis
  • Beispiele:
    • Datei[1-9].cpp => Datei1.cpp, Datei2.cpp, ...
    • Unterordner/*.txt => alle Textdateien im Unterordner
    • Unterordner/**/*.txt => alle Textdateien im Unterordner und dessen Unterordnern

Staging/Tracking

(Git auf Änderungen aufmerksam machen)


  1. den aktuellen Status des Repositories und den Status der Dateien anzeigen. (Was hat sich seit dem letzten Commit geändert?)
    git status
    
  2. eine Datei anmerken (Glob-Ausdruck für dateiname erlaubt)
    git add [Dateiname] [Dateiname] ...
    
  3. alles anmerken
    git add .
    
    // alle Dateien in einem Ordner hinzufügen
    git add [Verzeichnis]/
    
  4. nur "modified" Dateien anmerken
    git add -u
    
  5. ansonsten ignorierte Datei hinzufügen
    git add -f [Dateiname]
    
  6. add rückgängig machen / unstaging
    git reset HEAD [Dateiname]
    
    // (ALIAS) kompakte Ansicht (3) - (siehe 4.Einstellungen/Aliase)
    git unstage [Dateiname]
    
  7. "working directory"-Änderungen (uncommited) rückgängig machen
    git checkout -- [Dateiname]
    
  8. Datei löschen (ACHTUNG! Dies löscht die Datei aus dem working directory und zukünftigen commits)
    git rm [Dateiname]
    
  9. tracking für immer aufheben, aber Datei (im working directory) beibehalten.
    git rm --cached [Dateiname]
    
    // (ALIAS - siehe 4.Einstellungen/Aliase)
    git untrack [Dateiname]
    

Commit

(Änderungen speichern)
  1. Staging area commiten
     git commit -m "Was ich geändert habe"
    
     git commit
     // angegebener Editor öffnet sich und erwartet commit-message.
     // schließen ohne zu speichern oder etwas zu schreiben bricht den
     // vorgang ab
    
  2. "modified" Dateien direkt commiten (ohne den Schritt über das Staging)
     git commit -a -m "Was ich geändert habe"
    
     git commit -a
     // angegebener Editor öffnet sich und erwartet commit-message.
     // schließen ohne zu speichern oder etwas zu schreiben bricht den
     // vorgang ab
    
  3. letzte commit message ändern (vor dem Hochladen) (in den Einstellungen angegebener Editor öffnet sich)
     git commit --ammend
    
  4. datei/änderung unmittelbar nach einem commit beifügen
     git commit -m "commit mit fehlender datei"
     git add vergesseneDatei.txt
     git commit --ammend
    
  5. commit auschecken
     // sha-1 checksum (kurzversion) sei hier 1234567
     git checkout 1234567
    
  6. Commits anzeigen
     git log
    
     // die 5. letzten Commits auflisten
     git log -5
    
     // kompakte Ansicht
     git log --oneline
    
     // kompakte Ansicht (2)
     git log --oneline --decorate=short
    
     // (ALIAS) kompakte Ansicht (3) - (siehe 4.Einstellungen/Aliase)
     git tree
     git tree -3
    

Branches

  1. alle Branches des Repository und aktuellen Branch anzeigen
     git branch
     * master
     meinBranch
    
     // zeigt außerdem den jeweils letzten commit an (checksum + message)
     git branch -v
    
  2. neuen Branch anlegen (Achtung: HEAD wechselt dabei nicht auf den Branch)
     git branch meinBranch
    
  3. auf den Branch wechseln / zurückwechseln
     git checkout meinBranch
     git checkout master
    
  4. neuen Branch anlegen und darauf wechseln (Kurzform von i. und ii)
     git checkout -b meinBranch
    
  5. Branch löschen (nur bei bereits gemerged branches)
     git branch -d meinBranch
    
  6. Branch löschen erzwingen
     git branch -D meinBranch
    

Stash (Zwischenablage)

  1. (Uncommitete Änderungen) in der Zwischenablage speichern
     git stash
    
  2. Zwischenablage verwerfen
     git stash drop
    
  3. Änderungen wieder einfügen (Achtung merge-Konflikt möglich)
     git stash pop
    

Merges & Rebase

  1. merge (hotfix in den hauptzweig main zusammenführen)
     // einchecken, falls ihr noch nicht in main seid
     git checkout main
    
     git merge hotfix
    
     // falls es einen Konflikt gibt, muss dieser erst gelöst werden
     // dieser befehl zeigt an, welche Dateien den Konflikt auslösen
     // siehe: "Unmerged"-Liste
     git status
    
     // KONFKLIKTLÖSUNG HIER
     // entweder per Hand (dannach als gelöst markieren mit)
     git add [Konfkliktdateien]
    
     // oder - falls in den Einstellungen gesetzt - durch visuelles tool
     git mergetool
    
     // bei bedarf noch einmal prüfen und den vorigen Schritt wiederholen
     git status
    
     // falls alle Konflikte gelöst sind den merge-commit einfügen
     git commit -m "merged hotfix-branch"
    
     // alten branch löschen, da er (meistens) nicht wieder benötigt wird
     git branch -d hotfix
    


    Manuelle Konfliktlösung Beispiel Inhalt der Konfliktdatei
    
    ...
    
    <<<<<<< HEAD
    Eine einmal geänderte Zeile
    =======
    Eine parallel geänderte Zeile
    >>>>>>> hotfix
    
    ...
    
    


    
                               __||__
                               \    /  manuelle Konfliktlösung
                                \  /
                                 \/
    


    
     ...
    
     Eine geänderte Zeile
    
     ...
    
  2. Achtung: Nach einem rebase können die branches gelöscht werden - dies geschieht nicht automatisch. Außerdem wird kein fast-forward durchgeführt.
  3. einfacher rebase: Anwenden der Änderungen von hotfix auf master
     git rebase master hotfix
    
     // alternativ
     git checkout hotfix
     git rebase master
    
  4. Anwenden der Änderungen von client (seit server) auf master
     git rebase --onto master server client
    

remote Repository

  1. herunterladen der neusten Änderungen des geklonten Repositories
     git fetch
    
     // alternativ
     git fetch origin
    
  2. auschecken des geklonten Repositories (oder auch eines branches auf dortigem) (keine Schreibrechte!)
     git checkout origin/master
     git checkout origin/branchname
    
  3. herunterladen und mergen
     git pull
    
     // alternativ
     git pull origin
    
  4. herunterladen und mergen
     git push
    
     // alternativ
     git push origin
    
  5. generierung eines lokalen Branches aus einem remote Branch (Schreibrechte vorhanden) Vorteil: wechselt man auf diesen Lokalen Branch können direkt fetch, push und pull wie beim master-branch verwendet werden.
     git checkout --track origin/branchname
     // ab jetzt ist branchname ein lokaler Branch
    
     // alternativ (lokaler Name kann hier geändert werden)
     git checkout -b branchname origin/branchname
     // ab jetzt ist branchname ein lokaler Branch
    
    
     // nun kann auch von jedem branch aus fetch, push und pull ausgeführt
     // werden
     git fetch origin branchname
     git pull origin branchname
     git push origin branchname
    
  6. für alle anderen Operationen: merge in einen lokalen Zweig, rebase, .... wird der remote Branch genauso referenziert.
  7. Hochladen eines lokalen Branches branchname
     git push origin branchname
    
  8. Löschen eines remote Branches
     git push origin :branchname