====== GIT und Github ======
Im Labor wird [[http://www.contiki-os.org|Contiki]] für die Programmierung von Mikrocontrollern verwendet.
Dazu wurde ein [[https://github.com/tscheffl/contiki|Fork]] des [[https://github.com/contiki-os/contiki| 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 # muss man nach jeder Änderung machen! -> alternativ
git add -u # fügt alle geänderten Dateien hinzu
git commit -m "" # 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
git push -u origin
**Löschen** eines nicht mehr benötigten Branches:
git branch -d
**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
* http://stackoverflow.com/questions/2369426/how-to-move-certain-commits-to-another-branch-in-git
* http://effectif.com/git/move-commit-from-one-branch-to-another
====== Rebase ======
Um z.B. einen Branch wieder an ''master'' anzuhängen, nachdem weiter Commits in master erfolgt sind:
git checkout
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 ===
* https://ginnyfahs.medium.com/github-error-authentication-failed-from-command-line-3a545bfd0ca8
* [[https://superuser.com/questions/232373/how-to-tell-git-which-private-key-to-use|How to tell git which private key to use?]]
* [[https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent|Generating a new SSH key and adding it to the ssh-agent]]
==== Tracking: ====
* http://lornajane.net/posts/2014/understanding-tracking-branches-in-git
==== Links: ====
* https://www.atlassian.com/git/tutorials/what-is-version-control
* https://robots.thoughtbot.com/keeping-a-github-fork-updated
* http://rogerdudler.github.io/git-guide/
==== Wer bin ich?: ====
git config --global user.email "scheffler@beuth-hochschule.de"
git config --global user.name "Thomas Scheffler"
==== Clonen per SSH: ====
git clone git@github.com:tscheffl/contiki.git stuff
==== Stuff ====
* https://trello.com/b/qvYlSdKT/git-commands
==== 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