Repository mit Git ⋆

  • Beitrags-Autor:
  • Beitrags-Kategorie:Software

Das lokale Verzeichnis c:\develop\my_project soll auf dem NAS verfügbar gemacht werden. Die Freigabe der NAS ist als Laufwerk X:\ eingebunden.

Im ersten Schritt die Quelle vorbereiten. Es wird eine Kopie vom aktuellen lokalen Repositiory ohne Arbeitsverzeichnis erzeugt. Die Kopie wird auf das NAS verschoben.

cd c:\develop
git clone --bare my_project my_project.git
xcopy my_project.git x:\repros\my_project.git /S /E
rd my_project.git /S /Q

Abschließend wird das lokale Arbeitsverzeichnis mit dem neue Repositiory für den gemeinsamen Austausch verbunden.

cd c:\develop\my_project
git remote add origin x:\repros\my_project.git
git remote -v
git remote show origin

Nun können Änderungen auf dem NAS veröffentlicht werden.

cd c:\develop\my_project
git status
git commit -am "my important comment"
git log -1
git show-branch *master
git push origin master

Diff

# Änderungen prüfen
git diff --check
# Anderungen zwischen zwei Commits
git diff --oneline fe3105f 36ef02d abc.txt
# Änderungen zum Parent
git show --color --pretty=format:%b XXXXXX
git diff-tree -p XXXXXX
gitk ..feature-abc

siehe auch Git-Referenz in Bildern

Taggen

git tag -a v0.2 -m "Version 2020/08, Abc, Def"
git push origin --tags
git tag -l
git show v0.2
# delete tag
git tag -d v0.2
git push origin --delete v0.2

siehe auch Erklärung im Grundlagen-Kapitel

Alias

aufwendige Parameterketten zusammenfassen/verinfachen

# mit Git
git config --global alias.lg "log --all --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg
# per Bash
alias gl="git log --pretty=format:'%C(auto)%h%C(blue) %<|(19)%as%C(auto)%d %s'"

Zeilenende

automatische Ersetzung ausschalten (ggf. VSCode Strg+P „Change End of Line sequence“)

git config --global core.autocrlf false

siehe auch Git Zeilenenden, empfohlen wird \n

stash

# Halt work on the branch feature-X
git stash
git checkout -b feature-Y origin/main
# Hack, hack, hack…
git checkout feature-X or git switch -
git stash pop
# Resume work on feature-X

siehe auch 4 tips for context switching in Git

git stash list
git stash show stash@{1}
git stash show -p stash@{1}
git diff stash@{1}^!
git stash apply stash@{1}

fetch

# zum Branch wechseln
git switch main
# Branch aktualisieren
git fetch
# Änderungen anschauen
git log --oneline origin/main
# ...oder nur Neues
git log --oneline main..origin/main

siehe auch Git Fetch: Definition & Examples

Branches

# Branch "develop" erstellen und aktivieren
git checkout -b develop
# alle Branches zeigen
git branch -avv
# Remote-Branch holen
git checkout --track origin/newsletter
# einzelne Datei aus Branch feature-xyz übernehmen
git show feature-xyz:docs/demo.txt
git switch master
git checkout --patch feature-xyz docs/demo.txt
# Branch "master" öffnen und "develop" einarbeiten
git checkout master
git merge develop
# Branch "develop" löschen
git branch -d develop
git push origin --delete origin/develop
git fetch --prune
# lists branches merged into master
git branch --merged master

Mit for branch in `git branch -r --merged | grep -v HEAD`; do echo -e `git show --format="%ci %cr %an" $branch | head -n 1` \\t$branch; done | sort -r werden die Branches und ihre Autoren aufgelistet.

Commit aus Master in neuen Branch

# neuen Branch anlegen (Code aktuell im Master)
git branch new-feed
# einen Commit den Master zurücksetzen (statt 1 auch ander Schrittzahl möglich)
git reset --hard HEAD~1
# zum neuen Branch wechseln (geschriebener Code kommt im neuen Branch an)
git checkout new-feed

Commit aus Master in bestehenden Branch

# zum bestehenden Branch wechseln
git checkout feed-exists
# alle Commits vom Master übernehmen
git merge master
# zum Master wechseln und diesen zurücksetzen (einen oder mehrere Commits)
git checkout master
git reset --hard HEAD~1

Repo bereinigen

# lokale Verweise nach Merge löschen
git remote prune origin
# interne Repräsnetation neu aufbauen
git repack
# interne Repräsentation aufräumen
git prune-packed
# Refs/Commits ohne Zugriff älter 2 Wochen entfernen
git gc --aggressive

Sonstiges

git config --global user.name "Karl Mustermann"
git config --global user.email karl@mustermann.de
# git config --global --edit
git commit --amend --reset-author
# SSL-Prüfung deaktivieren
git -c http.sslVerify=false push
# Änderung ohne Commit (vor Stage) rückgängig machen
git checkout -- hosts.txt
# lokale Änderungen zurücksetzen (-n ist Vorschau)
git fetch origin
git reset --hard origin/master
git clean -n -f
# eine Vaiable im Arbeitsverzeichnis abfragen
git config --get --bool core.bare
# Änderung im Arbeitsverzeichnis rückgangig machen
git reset hosts.txt
# mit erstem Push den Upstream konfigurieren
# im Anschluss nur noch: git push
git push --set-upstream origin master
# Benutzer nachträglich ändern
git config --global --edit
git commit --amend --reset-author
# Wartung durchführen
git count-objects -v
git fsck --full
git gc --auto
git remote set-url origin https://git.meine.de/ich/REPO.git
git pull origin master --allow-unrelated-histories
# Dateien vom Commit
git show --pretty="" --name-only 16f0
# Repo durchsuchen
git rev-list --all | xargs git grep -F 'dbtool'
# Repo aufräumen
git gc --prune=now --aggressive
# Commits zählen
git rev-list --count feature-fa

siehe auch: Git version control with Eclipse (EGit), A guide to Git… oder How to fix a broken repository?