Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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. $ whoami Sujeevan Vijayakumaran Castrop-Rauxel, Ruhrpott @svijee svij.org [email protected] (noch)

    Consultant „Versionskontrolle mit Git“ (2019) – – – / 2
  2. 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
  3. 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
  4. git switch • Nicht alltäglich? • Nicht ganz: Eher neu

    und experimentell • seit Git 2.23 @svijee Sujeevan Vijayakumaran 4
  5. 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
  6. git switch Status Quo: • git checkout master • git

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

    switch -c feature/1337 • git switch -c feature/1337 master @svijee Sujeevan Vijayakumaran 7
  8. git restore • Nicht alltäglich? • Nicht ganz: Eher neu

    und experimentell • seit Git 2.23 @svijee Sujeevan Vijayakumaran 8
  9. 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
  10. git restore Status Quo: • git checkout –– index.html •

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

    restore ––staged index.html • git restore ––source feature/1337 index.html @svijee Sujeevan Vijayakumaran 11
  12. git filter-repo git filter-repo ist ein neuer (externer) Ersatz für

    git filter-branch @svijee Sujeevan Vijayakumaran 12
  13. 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
  14. git filter-branch Rückblick git filter-branch: • Deprecated • Langsam •

    Fehleranfällig bei komplexen Fällen @svijee Sujeevan Vijayakumaran 14
  15. git filter-repo 1. Beispiel: .DS_STORE entfernen: $ git filter-repo ––invert-paths

    ––path-glob ’*/.DS_Store’ ––path ’.DS_Store’ @svijee Sujeevan Vijayakumaran 15
  16. 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
  17. git filter-repo 3. Beispiel: (Binär)dateien nach Größe entfernen: $ git

    filter-repo ––strip-blobs-bigger-than 10M @svijee Sujeevan Vijayakumaran 18
  18. 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
  19. 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
  20. git rerere • Vorbedingung: Rebase eines langlebigen Topic-Branches • Problem:

    Merge-Konflikt bei jedem Rebase-Schritt • Lösung: git rerere @svijee Sujeevan Vijayakumaran 21
  21. 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
  22. Commit-Template Jeder muss es lokal konfigurieren! $ git config ––global

    commit.template .git-commit-template @svijee Sujeevan Vijayakumaran 25
  23. 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
  24. 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
  25. 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
  26. 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
  27. Ihr habt die Wahl: „How To Commit: Nachvollziehbare Git-Historien“ ODER

    „Dinge, die man nicht mit Git tun sollte“ @svijee Sujeevan Vijayakumaran 30
  28. 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