Git ist eine freie Software zur verteilten Versionsverwaltung von Dateien. Es wurde ursprünglich für die Quellcode-Verwaltung des Linux-Kernels entwickelt.
Die Entwicklung von Git wurde im April 2005 von Linus Torvalds begonnen, um das bis dahin verwendete Versionskontrollsystem BitKeeper zu ersetzen, welches durch eine Lizenzänderung vielen Entwicklern den Zugang verwehrte. Die erste Version erschien bereits wenige Tage nach der Ankündigung.
selbst-gehostet:
cloud-hosting:
Liste der Befehl ausgeben:
git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS] The most commonly used git commands are: add Add file contents to the index bisect Find the change that introduced a bug by binary search branch List, create, or delete branches checkout Checkout a branch or paths to the working tree clone Clone a repository into a new directory commit Record changes to the repository diff Show changes between commits, commit and working tree, etc fetch Download objects and refs from another repository grep Print lines matching a pattern init Create an empty git repository or reinitialize an existing one log Show commit logs merge Join two or more development histories together mv Move or rename a file, a directory, or a symlink pull Fetch from and merge with another repository or a local branch push Update remote refs along with associated objects rebase Forward-port local commits to the updated upstream head reset Reset current HEAD to the specified state rm Remove files from the working tree and from the index show Show various types of objects status Show the working tree status tag Create, list, delete or verify a tag object signed with GPG See 'git help COMMAND' for more information on a specific command.
branch master archivieren („exportieren“), normalerweise geht das direkt in ein .tar.gz, hier in ein Verzeichnis /tmp/meinRepo
:
cd $Repo && git archive master | tar -x -C /tmp/meinRepo
Lokales Repo neu anlegen (Unterordner .git wird erstellt):
git init
Änderungen in anderes Repo übertragen (git-push)
Globale Einstellungen (ohne –global gilt es nur für das aktuelle Repo):
git config --global user.name "Vorname Nachname" git config --global user.email meine.email@domain.tld
git config --list
Entfernte Repositories werden über diese Wege angesprochen (hier Beispiel mit clone):
git clone user@domain.tld/local/path/to/git/repo
Lokal ist nichts vorhanden und das Zielrepo ist leer:
git clone $ADRESSE cd $REPONAME touch README.md git add README.md git commit -m "habe README angelegt" git push -u origin master
cd Ordner_ohne_git_versionierung git init git remote add origin $ADRESSE git add . git commit -m "Initial commit" git push -u origin master
cd Ordner_mit_git_repo git remote rename origin old-origin git remote add origin $ADRESSE git push -u origin --all git push -u origin --tags
git add Datei/Verzeichnis
git commit -m "Kommentar";
danach:
git add neueDatei
git commit -a -m "Kommentar"
git log
git diff
git diff HEAD
git diff TestTag HEAD
git show
Wenn in einem lokalen Repo viele Änderungen vorgenommen werden (die nicht committed sind) kann git pull schlägt fehlschlagen weil lokale Dateien und Änderungen überschrieben werden würden. In diesem Fall kann es sinnvoll sein das lokale Verzeichnis komplett „sauber“ zu machen, also alles nicht versionierte zu löschen:
git reset --hard git clean -fdx git pull
git checkout PFAD_ODER_DATEI
git reset HEAD PFAD_ODER_DATEI
git commit --amend
git commit --amend --author="John Doe <john@doe.org>"
git filter-branch --env-filter ' OLD_EMAIL="OLD@example.com" NEW_NAME="NEW NAME" NEW_EMAIL="NEW@example.com" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$NEW_NAME" export GIT_COMMITTER_EMAIL="$NEW_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$NEW_NAME" export GIT_AUTHOR_EMAIL="$NEW_EMAIL" fi ' --tag-name-filter cat -- --branches --tags
weitere Informationen bei der Quelle: https://mhagemann.medium.com/how-to-change-the-user-for-all-your-git-commits-ffefbacf2652
git checkout -- PFAD_ODER_DATEI
# Befehle: # p, pick = Commit verwenden # r, reword = Commit verwenden, aber Commit-Beschreibung bearbeiten # e, edit = Commit verwenden, aber zum Nachbessern anhalten # s, squash = Commit verwenden, aber mit vorherigem Commit vereinen # f, fixup = wie "squash", aber diese Commit-Beschreibung verwerfen # x, exec = Befehl (Rest der Zeile) mittels Shell ausführen # d, drop = Commit entfernen
weitere Informationen siehe How can I change the author name / email of a commit?.
Ein Pull Request (PR) bietet die Möglichkeit der vier (oder mehr) Augenprüfung.
# branch erstellen git branch myChanges origin/master git checkout myChanges # Änderungen vornemen + committen git push --set-upstream origin myChanges
Kurzform (commit ID: b50b2e7):
git checkout -b miniBranch b50b2e7 git push --set-upstream origin miniBranch
Bei beiden Methoden wird die URL zurückgeliefert wo der PR erstellt werden kann.
git tag -a 1.0 [-m "message like version 1.0"]
Tags übertragen:
git push --follow-tags
dauerhaft konfigurieren:
git config --global push.followTags true
bestimmten Tag übertragen:
git push origin <tag_name>
Hier zwischen $TAG (ersetzen!) und HEAD:
git log --pretty=oneline $TAG...HEAD
Anderes Format:
git log --pretty=format:"%h; author: %cn; date: %ci; subject:%s" $TAG...HEAD
→ auf branch master beschränken: --first-parent master (Einschränkung: funktioniert nicht für fast-forward-merges, siehe git log to return only the commits made to the master branch?.
Leere Verzeichnisse werden standardmäßig nicht benutzt, ein verbreiteter work-around ist eine Datei .gitkeep in das Verzeichnis zu legen.
find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;
du brauchst serverseitig nur die Unterstützung. Im Repo musst du das mit dem client machen:
[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true
Git kann andere Repositories referenzieren (diese als Submodule einbinden). Dokumentation zu Submodulen.
git submodule add URL [lokaler_Pfad_im_Repo]
4)git submodule add ../URL [lokaler_Pfad_im_Repo]
. Relative Adresse verhindern eine Mischung unterschiedlicher Zugriffsformen (ssh/https) und ggf. damit extra Abfragen von Zugangsdaten5). awx kommt mit einer Mischung nicht klar.git commit -a
(und ggf. git push
)Der Clone-Befehl erweitert sich dadurch:
git clone --recurse-submodules URL
Sub-Module aktualisieren:
git submodule update --init --recursive
bzw. im Verzeichnis des Submoduls:
git pull origin master
Links: https://www.git-tower.com/learn/git/ebook/en/command-line/advanced-topics/submodules#start
git submodule deinit path/to/submodule
git rm path/to/submodule
Für den Fall das ein entferntes Repo gespiegelt werden soll, aber entfernte Änderungen nochmal überprüft werden sollen:
git remote add upstream https://github.com/REPO
git pull upstream master
git push origin master
git branch
git branch BRANCH_NAME
git checkout BRANCH_NAME
git checkout master
git pull . BRANCH_NAME
git push -u origin BRANCH_NAME
git branch -d BRANCH_NAME
git push REMOTE_NAME :SERVER_BRANCH_NAME
git branch -m ALT NEU
git remote prune [SERVER_BRANCH_NAME]
oder besser: verbindet sich vorher nochmal mit dem entfernten repo und aktualisiert die branch-liste:
git fetch -p
git branch -r --contains <commit>
git checkout master git merge --no-commit --squash $myBRANCH git commit
git push origin HEAD:master
git checkout master && git merge [ref of HEAD]
.git/info/
git format-patch original
Ablauf: auschecken, eigenen branch anlegen, committen, pushen, merge-request
git clone REPOADRESSE
8)git checkout -b Zweck
(branch „Zweck“ anlegen)git commit -a -m Änderungsmitteilung
git push origin Zweck
(branch „Zweck“ wieder auf den ursprünglichen branch, z.B. master, zurückübertragen)siehe Seite von gitlab.
Diese Sektion ist wahrscheinlich veraltet und nicht mehr sinnvoll.
Lieder gibt es für git und Apache kein vergleichbares Modul wie für Subversion. Somit hat diese Zugangsmethode folgende Nachteile:
aptitude install git-core
mkdir /srv/git/git-repos
groupadd gitusers
addgroup [USER] gitusers
cd /srv/git/git-repos/REPO1 && git --bare init
chmod 770 /srv/git/git-repos && chown -R www-data:gitusers /srv/git/git-repos/* && chmod g+wX /srv/git/git-repos/*
a2enmod dav dav_fs
<Location /git-repos > DAV on AuthType Basic AuthName "Git Repository - consider using ssl to protect your credentials" #AuthBasicProvider file # (is default anyway; needs mod_authn_file which is loaded) AuthUserFile /etc/apache2/git_passwd Require valid-user #for inital tests: #Allow from all </Location>
/etc/apache2/git_passwd
hinterlegen: htpasswd -c /etc/apache2/git_passwd USER
apache2 -t
apache2ctl restart
ODER
/etc/init.d/apache2 restart
Dieser Fehler tritt bei ersten push auf, wenn lokal noch gar kein master-branch existiert. Lösung: Den ersten commit machen und dann den push.
Ein push schlägt mit folgender Fehlermeldung fehl:
error: Cannot access URL https://user@host.old/repo/, return code 60 error: failed to push some refs to 'https://user@host.old/repo/'
Der Grund ist eine fehlgeschlagene Verifizierung des SSL/TLS-Zertifikats u. a. in diesen Fällen:
Temporäre Lösung (für selbst-signierte Zertifikate)
export GIT_SSL_NO_VERIFY=true
~/.gitconfig
http.sslVerify=false
Permanente Lösung
followTags = true
in der [push]-Sektion von ~/.gitconfiggit push --tags
git branch -D BRANCH_NAME