3. Versionskontrollsysteme

../../_images/versions.svg

Du wirst ein „Versionskontrollsystem“ verwenden, um deine Arbeit zu verfolgen und deinem Ausbilder die Möglichkeit zu geben, Feedback zu geben. Die Chancen stehen gut, dass du ein solches System, in einem großen Unternehmen verwenden würdest.

3.1. Kurzreferenz

Dies ist eine Kurzreferenz, komme wieder wenn du deine Arbeit abgeben willst. wir werden uns später einer detaillierten Erklärung widmen.

3.1.1. Bestätigen und Hochladen

Erledige dies wann immer du mit einer Programmier Session fertig bist:

  1. Öffne entweder die „Eingabeaufforderung“ unter Windows oder das „Terminal“ unter MacOS.

  2. Gebe dafür cd meinVerzeichnisname ein, um zu deinem Verzeichnis zu navigieren. Meistens funktioniert das mit cd Desktop gefolgt von cd learn-arcade-work. Wenn du OneDrive installiert haben, musst du eventuell zuerst cd OneDrive eingeben. Normalerweise kannst du die ersten paar Buchstaben eintippen und dann auf <tab> drücken, um den Rest des Verzeichnisnamens einzugeben.

  3. Type git add -A

  4. Gefolgt von git commit -m "Work on lab 1" um den Kommentar auf den aktuellsten Stand zu bringen.

  5. und noch git push

Falls du eine Fehlermeldung erhältst, siehe What If You Can’t Push?

3.1.2. Gebe deine Ergebnisse ab

  1. Gehe auf GitHub

  2. Registriere dich falls nötig (In der oberen rechten Ecke. achte darauf dich nicht nochmal zu registrieren)

  3. Klicke auf dein Repository auf der linken Seite

  4. Suche den Ordner mit deinen Lab

  5. Kopier den Link

  6. Öffne dass Scholar/Moodle für dein lab

  7. Füge den Link ein, und gebe deine Ergebnisse ab

für mehr befehle schaue unter Longer Git Command Reference nach.

3.2. Was ist ein verteiltes Versionskontrollsystem

../../_images/git.svg

Keine ernsthafte Entwicklung sollte ohne Versionskontrolle durchgeführt werden. In der Tat ist ein Versionskontrolle so wichtig, dass viele Entwickler argumentieren würden, dass fast keine Entwicklung ohne Versionskontrolle durchgeführt werden sollte. Sogar alle meine Notizen für den Unterricht bewahre ich in der Versionskontrolle auf.

Die Versionskontrolle erlaubt Entwicklern :

  • Jede vergangene Version eines Projektes wiederherzustellen.

    • Du veröffentlichts Version 1.5 deines programes und nun Stürzt es ab? Schnell! Gehe einfach wieder zurück zu Version 1.4.

    • Hat der ‚Neue‘ das Projekt vermasselt? Kehre einfach zu einer alten Version zurück!

  • Wisse genau, was im Code geändert wurde, wann und von wem. Sehe, wer tatsächlich die Arbeit macht. Wenn ein Fehler eingefügt wird siehst du, wann und von wem er eingefügt wurde.

  • Einfacher Austausch von Code zwischen Entwicklern.

  • Einfaches Arbeiten unabhängig von anderen Entwicklern.

  • Stelle aus Versehen gelöschte oder überschriebende Dateien wieder her.

  • Geh zurück und erstelle einen bug-fix für frühere Versionen eines Programms.

  • Arbeite an mehreren Computern und behalte deine Dateien synchron.

Versionskontrolle spart unsagbar viel Zeit und Kopfzerbrechen. Früher war die Versionskontrolle so lernintensiv, dass sich einige Entwickler weigerten, sie zu benutzen. Zum Glück sind die heutigen Tools zur Versionskontrolle so einfach zu bedienen, dass es keine Ausrede mehr gibt, es nicht zu tun.

Es gibt zwei Haupttypen der Versionskontrolle. Die ursprünglichen Versionskontrollsysteme waren „zentralisiert“ und erforderten einen zentralen Server. Heutzutage verwenden wir „verteilte Versionskontrollsysteme“ (DVCS), die keinen zentralen Server benötigen. Das Softwareprogramm Git ist eine der beliebtesten Arten von DVCS, die heute verfügbar sind.

3.3. Installation von Git

../../_images/install.svg

Lass uns git auf deinem Computer installieren. Wenn du einen Schulcomputer verwendest, auf dem git vorinstalliert ist, kannst du diesen Schritt überspringen.

Wenn du mit Windows arbeitest, klicke auf den untenstehenden Link und lade die 64-Bit-Version von git herunter und installieren sie:

Arbeitest du mit einem Mac:

  • Öffnen das Fenster „Terminal“. (Unter dem Ordner „Dienstprogramme“ in Anwendungen.)

  • Geben Sie git an der Eingabeaufforderung ein.

  • Sie sollten nun aufgefordert werden, einige Entwicklerwerkzeuge zu installieren, zu denen auch git gehört.

3.4. Ein Fork des Repository Erstellen

Achtung

Du solltest nur einmal während des Kurses einen Fork vom Code anlegen müssen. Wenn du es mehr als einmal tust, ist etwas nicht in Ordnung. Höre auf, bevor du das tust und wende dich an den Dozenten. Es bereitet allen Beteiligten große Kopfschmerzen, wenn du mehr als einmal ein Fork anlegst.

  1. Wir werden unsere Programme online auf einer Website namens GitHub speichern. Fang an, indem du dich auf der Website anmeldest: https://github.com Da dies ein „Portfolio“ für deine Arbeit werden könnte, solltest du einen Kontonamen, der in einer professionellen Umgebung funktionieren würde, nehmen. Du kannst ihn gerne anonym halten, vermeide nur etwas zu Albernes.

  2. Rufe diese Webadresse auf, die eine Vorlage für die labs enthält, die wir im Unterricht erstellen werden: https://github.com/pythonarcade/learn-arcade-work

../../_images/fork.svg
  1. Wir müssen ein „Fork“ des Repositorys erstellen. Dadurch wird deine eigene Kopie des Repositorys erstellt, die unabhängig von meiner ist. Fork das Repository, indem du auf die Schaltfläche fork in der oberen rechten Ecke klicken:

../../_images/fork.png

Forken des Repositorys

  1. Nach einigen Änderung, solltest du deinen eigenen Fork haben. Vergewissere dich, dass du in deinem eigenen Fork bist und nicht auf dem Original, indem du nach deinem Kontonamen suchst:

../../_images/fork_2.png

Verifiziere, dass du an deinem Fork arbeitest und nicht an dem Original Code

  1. Jetzt hast du deinen eigenen Fork, aber er existiert auf dem GitHub-Server und nicht auf deinem Computer. Wir werden das im nächsten Abschnitt beheben.

3.5. Klonen des Repositorys

Bemerkung

Jedes Mal, wenn du auf einem neuen Computer zu arbeiten beginnst, musst du einen neuen Klon erstellen. (Es sei denn, du verwendest ein Flash-Laufwerk.)

  1. Führe unter Windows das Programm „Command Prompt“ aus. Oder, wenn du unter MacOS bist, dann geh unter „Programme“, such nach „Dienstprogramme“ und führ „Terminal“ aus. Du solltest so etwas wie in einer der folgenden Abbildungen erhalten:

../../_images/command_prompt.png

Windows Eingabeaufforderung

../../_images/terminal_window.png

MacOS Terminal Fenster

  1. Überlege dir, wo du deine Dateien speichern möchten. Vielleicht möchtest du sie auf deinem Laptop, einem Flash-Laufwerk oder einem Netzwerklaufwerk speichern. Wenn du dir nicht sicher bist, leg sie einfach auf dem Desktop ab.

  2. Wir müssen unser „Arbeitsverzeichnis“ dorthin ändern, wo wir unsere Dateien speichern wollen. Wenn du es auf deinem Desktop speicherst, gib einfach cd Desktop ein. Unter MacOS wird zwischen Groß- und Kleinschreibung unterschieden.

Bemerkung

Sie können Verzeichnisse mit dem Befehl cd (change directory) wechseln. Wenn du ein Terminal oder eine Eingabeaufforderung öffnen, arbeitest du standardmäßig in dein „Home“-Verzeichnis. Lass uns den Befehl cd verwenden. Es gibt viele Varianten, aber es gibt einige Variationen, die Sie kennen müssen:

  • cd - Wechsel in dein „Home“-Verzeichnis.

  • cd mydir - Wechsel in das Verzeichnis mydir. Dieses Verzeichnis muss im gleichen Verzeichnis sein, in dem Sie sich jetzt befinden. Wenn Sie nicht den ganzen Verzeichnisnamen eingeben wollen, können Sie auch die ersten Buchstaben eingeben und dann <tab> drücken.

  • cd .. - Geht ein Verzeichnis nach oben. Wenn du also in C:\home\user\Desktop sind, gehe nach oben zu C:\home\user.

  1. Wir wollen das von dir erstellte Repository auf deinem Computer kopieren. Wir werden dies einen „Klon“ nennen. Ein Klon ist eine Kopie, die wir normalerweise versuchen, synchron zu halten, was etwas anderes ist als ein „Fork“. Klicken Sie auf die Schaltfläche Code Button und sehen Sie die Abbildung unten. 1) Stelle sicher, dass Sie mit „HTTPS“ klonen. 2) Stellen Sie sicher, dass das angezeigte Konto Ihres ist und nicht meines oder „pythonarcade“. 3) Klicken Sie auf die auf die Schaltfläche „Link kopieren“.

../../_images/github_clone.png
  1. Gebe``git clone`` gefolgt von einem Leerzeichen ein. Zum Schluss füge die kopierte Adresse ein. Möglicherweise müssen Sie die Maus zum Einfügen benutzen, da ctrl-v nicht immer in der Eingabeaufforderung eingefügt wird. Es sollte so aussehen:

../../_images/after_clone.png
  1. Erledigt! nun hast du ein Verzeichnis eingerichtet, in dem du deine Arbeit erledigen kannst.

3.6. Ein Projekt in Pycharm öffnen

Starte PyCharm und wähle dann „Datei…Öffnen“. Du kannst dein Desktop mit dem nicht sehr intuitiven Symbol auswählen, das in (1) unten gezeigt wird. Suchen Sie dann den Ordner und wählen Sie ihn aus, um ihn als Projekt zu öffnen, wie in (2) gezeigt.

../../_images/open_in_pycharm.png

Dein Projekt sollte wie das folgende Bild aussehen. Wenn dies nicht der Fall ist, hast du möglicherweise den falschen Ordner geöffnet. Klicke auf „Datei…Öffnen“ und versuchen Sie es erneut.

../../_images/open_in_pycharm2.png

Wenn du auf den Pfeil neben dem Ordnernamen klicken, Kannst du alle Ordner im Projektordner sehen.

../../_images/open_in_pycharm3.png

Wenn du vorhast, von Computer zu Computer zu wechseln, versuche, auf einem Flash-Drive anstatt auf dem Desktop zu speichern. Dann kannst du dein Projekt imer wieder öffnen, indem Sie einfach „Datei…Öffnen“ wählen.

3.7. Änderrung von Datein

Lass uns üben, eine schnelle Änderung an einer unserer Dateien vorzunehmen. Öffnen dein Projektordner, öffne den Ordner „Lab 1“ und öffne dann „Lab 1“. Geben Sie „Hi“ oder etwas Ähnliches ein.

../../_images/select_lab_file.png

die Datei wird automatisch gespeichert.

3.8. Instarlire Arcade

Während des bearbeiten der Datei, wirst du eine Benachrichtigung die wie folgt aussieht:

../../_images/package_not_installed.png

Instalire die ‚arcade‘ library. PyCharm würd den rest für dich übernehmen.

3.9. Lege deinen Code fest

It is time to commit. Wait! You are young and don’t want to commit yet?

The cool thing with version control, is that every time you commit, you can go back to the code at that point in time. Version control lets you take it all back! It is the best type of commitment ever!

First, open the terminal, and switch to the directory with your project using the cd command:

C:\Users\craven\Desktop>cd learn-arcade-workC:\Users\craven\Desktop\learn-arcade-work>

Optionally, we can use git status to see what files have changed:

C:\Users\craven\Desktop\learn-arcade-work>git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   Lab 01 - First Program/lab_01.py

no changes added to commit (use "git add" and/or "git commit -a")

Now, add all the files that have changed. The -A option means all files. Optionally, we could list out each file, but that’s a lot of work and we don’t want to leave anything behind anyway.

C:\Users\craven\Desktop\learn-arcade-work> git add -A

Commit the changes:

C:\Users\craven\Desktop\learn-arcade-work>git commit -m "Work on lab 1"
[master 5105a0c] Work on lab 1
 1 file changed, 1 insertion(+)

You might get an error, if the computer doesn’t know who you are yet. If you get this error, it will tell you the commands you need to run. They will look like:

git config --global user.email "put.your.email.here@my.simpson.edu"
git config --global user.name "Jane Smith"

Then you can re-run your commit command. You can use the „up“ arrow to get commands you typed in previously so you don’t need to retype anything.

3.10. Push Your Code

And push them to the server:

C:\Users\craven\Desktop\learn-arcade-work>git push
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 329 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
To bitbucket.org:pcraven/arcade-games-work2.git
   519c361..45028a5  master -> master

Look to see if the message says that there is an „error.“ The message will probably look a little different than what you see above, with other objects or threads, but there should not be any errors. If there are errors, skip down to What If You Can’t Push?.

3.11. Turning In Your Programs

When it comes time to turn in one of your programs, go back to GitHub. Click on „source“, find the lab file, copy the URL:

../../_images/copy_url.png

Now go to Scholar and paste the link into the text field for the lab you are are working on.

3.12. What If You Can’t Push?

What happens if you can’t push to the server? If you get an error like what’s below? (See highlighted lines.)

  C:\Users\craven\Desktop\learn-arcade-work> git push
  To bitbucket.org:pcraven/arcade-games-work2.git
   ! [rejected]        master -> master (fetch first)
  error: failed to push some refs to 'git@bitbucket.org:pcraven/arcade-games-work2.git'
  hint: Updates were rejected because the remote contains work that you do
  hint: not have locally. This is usually caused by another repository pushing
  hint: to the same ref. You may want to first integrate the remote changes
  hint: (e.g., 'git pull ...') before pushing again.
  hint: See the 'Note about fast-forwards' in 'git push --help' for details.

You are getting an error because there are changes on the server that aren’t on your computer. You need to pull and merge those changes.

3.12.1. Step 1: Pull Changes From The Server

Pull changes from the server:

git pull

Normally, this will work fine and you’ll be done. If so, you can do a git push and your code will be pushed to the server.

3.12.1.1. Step 2: Merging

If you get a screen like the image below, the computer automatically merged your code bases but it now wants you to type in a comment for the merge. We’ll take the default comment. Hold down the shift key and type ZZ. If that doesn’t work, hit escape, and then try again.

(You are in an editor called vim and it is asking you for a comment about merging the files. Unfortunately vim is really hard to learn. Shift-ZZ is the command to save, and all we want to do is get out of it and move on.)

../../_images/vi_merge.png

It should finish with something that looks like:

Merge made by the 'recursive' strategy.
 Lab 01 - First Program/lab_01.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

If instead you get this:

Then we edited the same file in the same spot. We have to tell the computer if we want our changes, or the changes on the other computer.

3.12.1.2. Step 3: Resolving a Merge Conflict

Do a git status. It should look something like this:

C:\Users\craven\Desktop\learn-arcade-work> git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   Lab 01 - First Program/lab_01.py

no changes added to commit (use "git add" and/or "git commit -a")

The key thing to look for is any file that says both modified.

If you want your copy, type:

git checkout --ours "Lab 01 - First Program/lab_01.py"

If instead you want their copy (or the copy on the other computer) type

git checkout --theirs "Lab 01 - First Program/lab_01.py"

Then when you are all done with all merges, type:

C:\Users\craven\Desktop\learn-arcade-work> git add *

C:\Users\craven\Desktop\learn-arcade-work> git commit -m"Merged"
[master e083f36] Merged

C:\Users\craven\Desktop\learn-arcade-work> git push
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 531 bytes | 0 bytes/s, done.
Total 5 (delta 2), reused 0 (delta 0)
To bitbucket.org:pcraven/arcade-games-work2.git
   6a8f398..e083f36  master -> master

3.12.2. Step 4: Try Pushing Again

C:\Users\craven\Desktop\learn-arcade-work> git push
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 604 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To bitbucket.org:pcraven/arcade-games-work2.git
   d66b008..aeb9cf3  master -> master

3.13. Longer Git Command Reference

In my experience with 300 level group-project classes, these commands seem to capture most of what students need to do.

Command

Description

git status

See what has changed

git fetch

Grab stuff from the server, but don’t merge

git merge --no-commit --no-ff test_branch

Merge

git merge --abort

Abort a merge

git pull

Fetch and Merge

git add myfile.txt

Add myfile.txt to be committed

git add .

Add everything

grep -r "<< HEAD" *

Search all files to see if there is merge error text. Do this before committing

git checkout --ours "myfile.txt"

Toss your changes in a merge, use theirs

git checkout --theirs "myfile.txt"

Toss their changes, use yours

git checkout -- .

Remove all your changes, go back to what was last committed. Untracked files are kept.

git -f clean

Remove untracked files

git checkout 44fd

Find the hash of a check-in, and you can go back to that check in. (Don’t use 44fd, but replace with the has you want.)

git checkout master

Go back to most recent check in on the master branch.

git commit -m "My message"

Commit your work. Use a descriptive message or the other people in the class will be irritated with you.

git push

Push commit up to the server.