Git: Unterschied zwischen den Versionen
Rkr (Diskussion | Beiträge) |
Rkr (Diskussion | Beiträge) |
||
(101 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 14: | Zeile 14: | ||
*Erste Schritt mit Git und GitHub: siehe [[c't]] 05/14 S.176 | *Erste Schritt mit Git und GitHub: siehe [[c't]] 05/14 S.176 | ||
*[http://justinhileman.info/article/changing-history/ Changing history, or How to Git pretty], revert, reset, rebase, amend | *[http://justinhileman.info/article/changing-history/ Changing history, or How to Git pretty], revert, reset, rebase, amend | ||
*[https://about.gitlab.com/2018/08/08/git-happens/ Git happens! 6 Common Git mistakes and how to fix them] | |||
*[https://git-scm.com/book/de/v1/Git-Branching-Rebasing Git Branching Rebasing] | |||
*[https://entwickler.de/online/development/git-2-5-169024.html Neue Features in Git 2.5] (entwickler.de) | |||
:worktree, Triangular Workflows | |||
*Git FAQ: siehe [[c't]] 20/15 S.164 | |||
*[https://entwickler.de/online/windowsdeveloper/git-versionskontrolle-tutorial-579885757.html Git für Einsteiger: Wie man das Versionskontrollsystem Git nutzt] | |||
*[https://about.gitlab.com/blog/2020/04/20/ultimate-git-guide/ Our ultimate guide to Git] (GitLab) | |||
*Git Rebase | |||
**[https://about.gitlab.com/blog/2020/11/23/keep-git-history-clean-with-interactive-rebase/ How to keep your Git history clean with interactive rebase] (GitLab) | |||
**[https://about.gitlab.com/blog/2022/10/06/take-advantage-of-git-rebase/ Take advantage of Git rebase] (gitlab.com) | |||
*[https://about.gitlab.com/blog/2024/05/30/a-beginners-guide-to-the-git-reftable-format A beginner's guide to the Git reftable format] (gitlab.com) | |||
=== Cheat Sheets === | === Cheat Sheets === | ||
*[http://www.git-tower.com/blog/git-cheat-sheet-detail/ git-tower.com] | *[http://www.git-tower.com/blog/git-cheat-sheet-detail/ git-tower.com] | ||
*[http://www.ndpsoftware.com/git-cheatsheet.html Interactive Cheat Sheet] (ndpsoftware.com) | *[http://www.ndpsoftware.com/git-cheatsheet.html Interactive Cheat Sheet] (ndpsoftware.com) | ||
=== Versionen === | |||
*[https://opensource.googleblog.com/2018/05/introducing-git-protocol-version-2.html Introducing Git protocol version 2] (Google) | |||
=== Sicherheit === | |||
*[https://www.cyberscan.io/blog/git-luecke Git-Lücke] - Diverse Webserver bezüglich des .git-Verzeichnisses richtig konfigurieren | |||
**siehe c't 15/20 S.32, http://ct.de/yuqe | |||
== Bücher und Training == | == Bücher und Training == | ||
Zeile 23: | Zeile 41: | ||
*[http://gitbu.ch Das Git-Buch] von Open Source Press | *[http://gitbu.ch Das Git-Buch] von Open Source Press | ||
*Tutorial siehe [[LU]] 06/10 S.62 | *Tutorial siehe [[LU]] 06/10 S.62 | ||
*Grundkurs Git: siehe [[LU]] 11/12 S.32 | |||
*[http://www.thegeekstuff.com/2011/08/git-install-configure/ Introduction to GIT on Linux – Install, Create Project, Commit Files] (thegeekstuff.com) | *[http://www.thegeekstuff.com/2011/08/git-install-configure/ Introduction to GIT on Linux – Install, Create Project, Commit Files] (thegeekstuff.com) | ||
*[http://www.codeschool.com/courses/try-git tryGit Kurs] (codeschool.com) | *[http://www.codeschool.com/courses/try-git tryGit Kurs] (codeschool.com) | ||
**[https://try.github.io try.github.io] | |||
*[http://progit.org/book/ Pro Git] | *[http://progit.org/book/ Pro Git] | ||
Zeile 38: | Zeile 58: | ||
*[http://wiki.eclipse.org/EGit/Learning_Material EGit Learning Material] | *[http://wiki.eclipse.org/EGit/Learning_Material EGit Learning Material] | ||
*[http://phpmagazin.de/news/GitHub-startet-Trainingsprogramm-168236 GitHub startet Trainingsprogramm] (phpmagazin.de) | *[http://phpmagazin.de/news/GitHub-startet-Trainingsprogramm-168236 GitHub startet Trainingsprogramm] (phpmagazin.de) | ||
*Git-Tutorium bei pro-linux.de | |||
**[http://www.pro-linux.de/artikel/2/1742/git-tutorium-teil-1.html Teil 1] | |||
**[http://www.pro-linux.de/artikel/2/1746/git-tutorium-teil-2.html Teil 2] | |||
**[http://www.pro-linux.de/artikel/2/1752/git-tutorium-teil-3.html Teil 3] | |||
**[http://www.pro-linux.de/artikel/2/1777/git-tutorium-teil-4-github.html Teil 4) (GitHub) | |||
*Git Tutorial bei Linux User | |||
**siehe LU 08/18 S.84 (Einstieg) | |||
**siehe LU 09/18 S.84 (Branch, Merge, Rebase) | |||
*Git Tutorial bei Heise | |||
**https://heise.de/-4456122 | |||
*Branching Konzepte: siehe c't 15/20 S.142 (Git Workflow, GitHub FLow) | |||
== Videos == | == Videos == | ||
Zeile 50: | Zeile 83: | ||
*[http://www.youtube.com/watch?v=4sANX9AhM8c Introduction to Continuous Integration] (Git and Jenkins) | *[http://www.youtube.com/watch?v=4sANX9AhM8c Introduction to Continuous Integration] (Git and Jenkins) | ||
*[http://www.ted.com/talks/clay_shirky_how_the_internet_will_one_day_transform_government.html Ted talk which refers to Git] | *[http://www.ted.com/talks/clay_shirky_how_the_internet_will_one_day_transform_government.html Ted talk which refers to Git] | ||
*[http://www.git-tower.com/learn/videos Learn Version Control with Git] - multiple video episodes (git-tower.com) | |||
*[https://www.youtube.com/watch?v=6uvzIMdqV2U Git-Grundlagen für Entwickler] | |||
== Communities == | == Communities == | ||
Zeile 56: | Zeile 91: | ||
== Tipps und Tricks == | == Tipps und Tricks == | ||
*[https://blog.liip.ch/archive/2015/12/11/git-tips-tricks.html Git : Tips & Tricks] (blog.liip.ch) | |||
*[https://about.gitlab.com/2016/12/08/git-tips-and-tricks/ Git Tips & Tricks] (gitlab.com) | |||
*[https://about.gitlab.com/blog/2020/04/07/15-git-tips-improve-workflow/ 15 Git tips to improve your workflow] (gitlab.com) | |||
*Git Verzeichnisse strukturieren / Regeln: siehe LM 04/19 S.36 | |||
*Tipps und Tricks siehe LM 04/19 S.48 | |||
=== Branching === | |||
*https://learngitbranching.js.org | |||
=== Git mit großen Dateien === | === Git mit großen Dateien === | ||
Git wurde nicht für das Speichern sehr großer Dateien konzipiert. So werden alle Dateien vor dem Speichern auf Festplatte erst in das RAM geladen, um z.B. SHA-1 Checksummen zu bilden. Daher muss so viel RAM installiert sein, dass jede Datei einzeln hinein passt. Auch ist der I/O-Durchsatz entscheidend für die Performance. | Git wurde nicht für das Speichern sehr großer Dateien konzipiert. So werden alle Dateien vor dem Speichern auf Festplatte erst in das RAM geladen, um z.B. SHA-1 Checksummen zu bilden. Daher muss so viel RAM installiert sein, dass jede Datei einzeln hinein passt. Auch ist der I/O-Durchsatz entscheidend für die Performance. | ||
Zeile 62: | Zeile 106: | ||
Alternativen: | Alternativen: | ||
*[http://git-annex.branchable.com/ git-annex], speichert nur die Metadaten in Git | *[http://git-annex.branchable.com/ git-annex], speichert nur die Metadaten in Git | ||
**siehe [http://lwn.net/Articles/419241/ Large file management with git-annex] | |||
**siehe LM 11/13 S.58 | |||
**siehe [https://www.heise.de/select/ct/2022/2/2132912531474418304 c't 02/22 S.154] , https://ct.de/y1nw | |||
Siehe auch: | Siehe auch: | ||
Zeile 73: | Zeile 120: | ||
Entweder über Shell-Variable | Entweder über Shell-Variable | ||
export http_proxy=http://localhost:3128 | export http_proxy=http://localhost:3128 | ||
oder in Git Config eingebaut | export https_proxy=http://localhost:3128 | ||
oder in globaler Git Config ''~/.gitconfig'' eingebaut | |||
git config --global http.proxy http://localhost:3128 | git config --global http.proxy http://localhost:3128 | ||
git config --global https.proxy http://localhost:3128 | |||
oder in Git Config des Repositories ''.git/config'' eingebaut | |||
git config http.proxy http://localhost:3128 | |||
git config https.proxy http://localhost:3128 | |||
Abfrage (Resultat je nach Kontext): | |||
git config --get http.proxy | |||
git config --get https.proxy | |||
Siehe auch [http://www.vogella.com/articles/Git/article.html#remote_proxy Git Tutorial]. | Siehe auch [http://www.vogella.com/articles/Git/article.html#remote_proxy Git Tutorial]. | ||
Zeile 121: | Zeile 177: | ||
*''ref-update'' wird '''vor''' einem Push ausgeführt. Daher wird ggf. eine alte README Datei umgewandelt. | *''ref-update'' wird '''vor''' einem Push ausgeführt. Daher wird ggf. eine alte README Datei umgewandelt. | ||
*''$GIT_DIR'' wird auf jeden Fall unterstützt. | *''$GIT_DIR'' wird auf jeden Fall unterstützt. | ||
=== Upstream Branches === | |||
*http://stackoverflow.com/questions/18031946/what-does-set-upstream-do | |||
=== Workflows === | |||
*[https://about.gitlab.com/2018/10/03/working-on-two-git-branches-at-the-same-time/ Workflow for working with two Git branches simultaneously] (GitLab) | |||
=== Fehler rückgängig machen === | |||
*Fehler ganz einfach rückgängig machen: https://entwickler.de/online/tools/git-fehler-579861552.html, Video: https://www.youtube.com/watch?v=FsSTd4Vcm90 | |||
== Tools und Software == | == Tools und Software == | ||
=== Desktop GUIs === | === Desktop GUIs === | ||
*Git-GUIs im Test | *Git-GUIs im Test | ||
**siehe LM 03/14 S.56 | |||
**siehe LM 04/19 S.42 | |||
*gitk | *gitk | ||
*Gitahead | |||
*Qgit (KDE) | *Qgit (KDE) | ||
*[http://sourcetreeapp.com SourceTree] - für Windows und Mac | *[http://sourcetreeapp.com SourceTree] - für Windows und Mac | ||
*[http://www.syntevo.com/smartgithg/ Smart Git] (Closed Source, aber für privaten Einsatz kostenlos) | *[http://www.syntevo.com/smartgithg/ Smart Git] (Closed Source, aber für privaten Einsatz kostenlos) | ||
*[http://www.syntevo.com/deepgit/ DeepGit] (Closed Source, aber für privaten und kommerziellen Einsatz kostenlos) [http://www.pro-linux.de/news/1/24267/deepgit-neues-git-arch%C3%A4ologiewerkzeug-von-syntevo.html pro-linux.de] | |||
*Gitg | *Gitg | ||
*Git Cola | *Git Cola | ||
*Git Eye (Closed Source) | *Git Eye (Closed Source) | ||
*[http://www.syntevo.com/smartgit/ SmartGit], [http://www.pro-linux.de/news/1/22716/smartgit-7-freigegeben.html pro-linux.de], multi-RCS Client, Java, proprietär aber für private Zwecke kostenlos. | |||
==== Git und KDE ==== | ==== Git und KDE ==== | ||
Zeile 149: | Zeile 219: | ||
*http://forums.opensuse.org/english/get-technical-help-here/applications/482372-how-disable-git-haskpass-kwallet-integration.html | *http://forums.opensuse.org/english/get-technical-help-here/applications/482372-how-disable-git-haskpass-kwallet-integration.html | ||
=== Server | === Server Tools === | ||
*[ | *[[GitLab]], als Community Edition, fast wie GitHub, Issues mit Markdown etc., Ruby-basiert, am besten mit PostgreSQL und Nginx - aber auch mit MySQL und Apache möglich. | ||
*[http://getgitorious.com Gitorious Community Edition], Ruby/Rails-basiert, im Web-DocumentRoot installiert, dedizierter Installer nur für CentOS | *[http://getgitorious.com Gitorious Community Edition], Ruby/Rails-basiert, im Web-DocumentRoot installiert, dedizierter Installer nur für CentOS | ||
Zeile 176: | Zeile 238: | ||
*[http://projects.ceondo.com/p/indefero/ Indefero], GoogleCode Clone | *[http://projects.ceondo.com/p/indefero/ Indefero], GoogleCode Clone | ||
*[https://rhodecode.com RhodeCode] | *[https://rhodecode.com RhodeCode] | ||
*[http://phabricator.org/applications/diffusion/ Phabricator Diffusion] - Repository Browser + Hosting, [http://phabricator.org/applications/differential/ Phabricator Differential] - Code Review etc. | |||
*[https://about.teahub.io/TeaHub], [https://www.pro-linux.de/news/1/25996/teahub-soll-freie-europ%C3%83%C2%A4ische-alternative-zu-github-werden.html TeaHub soll freie europäische Alternative zu Github werden] | |||
*Gitpod | |||
**Entwicklungsumgebung für Online-Dienste wie GitLab und GitHub | |||
**https://www.heise.de/news/Gitpod-bietet-native-IDE-Integration-in-GitLab-4923817.html | |||
**siehe LM 10/19 S.90 | |||
**siehe iX 09/21 S.137 | |||
*[https://gogs.io/ Gogs] | |||
**Go-basierender Git-Server, wenig Systemressourcen nötig | |||
**siehe LM 06/23 S.38 | |||
=== Online-Dienste === | === Online-Dienste === | ||
Zeile 195: | Zeile 271: | ||
***https://wiki.jenkins-ci.org/display/JENKINS/Gitorious+Plugin | ***https://wiki.jenkins-ci.org/display/JENKINS/Gitorious+Plugin | ||
***http://stackoverflow.com/questions/20557578/how-to-configure-gitorious-to-trigger-jenkins-build-hook | ***http://stackoverflow.com/questions/20557578/how-to-configure-gitorious-to-trigger-jenkins-build-hook | ||
=== GitOps === | |||
*Infrastructure as a Code | |||
*Konzept und Paradigma, bei dem Git für den gesamten Verwaltungsprozess einer Software eingesetzt wird – von der Entwicklung über das Deployment bis zur Pflege. A way for organizations to enable Ops teams move at the pace of application development. | |||
*Continuous Deployment für Cloud Native Applikationen | |||
*[[GitLab]] | |||
*https://www.gitops.tech/ | |||
*https://www.dev-insider.de/was-ist-gitops-a-915663/ | |||
*[https://github.com/fluxcd/flux Flux] - Flux is a tool that automatically ensures that the state of a cluster matches the config in git | |||
*[https://www.heise.de/news/Cloud-nativ-GitOps-Working-Group-als-Community-Projekt-bei-der-CNCF-gestartet-4967953.html Cloud-nativ: GitOps Working Group als Community-Projekt bei der CNCF gestartet] | |||
*[https://github.com/fluxcd/gitops-working-group gitops-working-group] (GitHub) | |||
*[https://about.gitlab.com/blog/2021/04/27/gitops-done-3-ways/ 3 Ways to approach GitOps] | |||
*[https://learn.gitlab.com/c/beginner-guide-gitops A beginner's guide to GitOps] | |||
*[https://www.heise.de/hintergrund/GitOps-in-der-Praxis-6042703.html GitOps in der Praxis | heise online] | |||
*Info und Marktübersicht: siehe iX 04/21 S.42 ff | |||
*Kubernetes und GitOps: siehe iX 05/21 S.80 | |||
*Ceph-Verwaltung per GitOps: siehe iX 06/21 S.68 | |||
=== IDEs === | === IDEs === | ||
Zeile 229: | Zeile 322: | ||
*Konfiguration für einzelnes Repository | *Konfiguration für einzelnes Repository | ||
git config user.email Max.Mustermann@example.com | git config user.email Max.Mustermann@example.com | ||
*Feature Macros (seit Git 2.24) | |||
**https://github.blog/2019-11-03-highlights-from-git-2-24/ | |||
**Eine bestimmte Direktive setzt im Hintergrund die passenden (gruppierten) Konfigurationseinträge | |||
feature.<NAME> | |||
z.B. git config feature.manyFiles true | |||
man git config | |||
*Default-Branch setzen (z.B. nicht "master") | |||
init.defaultBranch | |||
=== Lokales Repository === | === Lokales Repository === | ||
Zeile 270: | Zeile 371: | ||
*Letzten Commit widerrufen und mit neuem Kommentar bzw. neuen Dateien erneuern | *Letzten Commit widerrufen und mit neuem Kommentar bzw. neuen Dateien erneuern | ||
git commit --amend | git commit --amend | ||
git commit --amend --reset-author | |||
*Inhalt eines Commits anzeigen (Patch Format): | |||
git show HEAD | |||
git show 5203edd | |||
*Einen Branch erzeugen | *Einen Branch erzeugen | ||
Zeile 308: | Zeile 414: | ||
git merge next | git merge next | ||
git push (Änderungen Richtung Remote) | git push (Änderungen Richtung Remote) | ||
*Empfehlenswert: Bei einem Merge auf jeden Fall eine Commit-Message erzeugen (entfällt sonst bei fast-forward Merge): | |||
git merge next --no-ff | |||
*Einen Merge zurücknehmen (z.B. wenn Fehler oder Probleme auftauchten) | *Einen Merge zurücknehmen (z.B. wenn Fehler oder Probleme auftauchten) | ||
Zeile 314: | Zeile 423: | ||
*Änderungen ab einem bestimmten Commit zurücknehmen (Historie bleibt aber erhalten mit ''git log -g'') | *Änderungen ab einem bestimmten Commit zurücknehmen (Historie bleibt aber erhalten mit ''git log -g'') | ||
git reset --hard 2f562s | git reset --hard 2f562s | ||
*Lokale Änderungen im master Branch zurücknehmen und auf Stand von origin bringen [https://stackoverflow.com/questions/1125968/how-do-i-force-git-pull-to-overwrite-local-files] | |||
git fetch --all | |||
git reset --hard origin/master | |||
*Branches lokal löschen, die Remote nicht mehr vorhanden sind | |||
git fetch --prune | |||
*Merged Branches ausgeben | *Merged Branches ausgeben | ||
Zeile 320: | Zeile 436: | ||
*Unmerged Branches ausgeben | *Unmerged Branches ausgeben | ||
git branch --no-merged | git branch --no-merged | ||
*Rebase - sinvoll um zwischenzeitige Änderungen in ''master'' in meinen Entwicklungs-Branch ''next'' zu mergen (siehe [[GitLab/GitLab Cookbook|GitLab Cookbook]] S.53) | |||
git checkout next | |||
git rebase master | |||
:Hinweis: Kann sein, dass der Branch ''next'' danach mit -f gepusht werden muss. | |||
*Squashing - sinnvoll um Historie zu säubern, z.B. um Commits zusammenzufassen, bevor sie nach ''master'' gemerged werden [http://feeding.cloud.geek.nz/posts/combining-multiple-commits-into-one/]. Beispiel: die letzten beiden Commit zusammenfassen: | |||
git checkout next | |||
git rebase -i HEAD~2 | |||
:Dann im Editor in der zweiten Zeile das "pick" in "squash" ändern. Und danach Commit-Message erstellen. | |||
:Hinweis: Der erste Commit kann nicht "squashed" werden. | |||
:Alternative: merge mit ''--squash'' | |||
*Projektgeschichte ansehen (letzte 4 Commits, zeitliche Einschränkung) | *Projektgeschichte ansehen (letzte 4 Commits, zeitliche Einschränkung) | ||
Zeile 327: | Zeile 455: | ||
git log --since='yesterday' | git log --since='yesterday' | ||
git log --format=fuller | git log --format=fuller | ||
*In Commit Message suchen | |||
git log --grep "Bugfix:" v3..HEAD | |||
git log --grep "README" --oneline --all | |||
*Nach Änderungen im Code suchen (String im Patch) | |||
git log -G"mySuperMethod" --oneline | |||
*Auch tags sehen mit "decorate" | |||
git log --oneline --decorate | |||
*Änderungen (Log) seit dem Tag "v3" | |||
git log v3..HEAD | |||
*Unterscheide anzeigen (zum letzten Commit) | *Unterscheide anzeigen (zum letzten Commit) | ||
Zeile 344: | Zeile 485: | ||
git diff 6d4f69 | git diff 6d4f69 | ||
git diff 6d4f69 <datei> | git diff 6d4f69 <datei> | ||
*Zeigen welche Dateien sich seit dem Tag "v3" geändert haben | |||
git diff --name-only v3..HEAD | |||
git diff --name-only --diff-filter=M v3..HEAD | |||
*Änderungen einer Datei verfolgen | |||
git log -p -- <datei> | |||
git log -p --follow -p -- <datei> | |||
*Muster in allen Dateien durchsuchen | *Muster in allen Dateien durchsuchen | ||
Zeile 350: | Zeile 499: | ||
*Muster in bestimmten Dateien durchsuchen (hier .conf) | *Muster in bestimmten Dateien durchsuchen (hier .conf) | ||
git grep muster -- '*.conf' | git grep muster -- '*.conf' | ||
*Den aktuellsten (letzten) Tag anzeigen ausgehend von Commit | |||
git describe | |||
=== Remote Repository === | === Remote Repository === | ||
*ein existierendes lokales Repository erstmals auf einen Server pushen | *ein existierendes lokales Repository erstmals auf einen Server pushen | ||
git remote add origin ssh://user@gitserver | git remote add origin ssh://user@gitserver/repo.git | ||
git push -u origin master | git push -u origin master | ||
:Hinweis: "origin" ist der Name, mit dem man im folgenden das Remote Repository ansprechen kann. | |||
*Verbundene Remote Repositories listen | *Verbundene Remote Repositories listen | ||
git remote | git remote | ||
*Komplette Zusammenfassung mit allen verfügbaren und verbundenen Branches und dem Tracking-Status | |||
git remote show origin | |||
*Änderungen in den Remote Repositories in ''allen'' Remote Tracking Branches nachziehen (herunterladen) | |||
git remote update | |||
*Status der Remote Tracking Branches abfragen: | |||
git branch -vv | |||
*Änderungen des Remote Tracking Branches (per "fetch" oder "remote update" zuvor aktualisiert) zum ausgecheckten Branch anzeigen (ohne vorheriges "pull", d.h. ohne Änderungen bereits im lokalen Branch übernommen zu haben) und erst dann übernehmen | |||
git log -p ..@{u} | |||
git merge --ff-only @{u} | |||
*URL eines Remote Repositorys ändern | *URL eines Remote Repositorys ändern | ||
git remote set-url origin https://... | git remote set-url origin https://... | ||
*Clone erzeugen mit Referenz auf ''Origin'' | *Clone erzeugen mit Referenz auf ''Origin'' | ||
git clone ssh://user@gitserver | git clone ssh://user@gitserver/repo.git | ||
*Nach einem Fork zukünftig auch Updates der Originals einpflegen (Branch ''updates/master'') | *Nach einem Fork zukünftig auch Updates der Originals einpflegen (Branch ''updates/master'') | ||
git remote add updates ssh://user@gitserver | git remote add updates ssh://user@gitserver/repo.git | ||
git fetch updates | git fetch updates | ||
git merge updates/master | git merge updates/master | ||
Zeile 383: | Zeile 549: | ||
git merge origin/branch-new | git merge origin/branch-new | ||
*Änderungen vom Remote herunterladen | *Änderungen vom Remote herunterladen und direkt mergen | ||
git pull | git pull | ||
*Auch Tags herunterladen | |||
git pull --tags | |||
*Änderungen nach Commit zum Remote hochladen (''Origin'' darf nicht ''bare'' sein, s.u.) | *Änderungen nach Commit zum Remote hochladen (''Origin'' darf nicht ''bare'' sein, s.u.) | ||
git push | git push | ||
*Auch Tags hochladen | |||
git push --tags | |||
*Lokal gelöschte Tags remote löschen | |||
git push --prune --tags | |||
*'''Neue''' lokale Branches nach Remote pushen | *'''Neue''' lokale Branches nach Remote pushen | ||
Zeile 403: | Zeile 578: | ||
<pre> | <pre> | ||
[remote "origin"] | [remote "origin"] | ||
url = ssh://user@gitserver | url = ssh://user@gitserver/repo | ||
fetch = +refs/heads/*:refs/remotes/origin/* | fetch = +refs/heads/*:refs/remotes/origin/* | ||
[branch "master"] | [branch "master"] | ||
Zeile 412: | Zeile 587: | ||
merge = refs/heads/next | merge = refs/heads/next | ||
</pre> | </pre> | ||
*Eine Branch remote löschen | |||
git push origin --delete branch-to-delete | |||
*Backup in zweites Repo "myrepo" machen: | |||
**Konfig ''.git/config'' | |||
<pre> | |||
[remote "origin"] | |||
url = https://.... | |||
fetch = +refs/heads/*:refs/remotes/origin/* | |||
[remote "myrepo"] | |||
url = ssh://…. | |||
fetch = +refs/heads/*:refs/remotes/myrepo/* | |||
</pre> | |||
**Pushen | |||
git push --set-upstream myrepo | |||
git push --all myrepo | |||
git push --tags myrepo | |||
==== Remote Repository auf gleichem Host ==== | ==== Remote Repository auf gleichem Host ==== | ||
Zeile 427: | Zeile 620: | ||
erzeugt Verzeichnis | erzeugt Verzeichnis | ||
apache2.git | apache2.git | ||
=== Patches === | |||
==== Patch erzeugen ==== | |||
*Repository auschecken | |||
*Datei(en) ändern | |||
*Prüfen der Änderungen | |||
git status | |||
git diff | |||
*Änderungen committen | |||
git commit -a -m "Fixed ...." | |||
*Patch-Datei erzeugen (zum letzten Commit mit "-1") mit Endung ''.patch'' | |||
git format-patch -1 | |||
Beispiel-Datei: | |||
<pre> | |||
From 41a9da71595c9d2d793cbbb678b720f000c5c9d9 Mon Sep 17 00:00:00 2001 | |||
From: Max Mustermann <max@mustermann.de> | |||
Date: Sun, 5 Apr 2015 17:49:02 +0200 | |||
Subject: [PATCH] declare i outside the loop fixes C99 compile error | |||
refs #8986 | |||
--- | |||
base/utils.c | 3 ++- | |||
1 file changed, 2 insertions(+), 1 deletion(-) | |||
diff --git a/base/utils.c b/base/utils.c | |||
index 9924a03..53f8a69 100644 | |||
--- a/base/utils.c | |||
+++ b/base/utils.c | |||
@@ -300,7 +300,8 @@ pthread_mutex_t registered_fds_lock; | |||
int init_registered_fds(void) | |||
{ | |||
- for (int i = 0; i < REGISTERED_FD_MAX; i++) { | |||
+ int i; | |||
+ for (i = 0; i < REGISTERED_FD_MAX; i++) { | |||
registered_fds[i] = -1; | |||
} | |||
-- | |||
2.3.4 | |||
</pre> | |||
==== Patch einspielen ==== | |||
*neuen Branch in master erzeugen | |||
git checkout -b newbranch | |||
*Patch anwenden | |||
git am --signoff <patchfile> | |||
*Commit ersetzen/ergänzen | |||
git commit --amend | |||
==== Patch per E-Mail ==== | |||
*siehe c't 25/20 S.81 | |||
git send-mail | |||
git am | |||
git format patch | |||
*Mail-Client Aerc speziell auf Git ausgelegt | |||
====Siehe auch==== | |||
*[https://wiki.icinga.org/display/Dev/Developer+Guidelines#DeveloperGuidelines-SendingaPatch Icinga Developer Guidelines] | |||
== Andere Version Control Tools == | |||
*[https://dvc.org/ Data Version Control] (DVC) System for Machine Learning Projects | |||
**wird verwendet in Kombination mit Git; Versionierung von Daten und Modellen | |||
**[https://www.heise.de/hintergrund/Verwaltung-und-Inbetriebnahme-von-ML-Modellen-4911723.html Verwaltung und Inbetriebnahme von ML-Modellen] | |||
== Siehe auch == | |||
*[[GitLab]] | |||
*[[/SSH Authentifizierung|SSH Authentifizierung]] | |||
[[Kategorie:Programmierung]] | [[Kategorie:Programmierung]] | ||
[[Kategorie:Git]] | [[Kategorie:Git]] |
Aktuelle Version vom 30. Mai 2024, 15:39 Uhr
Git ist ein verteiltes Revision Control System für Software und Dateien aller Art (Versionsverwaltung).
Allgemeines
- SaaS-Hoster für Git-Projekte: gitorious.org
- Git-Repositories mit Metaverzeichnis managen mit Perl-Script: siehe LM 08/10 S.116, Listings
- Git und Subversion gemeinsam nutzen (pro-linux.de)
- Git - Revision Control Perfected (linuxjournal.com)
- http://www.mediawiki.org/wiki/Manual:MediaWiki_Git_Guide
- https://de.wikipedia.org/wiki/Git
- Erste Schritt mit Git und GitHub: siehe c't 05/14 S.176
- Changing history, or How to Git pretty, revert, reset, rebase, amend
- Git happens! 6 Common Git mistakes and how to fix them
- Git Branching Rebasing
- Neue Features in Git 2.5 (entwickler.de)
- worktree, Triangular Workflows
- Git FAQ: siehe c't 20/15 S.164
- Git für Einsteiger: Wie man das Versionskontrollsystem Git nutzt
- Our ultimate guide to Git (GitLab)
- Git Rebase
- How to keep your Git history clean with interactive rebase (GitLab)
- Take advantage of Git rebase (gitlab.com)
- A beginner's guide to the Git reftable format (gitlab.com)
Cheat Sheets
- git-tower.com
- Interactive Cheat Sheet (ndpsoftware.com)
Versionen
- Introducing Git protocol version 2 (Google)
Sicherheit
- Git-Lücke - Diverse Webserver bezüglich des .git-Verzeichnisses richtig konfigurieren
- siehe c't 15/20 S.32, http://ct.de/yuqe
Bücher und Training
- Git Documentation
- Das Git-Buch von Open Source Press
- Tutorial siehe LU 06/10 S.62
- Grundkurs Git: siehe LU 11/12 S.32
- Introduction to GIT on Linux – Install, Create Project, Commit Files (thegeekstuff.com)
- tryGit Kurs (codeschool.com)
- Pro Git
- Git Book
- Version Control with Git
- gittutorial Manual Page
- Getting Started with Git von DZone
- A successful Git branching model, Branch, rebase, squash, commit
- Commit Often, Perfect Later, Publish Once: Git Best Practices
- MediaWiki Git Guide
- Tutorial "Learning git: Part 1" (de) (musicmatze.wordpress.com)
- EGit Learning Material
- GitHub startet Trainingsprogramm (phpmagazin.de)
- Git-Tutorium bei pro-linux.de
- Git Tutorial bei Linux User
- siehe LU 08/18 S.84 (Einstieg)
- siehe LU 09/18 S.84 (Branch, Merge, Rebase)
- Git Tutorial bei Heise
- Branching Konzepte: siehe c't 15/20 S.142 (Git Workflow, GitHub FLow)
Videos
- Linus Torvalds on Git
- Google Tech Talk on Git
- Gerrit Git Review with Jenkins CI
- Introduction to Git by Scott Chacon of GitHub
- GitCasts (Git how-to videos)
- GIT Tutorial - Branching and Merging
- git push to gerrit
- EGit github Tutorial
- Introduction to Continuous Integration (Git and Jenkins)
- Ted talk which refers to Git
- Learn Version Control with Git - multiple video episodes (git-tower.com)
- Git-Grundlagen für Entwickler
Communities
- Git bei Google+
- Git Blame - Announcements
Tipps und Tricks
- Git : Tips & Tricks (blog.liip.ch)
- Git Tips & Tricks (gitlab.com)
- 15 Git tips to improve your workflow (gitlab.com)
- Git Verzeichnisse strukturieren / Regeln: siehe LM 04/19 S.36
- Tipps und Tricks siehe LM 04/19 S.48
Branching
Git mit großen Dateien
Git wurde nicht für das Speichern sehr großer Dateien konzipiert. So werden alle Dateien vor dem Speichern auf Festplatte erst in das RAM geladen, um z.B. SHA-1 Checksummen zu bilden. Daher muss so viel RAM installiert sein, dass jede Datei einzeln hinein passt. Auch ist der I/O-Durchsatz entscheidend für die Performance.
Falls Git große Dateien verwalten soll, bietet sich die Verwendung von git-submodule an.
Alternativen:
- git-annex, speichert nur die Metadaten in Git
- siehe Large file management with git-annex
- siehe LM 11/13 S.58
- siehe c't 02/22 S.154 , https://ct.de/y1nw
Siehe auch:
- Managing large binary files with git (stackoverflow.com)
Performance
Man sollte von Zeit und Zeit die Garbage Collection laufen lassen. Siehe GC.
Git hinter einem HTTP-Proxy
Entweder über Shell-Variable
export http_proxy=http://localhost:3128 export https_proxy=http://localhost:3128
oder in globaler Git Config ~/.gitconfig eingebaut
git config --global http.proxy http://localhost:3128 git config --global https.proxy http://localhost:3128
oder in Git Config des Repositories .git/config eingebaut
git config http.proxy http://localhost:3128 git config https.proxy http://localhost:3128
Abfrage (Resultat je nach Kontext):
git config --get http.proxy git config --get https.proxy
Siehe auch Git Tutorial.
Achtung: Git Repositories müssen dann auch per HTTP/HTTPS angesprochen werden (nicht per git Protokoll).
Einen einfachen Git Server aufsetzen
Man benötigt nur einen Linux-Server mit Git und einem laufenden SSH Daemon.
Siehe:
Hooks
Mit Hooks können bei bestimmten Aktionen (z.B. einem Push) Scripte ausgeführt werden.
Siehe
Beispiel
Beispiel für ein Hook zum automatischen Generieren einer HTML Datei README.html aus einer Markdown Datei README.md nach einem Push:
#!/bin/sh
/usr/bin/git cat-file blob HEAD:README.md | /usr/bin/Markdown.pl > $GIT_DIR/README.html
Hinweise:
- Der Hook wird auf dem Server im Bare-Repository als Datei .git/hooks/post-receive erstellt.
Siehe:
- http://stackoverflow.com/questions/8321649/gitweb-how-to-display-markdown-file-in-html-format-automatically-like-github
- http://bastian.rieck.ru/blog/posts/2013/gitweb_readme_workflow/
Hooks bei Gerrit
Gerrit unterstützt leider keine Standard-Hooks von Git, sondern nur eigene Hooks unterhalb des Installationsverzeichnisses $site_path/hooks. Daher ist es z.B. nicht so einfach möglich, nach einem erfolgten Push für jedes Repository eigene Aktionen anzustoßen.
Siehe:
Beispiel /srv/gerrit/hooks/ref-update
#!/bin/sh
/usr/bin/git cat-file blob HEAD:README.md | /usr/bin/Markdown.pl > $GIT_DIR/README.html
Hinweise:
- ref-update wird vor einem Push ausgeführt. Daher wird ggf. eine alte README Datei umgewandelt.
- $GIT_DIR wird auf jeden Fall unterstützt.
Upstream Branches
Workflows
Fehler rückgängig machen
- Fehler ganz einfach rückgängig machen: https://entwickler.de/online/tools/git-fehler-579861552.html, Video: https://www.youtube.com/watch?v=FsSTd4Vcm90
Tools und Software
Desktop GUIs
- Git-GUIs im Test
- siehe LM 03/14 S.56
- siehe LM 04/19 S.42
- gitk
- Gitahead
- Qgit (KDE)
- SourceTree - für Windows und Mac
- Smart Git (Closed Source, aber für privaten Einsatz kostenlos)
- DeepGit (Closed Source, aber für privaten und kommerziellen Einsatz kostenlos) pro-linux.de
- Gitg
- Git Cola
- Git Eye (Closed Source)
- SmartGit, pro-linux.de, multi-RCS Client, Java, proprietär aber für private Zwecke kostenlos.
Git und KDE
Unter KDE wird beim Pushen auf Kommandozeile i.d.R. das Programm /usr/lib/ssh/ssh-askpass verwendet. Siehe Eintrag mittels:
echo $SSH_ASKPASS
Normalerweise startet dann ein KDE-Dialog zur Eingabe des Passworts und das Passwort wird im KDE-Wallet gespeichert.
Wichtig: Für das HTTP(S)-Protokoll muss in der Git-Config auch der Username hinterlegt sein, sonst klappt das Authentifizieren nicht, also z.B. so:
[remote "origin"] url = https://USERNAME@github.com/pfad/zum.git fetch = +refs/heads/*:refs/remotes/origin/*
Weblinks:
- http://grubix.blogspot.co.nz/2011/11/git-https-and-kwallet-update.html
- http://forums.opensuse.org/english/get-technical-help-here/applications/482372-how-disable-git-haskpass-kwallet-integration.html
Server Tools
- GitLab, als Community Edition, fast wie GitHub, Issues mit Markdown etc., Ruby-basiert, am besten mit PostgreSQL und Nginx - aber auch mit MySQL und Apache möglich.
- Gitorious Community Edition, Ruby/Rails-basiert, im Web-DocumentRoot installiert, dedizierter Installer nur für CentOS
- noch kein Issue Tracker (aber geplant)
- Stash, kommerziell von Atlassian, Github sehr ähnlich
- gitweb, einfach, als CGI in Webserver eingebettet
- Gerrit - Git Code Review und Repository Server: steuert Access Control, Projekte
- Gitblit, recht komplexe Java-basierte Software
- GitList, PHP-basiert, als Repo-Viewer
- Gitalist, Perl-basiert, als Repo-Viewer, Gitweb.cgi URL kompatibel
- SCM-Manager
- Indefero, GoogleCode Clone
- RhodeCode
- Phabricator Diffusion - Repository Browser + Hosting, Phabricator Differential - Code Review etc.
- Gitpod
- Entwicklungsumgebung für Online-Dienste wie GitLab und GitHub
- https://www.heise.de/news/Gitpod-bietet-native-IDE-Integration-in-GitLab-4923817.html
- siehe LM 10/19 S.90
- siehe iX 09/21 S.137
- Gogs
- Go-basierender Git-Server, wenig Systemressourcen nötig
- siehe LM 06/23 S.38
Online-Dienste
Als Dienstleister:
- Github - Free public repositories, collaborator management, issue tracking, wikis, downloads, code review, graphs and much more
- Gist zur Verwaltung von Code-Schnipseln (simple way to share snippets and pastes with others), können secret (hidden) oder public sein, können per <script> eingebettet werden, können geklont werden.
- GitHub Pages zur Erstellung statischer Webpages unter http://username.github.io, DNS CNAME möglich zur Verbindung zu eigener Domain, HTML-Generatoren Jekyll oder Octopress mit direkter Anbindung
- Gitorious - Host your open source projects and their repositories for free on Gitorious to enable community contributions.
- Plattform ist OSS
- Bitbucket - Store all of your Git and Mercurial source code in one place with unlimited private repositories. Includes issue tracking, wiki, and pull requests. Secure hosting with flexible permissions for your repositories. Integrates with JIRA, Jenkins, Pivotal, Cloud9 IDE and other developer tools.
Continuous Integration
- Jenkins - continuous integration server
- GitLab Integration
- Gitorious Integration
GitOps
- Infrastructure as a Code
- Konzept und Paradigma, bei dem Git für den gesamten Verwaltungsprozess einer Software eingesetzt wird – von der Entwicklung über das Deployment bis zur Pflege. A way for organizations to enable Ops teams move at the pace of application development.
- Continuous Deployment für Cloud Native Applikationen
- GitLab
- https://www.gitops.tech/
- https://www.dev-insider.de/was-ist-gitops-a-915663/
- Flux - Flux is a tool that automatically ensures that the state of a cluster matches the config in git
- Cloud-nativ: GitOps Working Group als Community-Projekt bei der CNCF gestartet
- gitops-working-group (GitHub)
- 3 Ways to approach GitOps
- A beginner's guide to GitOps
- GitOps in der Praxis | heise online
- Info und Marktübersicht: siehe iX 04/21 S.42 ff
- Kubernetes und GitOps: siehe iX 05/21 S.80
- Ceph-Verwaltung per GitOps: siehe iX 06/21 S.68
IDEs
Integration in Editoren und IDEs:
- Sublime Text mit Git-Integration mittels sublime-text-git oder SublimeGit
- Eclipse
Git und Eclipse
- http://www.eclipse.org/egit/
- http://wiki.eclipse.org/EGit/User_Guide
- http://wiki.eclipse.org/EGit/User_Guide/Remote
Git Workflow
Git Reporting
- http://gitreports.com
- http://phpmagazin.de/news/Git-Reports-Private-GitHub-Repositorys-fuer-anonyme-Bug-Reports-freigeben-169461
Begriffe
- Index = Staging Area
Kommandos
Konfiguration
- Konfiguration von $HOME/.gitconfig
git config --global user.name 'Max Mustermann' git config --global user.email Max.Mustermann@example.com git config --global color.ui auto git config --global -l git config --global -e man git-config
- Hinweis: ohne --global wird lokale Repository-Konfig editiert, mit --system die systemweite Konfig
- Konfiguration für einzelnes Repository
git config user.email Max.Mustermann@example.com
- Feature Macros (seit Git 2.24)
- https://github.blog/2019-11-03-highlights-from-git-2-24/
- Eine bestimmte Direktive setzt im Hintergrund die passenden (gruppierten) Konfigurationseinträge
feature.<NAME> z.B. git config feature.manyFiles true man git config
- Default-Branch setzen (z.B. nicht "master")
init.defaultBranch
Lokales Repository
- Projekt initialisieren (Vereichnis darf schon Files enthalten)
cd /etc git init apache2
oder gleichwertig
cd /etc/apache2 git init
Hinweise:
- erzeugt /etc/apache2/.git
- apache2 ist das Reposhttp://stackoverflow.com/questions/2199897/how-to-convert-a-git-repository-from-normal-to-bareitory
- Alle Files zum Index hinzufügen
cd apache2 git add *
- Veränderung an einer einzelnen Datei zum Index hinzufügen
git add <datei>
- Interaktiver Modus bei add zur selektiven Auswahl der Dateien
git add -i
- Veränderungen aller Dateien in Index übertragen (Update), jedoch noch kein Commit
git add -u
- Datei wieder aus dem Index entfernen
git rm --cached <datei>
- Commit (direkt mit Kommentar, Kommentar wird abgefragt, verbose)
git commit -m "First commit" git commit git commit -v
- Hinweis: git commit zeigt Änderungen an, die noch nicht im Index sind (staged), und listet noch nicht hinzugefügte Dateien
- Commit mit Umgehung des Index (sofort vom Working Tree ins Repository)
git commit -a -m "Comment"
- Letzten Commit widerrufen und mit neuem Kommentar bzw. neuen Dateien erneuern
git commit --amend git commit --amend --reset-author
- Inhalt eines Commits anzeigen (Patch Format):
git show HEAD git show 5203edd
- Einen Branch erzeugen
git branch next
- Einen Branch erzeugen und direkt auschecken
git checkout -b next
- Alle lokalen Branches anzeigen
git branch
- Alle Branches anzeigen - auch die Remote-Tracking-Branches
git branch -a
- Einen Branch auschecken (auf den dann die Änderungen im Working Tree wirken)
git checkout master git checkout next
- Einen Branch löschen
git branch -d next
- Commit Hash zu ggf. gelöschten Branches herausfinden mittels
git reflog
- Einen Commit auschecken
git checkout 2f562s
- Nur eine Datei eines Braches oder Commits auschecken
git checkout master <datei> git checkout 2f562s <datei>
- Einen Branch next mit Änderungen nach master mergen
git checkout next -> Datei editieren git add <datei> git commit git checkout master git merge next git push (Änderungen Richtung Remote)
- Empfehlenswert: Bei einem Merge auf jeden Fall eine Commit-Message erzeugen (entfällt sonst bei fast-forward Merge):
git merge next --no-ff
- Einen Merge zurücknehmen (z.B. wenn Fehler oder Probleme auftauchten)
git reset --merge
- Änderungen ab einem bestimmten Commit zurücknehmen (Historie bleibt aber erhalten mit git log -g)
git reset --hard 2f562s
- Lokale Änderungen im master Branch zurücknehmen und auf Stand von origin bringen [2]
git fetch --all git reset --hard origin/master
- Branches lokal löschen, die Remote nicht mehr vorhanden sind
git fetch --prune
- Merged Branches ausgeben
git branch --merged
- Unmerged Branches ausgeben
git branch --no-merged
- Rebase - sinvoll um zwischenzeitige Änderungen in master in meinen Entwicklungs-Branch next zu mergen (siehe GitLab Cookbook S.53)
git checkout next git rebase master
- Hinweis: Kann sein, dass der Branch next danach mit -f gepusht werden muss.
- Squashing - sinnvoll um Historie zu säubern, z.B. um Commits zusammenzufassen, bevor sie nach master gemerged werden [3]. Beispiel: die letzten beiden Commit zusammenfassen:
git checkout next git rebase -i HEAD~2
- Dann im Editor in der zweiten Zeile das "pick" in "squash" ändern. Und danach Commit-Message erstellen.
- Hinweis: Der erste Commit kann nicht "squashed" werden.
- Alternative: merge mit --squash
- Projektgeschichte ansehen (letzte 4 Commits, zeitliche Einschränkung)
git log -4 --color-words git log --after='2011-31-12' git log --before='2011-31-12' git log --since='yesterday' git log --format=fuller
- In Commit Message suchen
git log --grep "Bugfix:" v3..HEAD git log --grep "README" --oneline --all
- Nach Änderungen im Code suchen (String im Patch)
git log -G"mySuperMethod" --oneline
- Auch tags sehen mit "decorate"
git log --oneline --decorate
- Änderungen (Log) seit dem Tag "v3"
git log v3..HEAD
- Unterscheide anzeigen (zum letzten Commit)
git show --color-words git log -p --color-words
- Unterschiede anzeigen zw. Working Tree und Index (vor Commit)
git diff --color-words
- Unterschiede anzeigen zw. Index und Repository
git diff --staged --color-words
- Unterschiede einer Datei zum letzten Commit
git diff <datei>
- Unterschiede aller oder einer Datei zwischen aktueller Version und einem bestimmten Commit
git diff 6d4f69 git diff 6d4f69 <datei>
- Zeigen welche Dateien sich seit dem Tag "v3" geändert haben
git diff --name-only v3..HEAD git diff --name-only --diff-filter=M v3..HEAD
- Änderungen einer Datei verfolgen
git log -p -- <datei> git log -p --follow -p -- <datei>
- Muster in allen Dateien durchsuchen
git grep muster
- Muster in bestimmten Dateien durchsuchen (hier .conf)
git grep muster -- '*.conf'
- Den aktuellsten (letzten) Tag anzeigen ausgehend von Commit
git describe
Remote Repository
- ein existierendes lokales Repository erstmals auf einen Server pushen
git remote add origin ssh://user@gitserver/repo.git git push -u origin master
- Hinweis: "origin" ist der Name, mit dem man im folgenden das Remote Repository ansprechen kann.
- Verbundene Remote Repositories listen
git remote
- Komplette Zusammenfassung mit allen verfügbaren und verbundenen Branches und dem Tracking-Status
git remote show origin
- Änderungen in den Remote Repositories in allen Remote Tracking Branches nachziehen (herunterladen)
git remote update
- Status der Remote Tracking Branches abfragen:
git branch -vv
- Änderungen des Remote Tracking Branches (per "fetch" oder "remote update" zuvor aktualisiert) zum ausgecheckten Branch anzeigen (ohne vorheriges "pull", d.h. ohne Änderungen bereits im lokalen Branch übernommen zu haben) und erst dann übernehmen
git log -p ..@{u} git merge --ff-only @{u}
- URL eines Remote Repositorys ändern
git remote set-url origin https://...
- Clone erzeugen mit Referenz auf Origin
git clone ssh://user@gitserver/repo.git
- Nach einem Fork zukünftig auch Updates der Originals einpflegen (Branch updates/master)
git remote add updates ssh://user@gitserver/repo.git git fetch updates git merge updates/master
- Einen (lokalen) Branch auschecken (auf den dann die Änderungen im Working Tree wirken)
git checkout master
oder für Branch next
git checkout next
- Einen Remote-Branch auschecken (der lokal noch nicht existiert) und dabei einen neuen lokal erzeugen [4]
git checkout -b local-name origin/remote-name
- Einen neuen Remote-Branch, der nicht lokal existiert, in den aktuellen Branch mergen (ohne Remote-Branch zuvor lokal auszuchecken):
git fetch (nicht "git merge" !!!) git log origin/branch-new git merge origin/branch-new
- Änderungen vom Remote herunterladen und direkt mergen
git pull
- Auch Tags herunterladen
git pull --tags
- Änderungen nach Commit zum Remote hochladen (Origin darf nicht bare sein, s.u.)
git push
- Auch Tags hochladen
git push --tags
- Lokal gelöschte Tags remote löschen
git push --prune --tags
- Neue lokale Branches nach Remote pushen
- Einen (neuen) Branch einmalig nach Remote pushen (wird dort automatisch erzeugt)
git push origin next git push --all
- Oder besser den neuen Branch dabei sofort in die Upstream-Konfig übernehmen, damit nachfolgend git push ausreicht:
git push -u origin next
- Oder (nachträglich) den Upstream umkonfigurieren, Remote Branch origin/alpha muss jedoch schon existieren - ggf. mit Gerrit anlegen und pullen [5]
git branch -u origin/alpha alpha
- Konfig .git/config
[remote "origin"] url = ssh://user@gitserver/repo fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [branch "next"] remote = origin merge = refs/heads/next
- Eine Branch remote löschen
git push origin --delete branch-to-delete
- Backup in zweites Repo "myrepo" machen:
- Konfig .git/config
[remote "origin"] url = https://.... fetch = +refs/heads/*:refs/remotes/origin/* [remote "myrepo"] url = ssh://…. fetch = +refs/heads/*:refs/remotes/myrepo/*
- Pushen
git push --set-upstream myrepo git push --all myrepo git push --tags myrepo
Remote Repository auf gleichem Host
- Clone erzeugen mit Referenz auf Origin
cd /tmp git clone /etc/apache2
erzeugt /tmp/apache2
- Für einen Push von Änderungen nach Origin muss das Origin bare sein (ohne .git, ohne working directory). Siehe auch [6]. Daher sollte in so einem Fall das Origin so erzeugt werden:
cd /etc/apache2 git init --bare
- Server wie Gerrit erzeugen Repositories standardmäßig als "bare" ohne working directory.
- Siehe [7] wie man von non-bare nach bare konvertiert, z.B. mittels
git clone --bare /etc/apache2
erzeugt Verzeichnis
apache2.git
Patches
Patch erzeugen
- Repository auschecken
- Datei(en) ändern
- Prüfen der Änderungen
git status git diff
- Änderungen committen
git commit -a -m "Fixed ...."
- Patch-Datei erzeugen (zum letzten Commit mit "-1") mit Endung .patch
git format-patch -1
Beispiel-Datei:
From 41a9da71595c9d2d793cbbb678b720f000c5c9d9 Mon Sep 17 00:00:00 2001 From: Max Mustermann <max@mustermann.de> Date: Sun, 5 Apr 2015 17:49:02 +0200 Subject: [PATCH] declare i outside the loop fixes C99 compile error refs #8986 --- base/utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/base/utils.c b/base/utils.c index 9924a03..53f8a69 100644 --- a/base/utils.c +++ b/base/utils.c @@ -300,7 +300,8 @@ pthread_mutex_t registered_fds_lock; int init_registered_fds(void) { - for (int i = 0; i < REGISTERED_FD_MAX; i++) { + int i; + for (i = 0; i < REGISTERED_FD_MAX; i++) { registered_fds[i] = -1; } -- 2.3.4
Patch einspielen
- neuen Branch in master erzeugen
git checkout -b newbranch
- Patch anwenden
git am --signoff <patchfile>
- Commit ersetzen/ergänzen
git commit --amend
Patch per E-Mail
- siehe c't 25/20 S.81
git send-mail git am git format patch
- Mail-Client Aerc speziell auf Git ausgelegt
Siehe auch
Andere Version Control Tools
- Data Version Control (DVC) System for Machine Learning Projects
- wird verwendet in Kombination mit Git; Versionierung von Daten und Modellen
- Verwaltung und Inbetriebnahme von ML-Modellen