$30 off During Our Annual Pro Sale. View Details »

Nicht alltägliche Git-Funktionen 2.0

Nicht alltägliche Git-Funktionen 2.0

Gewohnte Git-Nutzer nutzen hauptsächlich folgende Kommandos: git add, git commit, git checkout, git merge, git push und git pull.

Doch Git bietet noch viel mehr Funktionen die man beim alltäglichen
Arbeiten nicht immer braucht. Trotzdem kann es sehr hilfreich sein,
diese Funktionen zu kennen, denn wenn man sie braucht, dann können sie wertvolle Zeit sparen. Darunter fallen Funktionen wie das Neu-Schreiben der kompletten Historie, um etwa Binärdateien oder Passwörter zu entfernen, die Wiederherstellung kaputter Branches oder
verlorengegangener Commits und auch Spezialfälle beim Rebasen.

Der Talk richtet sich an diejenigen, die Git schon grundsetzlich kennen
und neue nützliche Kenntnisse in der Nutzung gewinnen wollen. Dies ist
eine überarbeitete Fassung eines bereits existierenden Vortrages von
mir, den ich vor ein paar Jahren auf einer anderen Konferenz gehalten habe.

Sujeevan Vijayakumaran

February 20, 2020
Tweet

More Decks by Sujeevan Vijayakumaran

Other Decks in Programming

Transcript

  1. Nicht alltägliche Git Funktionen 2.0
    Sujeevan Vijayakumaran
    @svijee svij.org
    20. Februar 2020

    View Slide

  2. $ whoami
    Sujeevan Vijayakumaran
    Castrop-Rauxel, Ruhrpott
    @svijee
    svij.org
    [email protected]
    (noch) Consultant
    „Versionskontrolle mit Git“ (2019)
    – – –
    / 2

    View Slide

  3. Was bisher geschah ...
    @svijee Sujeevan Vijayakumaran 1

    View Slide

  4. Nicht alltägliche Git Funktionen 1.0
    • FrOSCon 2017: „Nicht alltägliche Git Funktionen“
    • Aufzeichnung: https://media.ccc.de/v/froscon2017-1919-nicht_
    alltagliche_git-funktionen
    @svijee Sujeevan Vijayakumaran 2

    View Slide

  5. Nicht alltägliche Git Funktionen 1.0
    Behandelte Themen:
    • git bisect
    • git add -p
    • git alias
    • git log
    • git diff ––word-diff
    • git grep
    • git rebase -i
    • git reflog
    • git gc
    • git blame
    • git filter-branch
    • git worktree
    • git diff von Binärdateien
    • .gitattributes
    @svijee Sujeevan Vijayakumaran 3

    View Slide

  6. git switch
    @svijee Sujeevan Vijayakumaran 3

    View Slide

  7. git switch
    • Nicht alltäglich?
    • Nicht ganz: Eher neu und experimentell
    • seit Git 2.23
    @svijee Sujeevan Vijayakumaran 4

    View Slide

  8. git switch
    • 1. Problem: git checkout ist wenig einsteigerfreundlich
    • 2. Problem: git checkout lässt sich nicht problemlos einsteigerfreundlich
    machen
    • 3. Problem: git checkout hat (quasi) zwei Funktionen
    • Lösung: neuer Befehl git switch
    @svijee Sujeevan Vijayakumaran 5

    View Slide

  9. git switch
    Status Quo:
    • git checkout master
    • git checkout -b feature/1337
    • git checkout -b feature/1337 develop
    @svijee Sujeevan Vijayakumaran 6

    View Slide

  10. git switch
    Status Futurus:
    • git switch master
    • git switch -c feature/1337
    • git switch -c feature/1337 master
    @svijee Sujeevan Vijayakumaran 7

    View Slide

  11. git restore
    @svijee Sujeevan Vijayakumaran 7

    View Slide

  12. git restore
    • Nicht alltäglich?
    • Nicht ganz: Eher neu und experimentell
    • seit Git 2.23
    @svijee Sujeevan Vijayakumaran 8

    View Slide

  13. git restore
    • 1. Problem: git checkout ist wenig einsteigerfreundlich
    • 2. Problem: git checkout lässt sich nicht problemlos einsteigerfreundlich
    machen
    • 3. Problem: git checkout hat (quasi) zwei Funktionen
    • Lösung: neuer Befehl git restore
    @svijee Sujeevan Vijayakumaran 9

    View Slide

  14. git restore
    Status Quo:
    • git checkout –– index.html
    • git checkout feature/1337 –– index.html
    @svijee Sujeevan Vijayakumaran 10

    View Slide

  15. git restore
    Status Futurus:
    • git restore index.html
    • git restore ––staged index.html
    • git restore ––source feature/1337 index.html
    @svijee Sujeevan Vijayakumaran 11

    View Slide

  16. git filter-repo
    Neuschreiben der kompletten Git-Historie
    @svijee Sujeevan Vijayakumaran 11

    View Slide

  17. git filter-repo
    git filter-repo ist ein neuer (externer) Ersatz für git filter-branch
    @svijee Sujeevan Vijayakumaran 12

    View Slide

  18. git filter-repo – Komplette Historie neu schreiben
    • 1. Problem: Zugangsdaten im Quellcode
    • 2. Problem: Zugangsdaten sind in jeder Revision drin
    • Lösung: Komplette Historie neuschreiben
    Alternativen: git filter-branch (Deprecated) und BFG Repo-Cleaner
    @svijee Sujeevan Vijayakumaran 13

    View Slide

  19. git filter-branch
    Rückblick git filter-branch:
    • Deprecated
    • Langsam
    • Fehleranfällig bei komplexen Fällen
    @svijee Sujeevan Vijayakumaran 14

    View Slide

  20. git filter-repo
    1. Beispiel: .DS_STORE entfernen:
    $ git filter-repo ––invert-paths ––path-glob ’*/.DS_Store’ ––path
    ’.DS_Store’
    @svijee Sujeevan Vijayakumaran 15

    View Slide

  21. git filter-repo
    2. Beispiel: Texte (wie z.B. Passwörter) ersetzen:
    p455w0rd
    foo==>bar
    $ git filter-repo ––replace-text expressions.txt
    @svijee Sujeevan Vijayakumaran 16

    View Slide

  22. git filter-repo
    Wichtig: Force-Push ist notwendig. Alle müssen neu klonen!
    @svijee Sujeevan Vijayakumaran 17

    View Slide

  23. git filter-repo
    3. Beispiel: (Binär)dateien nach Größe entfernen:
    $ git filter-repo ––strip-blobs-bigger-than 10M
    @svijee Sujeevan Vijayakumaran 18

    View Slide

  24. git subtree
    Niemand hat die Absicht git submodule zu mögen
    @svijee Sujeevan Vijayakumaran 18

    View Slide

  25. git submodule
    Probleme von und mit git submodule:
    • Komplett getrennte Historie
    • Haupt-Repository checkt bestimmten Commit vom Submodule aus
    • Schlechte User Experience
    @svijee Sujeevan Vijayakumaran 19

    View Slide

  26. git subtree
    • Gemeinsame Historie ab Hinzufügen des Subtrees
    • Transparente Nutzung
    • Separater Push des Subtree
    • Nachteil: Separater Push kann schnell vergessen werden
    @svijee Sujeevan Vijayakumaran 20

    View Slide

  27. git rerere
    Reuse Recorded Resolution
    @svijee Sujeevan Vijayakumaran 20

    View Slide

  28. git rerere
    • Vorbedingung: Rebase eines langlebigen Topic-Branches
    • Problem: Merge-Konflikt bei jedem Rebase-Schritt
    • Lösung: git rerere
    @svijee Sujeevan Vijayakumaran 21

    View Slide

  29. git rerere
    • Konfiguration: git config rerere.enabled true
    • 1. Nutzung: Beim Merge/Rebase: Konflikt lösen
    • 2. Nutzung: Beim selben Konflikt: rerere löst Konflikt automatisch
    @svijee Sujeevan Vijayakumaran 22

    View Slide

  30. Commit-Template
    Niemand hat die Absicht schlecht Commit-Messages zu schreiben
    @svijee Sujeevan Vijayakumaran 22

    View Slide

  31. Commit-Template
    Unterstützen beim Schreiben von nicht-ganz-so-schrecklichen Commit-Messages
    @svijee Sujeevan Vijayakumaran 23

    View Slide

  32. Commit-Template
    Quelle: https://gist.github.com/zakkak/7e06725ebd1336bfebebe254de3de825
    @svijee Sujeevan Vijayakumaran 24

    View Slide

  33. Commit-Template
    Jeder muss es lokal konfigurieren!
    $ git config ––global commit.template .git-commit-template
    @svijee Sujeevan Vijayakumaran 25

    View Slide

  34. Diff im Commit anzeigen
    Staging-Bereich während des Committens anzeigen:
    $ git commit -v
    @svijee Sujeevan Vijayakumaran 26

    View Slide

  35. Signierung von Git Commits
    @svijee Sujeevan Vijayakumaran 26

    View Slide

  36. Signierung von Git Commits
    • Problem: Jede Person kann behaupten, eine andere Person zu sein.
    • Lösung: Signierung von Commits
    Hilft u.a. beim Einsatz von GitLab und GitHub!
    @svijee Sujeevan Vijayakumaran 27

    View Slide

  37. Signierung von Git Commits
    Anderes Szenario ...
    • 1. Problem: Ich habe ein Git-Buch geschrieben...
    • 2. Problem: Ich schrieb wie man meinen Namen im lokalen Git konfiguriert...
    • 3. Problem: Leser denkt nicht nach...
    • 4. Problem: Leser kann copy-pasten...
    • 5. Problem: Commits mit meinem Namen finden sich in Git-Repositorys auf
    GitHub, die nicht von mir sind...
    • Lösung: Signierung von Commits
    @svijee Sujeevan Vijayakumaran 28

    View Slide

  38. Signierung von Git Commits
    Vorgehensweise:
    1. GPG-Key erzeugen (wenn nicht vorhanden)
    2. $ git config ––global user.signingkey ABCD1234
    3. $ git config ––global commit.gpgsign true
    4. GPG-Key in GitHub und GitLab im Account hinterlegen
    Resultat: verified Tag an jedem Commit in GitLab/GitHub
    @svijee Sujeevan Vijayakumaran 29

    View Slide

  39. Nicht alltägliche Git Funktionen 1.0
    Behandelte Themen:
    • git bisect
    • git add -p
    • git alias
    • git log
    • git diff ––word-diff
    • git grep
    • git rebase -i
    • git reflog
    • git gc
    • git blame
    • git filter-branch
    • git worktree
    • git diff von Binärdateien
    • .gitattributes
    @svijee Sujeevan Vijayakumaran 30

    View Slide

  40. Fragen?
    @svijee Sujeevan Vijayakumaran 30

    View Slide

  41. Ihr habt die Wahl:
    „How To Commit: Nachvollziehbare Git-Historien“
    ODER
    „Dinge, die man nicht mit Git tun sollte“
    @svijee Sujeevan Vijayakumaran 30

    View Slide

  42. Vielen Dank für die Aufmerksamkeit!
    Folien: https://speakerdeck.com/svij/
    Fragen, Feedback und Fehler gerne per E-Mail an [email protected].
    Blog: svij.org
    Twitter: @svijee
    @svijee Sujeevan Vijayakumaran 31

    View Slide