git

git klonen

http://rogerdudler.github.io/git-guide/index.de.html

http://marklodato.github.io/visual-git-guide/index-en.html

https://www.neonscience.org/version-control-git-series

https://de.atlassian.com/git/tutorials/undoing-changes

https://git-scm.com/book/de/v1/Git-Grundlagen-%C3%84nderungen-r%C3%BCckg%C3%A4ngig-machen

http://de.gitready.com/beginner/2009/01/18/the-staging-area.html

https://rubygarage.org/blog/most-basic-git-commands-with-examples

Einführung: https://rogerdudler.github.io/git-guide/index.de.html

git clone https://github.com/dabmake/Makebench

Klone nach 'Makebench' ...
remote: Enumerating objects: 11, done.
remote: Counting objects: 100% (11/11), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 11 (delta 1), reused 0 (delta 0), pack-reused 0
Entpacke Objekte: 100% (11/11), Fertig.
Prüfe Konnektivität ... Fertig.
dab@dab-Predator:~$ cd Makebench/
dab@dab-Predator:~/Makebench$ ls
README.md  singe-board-computer  single-board-computer
dab@dab-Predator:~/Makebench$ cd single-board-computer/
dab@dab-Predator:~/Makebench/single-board-computer$ nano suite-definition.xml 
dab@dab-Predator:~/Makebench/single-board-computer$ git add suite-definition.xml 
dab@dab-Predator:~/Makebench/single-board-computer$ git commit -m "changed system/openssl to pts/openssl"

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'dab@dab-Predator.(none)')

ok, also Anlegen user id

git config --global user.email "dab@ct.de"
git commit -m "changed system/openssl to pts/openssl"
[master 6a3acf1] changed system/openssl to pts/openssl
 1 file changed, 1 insertion(+), 1 deletion(-)
dab@dab-Predator:~/Makebench/single-board-computer$

Jetzt zum Repo pushen

git push origin master
Username for 'https://github.com': 
Password for 'https://dabmake@github.com': 
Zähle Objekte: 4, Fertig.
Delta compression using up to 8 threads.
Komprimiere Objekte: 100% (3/3), Fertig.
Schreibe Objekte: 100% (4/4), 350 bytes | 0 bytes/s, Fertig.
Total 4 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/dabmake/Makebench
   3b9af85..6a3acf1  master -> master
dab@dab-Predator:~/Makebench/single-board-computer$

Gelöschte Dateien committen

dab@dab-Predator:~/Makebench$ rm -rf singe-board-computer/
dab@dab-Predator:~/Makebench$ ls
README.md  single-board-computer
dab@dab-Predator:~/Makebench$ git add *
dab@dab-Predator:~/Makebench$ git commit -m "removed double folderl"
Auf Branch master
Ihr Branch ist auf dem selben Stand wie 'origin/master'.
Änderungen, die nicht zum Commit vorgemerkt sind:
    gelöscht:       singe-board-computer/suite-definition.xml

keine Änderungen zum Commit vorgemerkt
dab@dab-Predator:~/Makebench$ git add -u
dab@dab-Predator:~/Makebench$ git commit -m "removed double folderl"
[master 10c639c] removed double folderl
 1 file changed, 77 deletions(-)
 delete mode 100644 singe-board-computer/suite-definition.xml
dab@dab-Predator:~/Makebench$ git push origin master
Username for 'https://github.com': dabmake
Password for 'https://dabmake@github.com': 
Zähle Objekte: 2, Fertig.
Delta compression using up to 8 threads.
Komprimiere Objekte: 100% (2/2), Fertig.
Schreibe Objekte: 100% (2/2), 271 bytes | 0 bytes/s, Fertig.
Total 2 (delta 0), reused 0 (delta 0)
To https://github.com/dabmake/Makebench
   6a3acf1..10c639c  master -> master
dab@dab-Predator:~/Makebench$

neues Repo mit git anlegen

Neues Repo für Python-Skripte für Anki Vector

dab@dab-Alpha:~/anki_ws$ ls -al
insgesamt 20
drwxr-xr-x  2 dab dab 4096 Feb  9 12:24 .
drwxr-xr-x 31 dab dab 4096 Feb  7 00:29 ..
-rw-r--r--  1 dab dab 2566 Feb  8 20:00 drive.py
-rw-r--r--  1 dab dab  975 Feb  9 12:24 image.py
-rw-r--r--  1 dab dab 1056 Jan 19 09:16 ruler.py

3 Dateien mit unterschiedlich langen Skripten

dab@dab-Alpha:~/anki_ws$ git init
Leeres Git-Repository in /home/dab/anki_ws/.git/ initialisiert
dab@dab-Alpha:~/anki_ws$ ls -al
insgesamt 24
drwxr-xr-x  3 dab dab 4096 Feb 10 11:48 .
drwxr-xr-x 31 dab dab 4096 Feb  7 00:29 ..
-rw-r--r--  1 dab dab 2566 Feb  8 20:00 drive.py
drwxr-xr-x  7 dab dab 4096 Feb 10 11:48 .git
-rw-r--r--  1 dab dab  975 Feb  9 12:24 image.py
-rw-r--r--  1 dab dab 1056 Jan 19 09:16 ruler.py

hinzugekommen ist ein Versteckter Ordner names .git

dab@dab-Alpha:~/anki_ws$ cd .git
dab@dab-Alpha:~/anki_ws/.git$ ls -al
insgesamt 40
drwxr-xr-x 7 dab dab 4096 Feb 10 11:48 .
drwxr-xr-x 3 dab dab 4096 Feb 10 11:48 ..
drwxr-xr-x 2 dab dab 4096 Feb 10 11:48 branches
-rw-r--r-- 1 dab dab   92 Feb 10 11:48 config
-rw-r--r-- 1 dab dab   73 Feb 10 11:48 description
-rw-r--r-- 1 dab dab   23 Feb 10 11:48 HEAD
drwxr-xr-x 2 dab dab 4096 Feb 10 11:48 hooks
drwxr-xr-x 2 dab dab 4096 Feb 10 11:48 info
drwxr-xr-x 4 dab dab 4096 Feb 10 11:48 objects
drwxr-xr-x 4 dab dab 4096 Feb 10 11:48 refs

Die Daten und Ordner enthalten im Moment eher nur Dummy-Daten und müssen/sollten konfiguriert werden. Da wir planen, später das Repo auf Github zu pushen, konfigurieren wir die Nutzerdaten. Die kann man in die Datei config für jedes Repo einzeln schreiben, oder global mit folgenden Befehlen anlegen.

dab@dab-Alpha:~/anki_ws$ git config --global user.name "dabmake"
dab@dab-Alpha:~/anki_ws$ git config --global user.email "dab@ct.de"

git erzeugt die Datei .gitconfig im Home-Verzeichnis mit folgendem Inhalt:

[user]
        name = dabmake
        email = dab@ct.de

Die Konfiguration lässt sich abfragen:

dab@dab-Alpha:~/anki_ws$ git config --list
user.name=dabmake
user.email=dab@ct.de
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true

Bislang ist noch nichts weiter mit git versioniert, wie folgender Befehl zeigt

dab@dab-Alpha:~/anki_ws$ git status

Auf Branch master

Noch keine Commits

Unversionierte Dateien:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)

    drive.py
    image.py
    ruler.py

nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien
(benutzen Sie "git add" zum Versionieren)

Nun können wir Dateien zur Staging Area hinzufügen, und zwar mit git add -A oder git add . Im Unterschied zur letzteren Schreibweise fügt die erstere ALLE neuen und geänderten Dateien hinzu, auch die in Unterordnern.

dab@dab-Alpha:~/anki_ws$ git add -A
dab@dab-Alpha:~/anki_ws$ git status
Auf Branch master

Noch keine Commits

zum Commit vorgemerkte Änderungen:
  (benutzen Sie "git rm --cached <Datei>..." zum Entfernen aus der Staging-Area)

    neue Datei:     drive.py
    neue Datei:     image.py
    neue Datei:     ruler.py

Prinzipiell kann man Dateien erst in der Staging Area (index) sammeln und ggfs wieder rausnehmen. Damit ist man flexibler in der Vorbereitung der zu veröffentlichenden Daten für die nächste Version (Head), sprich Commit. Damit kann man zwar alle lokalen Daten ändern, ist aber nicht gezwungen, alle gleichzeitig zu “veröffentlichen”, sondern nur eine Auswahl.

git commit -m "add first scripts"
[master (Basis-Commit) 163443b] add first scripts
 3 files changed, 147 insertions(+)
 create mode 100644 drive.py
 create mode 100644 image.py
 create mode 100644 ruler.py

In diversen Ordner und Dateien haben sich nun Dinge verändert. Die drei Skripte sind in das Versioncontrol-System in die aktuelle Version eingegangen (HEAD).

Git remote

Das lokale Repo lässt sich nun in ein entferntes Repo speichern. Das muss aber zuvor etwa auf Guthub angelegt werden, damit man dort hineinschreiben kann. Viele Anleitungen schlagen vor, das Repo per Webinterface anzulegen. Das ist mitunter jedoch aufwändiger, als es gleich über die Shell zu erledigen. Allerdings kennt git selbst keinen direkten Befehl, ein Repo anzulegen, deshalb erledigt folgendes Skript git-create das, das direkt über die Github-REST-API geht.

#!/bin/sh

repo_name=$1
test -z $repo_name && echo "Repo name required." 1>&2 && exit 1

curl -u 'dabmake' https://api.github.com/user/repos -d "{\"name\":\"$repo_name\"}"

Damit legen wir das Repo AnkiVector unter dabmake an

dab@dab-Alpha:~/anki_ws$ git-create AnkiVector
Enter host password for user 'dabmake':
{
  "id": 12345678,
  "node_id": "MDEwOlJlcG9zaXRvcnkxNjk5NzY1NTU=",
  "name": "AnkiVector",
  "full_name": "dabmake/AnkiVector",
  "private": false,
  "owner": {
    "login": "dabmake",
    "id": 12345678,
    "node_id": "MDQ6VXNlcjE2NzAyMjEz",
    "avatar_url": "https://avatars0.githubusercontent.com/u/16702213?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/dabmake",
    "html_url": "https://github.com/dabmake",
    "followers_url": "https://api.github.com/users/dabmake/followers",
    "following_url": "https://api.github.com/users/dabmake/following{/other_user}",
    "gists_url": "https://api.github.com/users/dabmake/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/dabmake/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/dabmake/subscriptions",
    "organizations_url": "https://api.github.com/users/dabmake/orgs",
    "repos_url": "https://api.github.com/users/dabmake/repos",
    "events_url": "https://api.github.com/users/dabmake/events{/privacy}",
    "received_events_url": "https://api.github.com/users/dabmake/received_events",
    "type": "User",
    "site_admin": false
  },
  "html_url": "https://github.com/dabmake/AnkiVector",
  "description": null,
  "fork": false,
  "url": "https://api.github.com/repos/dabmake/AnkiVector",
  "forks_url": "https://api.github.com/repos/dabmake/AnkiVector/forks",
  "keys_url": "https://api.github.com/repos/dabmake/AnkiVector/keys{/key_id}",
  "collaborators_url": "https://api.github.com/repos/dabmake/AnkiVector/collaborators{/collaborator}",
  "teams_url": "https://api.github.com/repos/dabmake/AnkiVector/teams",
  "hooks_url": "https://api.github.com/repos/dabmake/AnkiVector/hooks",
  "issue_events_url": "https://api.github.com/repos/dabmake/AnkiVector/issues/events{/number}",
  "events_url": "https://api.github.com/repos/dabmake/AnkiVector/events",
  "assignees_url": "https://api.github.com/repos/dabmake/AnkiVector/assignees{/user}",
  "branches_url": "https://api.github.com/repos/dabmake/AnkiVector/branches{/branch}",
  "tags_url": "https://api.github.com/repos/dabmake/AnkiVector/tags",
  "blobs_url": "https://api.github.com/repos/dabmake/AnkiVector/git/blobs{/sha}",
  "git_tags_url": "https://api.github.com/repos/dabmake/AnkiVector/git/tags{/sha}",
  "git_refs_url": "https://api.github.com/repos/dabmake/AnkiVector/git/refs{/sha}",
  "trees_url": "https://api.github.com/repos/dabmake/AnkiVector/git/trees{/sha}",
  "statuses_url": "https://api.github.com/repos/dabmake/AnkiVector/statuses/{sha}",
  "languages_url": "https://api.github.com/repos/dabmake/AnkiVector/languages",
  "stargazers_url": "https://api.github.com/repos/dabmake/AnkiVector/stargazers",
  "contributors_url": "https://api.github.com/repos/dabmake/AnkiVector/contributors",
  "subscribers_url": "https://api.github.com/repos/dabmake/AnkiVector/subscribers",
  "subscription_url": "https://api.github.com/repos/dabmake/AnkiVector/subscription",
  "commits_url": "https://api.github.com/repos/dabmake/AnkiVector/commits{/sha}",
  "git_commits_url": "https://api.github.com/repos/dabmake/AnkiVector/git/commits{/sha}",
  "comments_url": "https://api.github.com/repos/dabmake/AnkiVector/comments{/number}",
  "issue_comment_url": "https://api.github.com/repos/dabmake/AnkiVector/issues/comments{/number}",
  "contents_url": "https://api.github.com/repos/dabmake/AnkiVector/contents/{+path}",
  "compare_url": "https://api.github.com/repos/dabmake/AnkiVector/compare/{base}...{head}",
  "merges_url": "https://api.github.com/repos/dabmake/AnkiVector/merges",
  "archive_url": "https://api.github.com/repos/dabmake/AnkiVector/{archive_format}{/ref}",
  "downloads_url": "https://api.github.com/repos/dabmake/AnkiVector/downloads",
  "issues_url": "https://api.github.com/repos/dabmake/AnkiVector/issues{/number}",
  "pulls_url": "https://api.github.com/repos/dabmake/AnkiVector/pulls{/number}",
  "milestones_url": "https://api.github.com/repos/dabmake/AnkiVector/milestones{/number}",
  "notifications_url": "https://api.github.com/repos/dabmake/AnkiVector/notifications{?since,all,participating}",
  "labels_url": "https://api.github.com/repos/dabmake/AnkiVector/labels{/name}",
  "releases_url": "https://api.github.com/repos/dabmake/AnkiVector/releases{/id}",
  "deployments_url": "https://api.github.com/repos/dabmake/AnkiVector/deployments",
  "created_at": "2019-02-10T12:37:28Z",
  "updated_at": "2019-02-10T12:37:28Z",
  "pushed_at": "2019-02-10T12:37:29Z",
  "git_url": "git://github.com/dabmake/AnkiVector.git",
  "ssh_url": "git@github.com:dabmake/AnkiVector.git",
  "clone_url": "https://github.com/dabmake/AnkiVector.git",
  "svn_url": "https://github.com/dabmake/AnkiVector",
  "homepage": null,
  "size": 0,
  "stargazers_count": 0,
  "watchers_count": 0,
  "language": null,
  "has_issues": true,
  "has_projects": true,
  "has_downloads": true,
  "has_wiki": true,
  "has_pages": false,
  "forks_count": 0,
  "mirror_url": null,
  "archived": false,
  "open_issues_count": 0,
  "license": null,
  "forks": 0,
  "open_issues": 0,
  "watchers": 0,
  "default_branch": "master",
  "permissions": {
    "admin": true,
    "push": true,
    "pull": true
  },
  "allow_squash_merge": true,
  "allow_merge_commit": true,
  "allow_rebase_merge": true,
  "network_count": 0,
  "subscribers_count": 1
}

Jetzt können wir das remote Repo dem lokalen git bekannt machen

dab@dab-Alpha:~/anki_ws$ git remote add origin https://github.com/dabmake/AnkiVector.git

dab@dab-Alpha:~/anki_ws$ git push origin master
Username for 'https://github.com': dabmake
Password for 'https://dabmake@github.com': 
Zähle Objekte: 5, Fertig.
Delta compression using up to 4 threads.
Komprimiere Objekte: 100% (5/5), Fertig.
Schreibe Objekte: 100% (5/5), 1.57 KiB | 536.00 KiB/s, Fertig.
Total 5 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/dabmake/AnkiVector.git
 * [new branch]      master -> master

Dateien ändern

lädt man eine geändete Datei auf github hoch, so kann man dort unter den einzelnen Dateien und dem den Punkt History die Änderungen einsehen. Alle comitteten Version sind in einer Liste zu finden. Klick man auf die Option mit den ID, so zeigt github die diff-Datei an, die sich auch zum Patchen benutzen lässt.

enter image description here

So sehen die diffs aus

enter image description here Aber auch mit git selbst lassen sich die Änderungen zwischen zwei Commits ausgeben:

    dab@dab-Alpha:~/anki_ws$ git log
    commit d53e20dbddb64fb59eb6f92c95c199b89834e596 (HEAD -> master, origin/master)
    Author: dabmake <dab@ct.de>
    Date:   Sun Feb 10 19:43:12 2019 +0100

        added 3D map, switched to position instead pose

    commit 163443b4fc70fff162374bf43e2ba07c85ad47ff
    Author: dabmake <dab@ct.de>
    Date:   Sun Feb 10 13:55:13 2019 +0100

        add first scripts
    dab@dab-Alpha:~/anki_ws$ git diff 163443b4fc70fff162374bf43e2ba07c85ad47ff d53e20dbddb64fb59eb6f92c95c199b89834e596
    diff --git a/drive.py b/drive.py
    index c43777f..7c13135 100644
    --- a/drive.py
    +++ b/drive.py
    @@ -19,66 +19,74 @@

     import anki_vector

    -from anki_vector.util import degrees, distance_mm, speed_mmps
    +from anki_vector.util import degrees, distance_mm, speed_mmps, Position
    +

     def main():
         args = anki_vector.util.parse_command_args()
    - 
    -    with anki_vector.Robot() as robot:
    +    #anki_vector.nav_map.NavMapComponent.init_nav_map_feed(frequency=0.5)
    +    with anki_vector.Robot(args.serial, show_3d_viewer=True) as robot:
    +        robot.show_viewer=True
             robot.enable_camera_feed=True
    -        #robot.init_camera_feed()
    -        image = robot.camera.latest_image
    -        image.show()
    -        current_robot_pose = robot.pose
    +        robot.viewer.show_video()
    +        
    +        robot.enable_custom_object_detection=True
    +        robot.enable_nav_map_feed=True
    +
    +
    +
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose)    
             print("Drive Vector off of charger...")
             robot.behavior.drive_off_charger()
    -        current_robot_pose = robot.pose
    +        
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose)    
    -
    -
    +        
             robot.behavior.drive_straight(distance_mm(100), speed_mmps(100))
    -        current_robot_pose = robot.pose
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose) 

             robot.behavior.turn_in_place(degrees(90))   
    -        current_robot_pose = robot.pose
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose) 



             robot.behavior.drive_straight(distance_mm(100), speed_mmps(100))
    -        current_robot_pose = robot.pose
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose)    

             robot.behavior.turn_in_place(degrees(90))   
    -        current_robot_pose = robot.pose
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose) 


             robot.behavior.drive_straight(distance_mm(100), speed_mmps(100))
    -        current_robot_pose = robot.pose
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose)    

             robot.behavior.turn_in_place(degrees(90))   
    -        current_robot_pose = robot.pose
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose) 


             robot.behavior.drive_straight(distance_mm(100), speed_mmps(100))
    -        current_robot_pose = robot.pose
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose)    

             robot.behavior.turn_in_place(degrees(90))   
    -        current_robot_pose = robot.pose
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose) 

    -
    +        #latest_nav_map = robot.nav_map.latest_nav_map
    +        #throws exception not to be initialized

             robot.behavior.drive_on_charger()
    -        current_robot_pose = robot.pose
    +        current_robot_pose = robot.pose.position
             print (current_robot_pose)    

    +    

     if __name__ == '__main__':
         main()

Änderungen rückgängig machen

Wir haben im lokalen Verzeichnis die Datei drive.py verändert, merken aber, dass das keine gute Idee war. Mit git checkout lässt sich das reparieren

dab@dab-Alpha:~/anki_ws$ git status
Auf Branch master
Änderungen, die nicht zum Commit vorgemerkt sind:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)
  (benutzen Sie "git checkout -- <Datei>...", um die Änderungen im Arbeitsverzeichnis zu verwerfen)

    geändert:       drive.py

keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")

dab@dab-Alpha:~/anki_ws$ git checkout -- drive.py

dab@dab-Alpha:~/anki_ws$ git status
Auf Branch master
nichts zu committen, Arbeitsverzeichnis unverändert

Written with StackEdit.