Inhaltsverzeichnis

GIT und Github

Im Labor wird Contiki für die Programmierung von Mikrocontrollern verwendet. Dazu wurde ein Fork des offiziellen Repositories erstellt, um eigene Entwicklungen entwickeln und hosten zu können.

Dem Repository werden eigene Branches hinzugefügt. Davon wird jeweils einer in Github als Default markiert.

Das eigene Repo wird in unregelmäßigen Abständen mit dem offiziellen Repo synchronisiert. Dazu wird eine neue Kopie des eigenen Branches angefertigt und ein rebase nach HEAD durchgeführt. Somit sollten eigene Entwicklungen aktuell gehalten werden.

Dazu fehlen momentan noch automatisierte Tests (Travis?), welche sicherstellen, dass sich alle eigenen Entwicklungen auch kompilieren lassen.

Quellcode herunterladen

 git clone https://github.com/tscheffl/contiki
 cd contiki
 git status

Allgemeine Befehle

Herausfinden, mit welchen Remotes das lokale Repository verbunden ist.

 git remote
 git remote show upstream
 git remote show origin

Zeigt lokale Branches (-vv für tracking & remote):

 git branch -vv

Anzeigen der Geschichte des Projekts:

 git log    
 git log --oneline --decorate --graph

Änderungen abspeichern:

 git add <Datei>            # muss man nach jeder Änderung machen! -> alternativ
 git add -u                 # fügt alle geänderten Dateien hinzu
 
 git commit -m "<Message>"  # Lokales Commit (kann noch geändert werden)
 git push                   # (Final) Änderungen auf Server pushen

Branches

Erzeugen eines neuen Branches und nach Remote pushen (-u - tracking):

 git checkout -b <branch>
 git push -u origin <branch>

Löschen eines nicht mehr benötigten Branches:

 git branch -d <branch>

Kopie eines Branches anfertigen:

 git branch copyOfMyBranch MyBranch

Irrtümlichen Commit löschen:

 git reset --hard HEAD^                  # ^signifies the number of commits to delete: ^-1 ^^-2

Umbenennen eines Branches:

 git branch -m old_branch new_branch      # Rename branch locally    
 git push origin :old_branch              # Delete the old branch    
 git push -u origin new_branch            # Push the new branch, set local branch to track the new remote

Move commits to another branch

Rebase

Um z.B. einen Branch wieder an master anzuhängen, nachdem weiter Commits in master erfolgt sind:

 git checkout <branch>
 git rebase (-i) master # -i: interaktiv

http://stackoverflow.com/questions/3480741/git-move-a-branchs-start-forward-in-the-tree

Fork mit originalem Repository abgleichen

 git remote -v

Falls upstream nicht vorhanden ist, muss es hinzugefügt werden (nur einmal nötig):
git remote add upstream https://github.com/contiki-os/contiki

Mit den folgenden Befehlen kann zwischen HTTPS und SSH umgeschalten werden:

git remote set-url origin git@github.com:tscheffl/contiki.git
git remote set-url origin https://github.com/tscheffl/contiki.git

Fetch alle Branches von Remote (remote-tracking), z.B. upstream/master:

 git fetch upstream

Stelle sicher, im master-Branch zu sein:

 git checkout master

Rewrite des master Branch. Eigene Commits (die noch nicht in master enthalten sind) werden am Kopf von master neu eingefügt.

 git rebase upstream/master  #Format: upstream/branch

Nach dem rebase kann das Ergebnis per force push in das eigene geforkte Repository auf GitHub hochgeladen werden:

 git push f origin master

(:!: In manchen Anleitungen wird git merge anstelle von git rebase verwendet. Ich finde das nicht so praktisch, da dabei ein neuer Commit erzeugt wird, wodurch nach dem git push auf Github eine Differenz zwischen Fork und originalem Repository angezeigt wird.)

Verschiedenes

Zugriff auf 2-Faktor gesichertes Repository von der Kommandozeile

Tracking:

Wer bin ich?:

 git config --global user.email "[email protected]"
 git config --global user.name "Thomas Scheffler"

Clonen per SSH:

git clone git@github.com:tscheffl/contiki.git stuff

Stuff

Neues Repository von der Kommandozeile erzeugen

 echo "# Titelzeile" >> README.md
 git init
 git add README.md
 git commit -m "first commit"
 git remote add origin git://github.com:tscheffl/Name_des_Repo.git
 git push -u origin master