Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
developer:github [2015/01/21 10:39] hofer [Alternative zu merge commit: git rebase] |
developer:github [2019/08/13 13:48] (aktuell) |
||
---|---|---|---|
Zeile 31: | Zeile 31: | ||
Damit man mit den lokalen Änderungen nicht durcheinander, kommt sollte vorher alles lokale **commited** werden. | Damit man mit den lokalen Änderungen nicht durcheinander, kommt sollte vorher alles lokale **commited** werden. | ||
+ | |||
+ | Falls bereits lokale Änderungen im Master vorhanden sind wird automatisch ein Merge Commit erzeugt. Um das zu verhindern kann <code>git pull --rebase</code> verwendet werden. | ||
===== Alternative zu merge commit: git rebase ===== | ===== Alternative zu merge commit: git rebase ===== | ||
Zeile 60: | Zeile 62: | ||
</code> | </code> | ||
- | In diesem Fall wird die gesamte history (alle commits) vom branch in den master mitgenommen. Wenn das nicht gewollt ist, kann man dem merge-Befehl noch den Parameter ''--squash'' mitgeben. Muss dann aber noch einen extra commit durchführen. Git befüllt in diesem Fall die commit message bereits mit allen möglichen Infos. | + | In diesem Fall wird die gesamte history (alle commits) vom branch in den master mitgenommen. Wenn das nicht gewollt ist, kann man dem merge-Befehl noch den Parameter ''%%--%%squash'' mitgeben. Muss dann aber noch einen extra commit durchführen. Git befüllt in diesem Fall die commit message bereits mit allen möglichen Infos. |
<code> | <code> | ||
Zeile 68: | Zeile 70: | ||
git push | git push | ||
</code> | </code> | ||
+ | |||
+ | Wenn man danach mit dem branch noch weiter arbeiten möchte, muss man den Startpunkt ändern (wo zweigt der branch ab). | ||
+ | |||
+ | <code> | ||
+ | git checkout master | ||
+ | git branch -f mein-feature-branch <letzterCommit> | ||
+ | </code> | ||
+ | |||
+ | Oder branch einfach löschen. | ||
+ | |||
+ | <code> | ||
+ | git branch -D mein-feature-branch | ||
+ | </code> | ||
+ | |||
+ | Soll ein neuer lokaler Branch für alle zur Verfügung stehen, kann dieser mit folgendem Befehl auf Github gepusht werden | ||
+ | <code> | ||
+ | git push origin mein-feature-branch | ||
+ | </code> | ||
+ | |||
+ | Damit danach ein status/pull/push korrekt funktioniert muss noch folgender Befehl ausgeführt werden | ||
+ | <code> | ||
+ | git branch --set-upstream-to=origin/mein-feature-branch mein-feature-branch | ||
+ | </code> | ||
+ | |||
===== git checkout (-b) nameDesBranches ===== | ===== git checkout (-b) nameDesBranches ===== | ||
Zeile 81: | Zeile 107: | ||
Markiert eine bestimmte Version/Revision. Hilfreich zB wenn man festhalten will welche Version aktuell auf Produktion ist. Ermöglicht dann auch einen einfachen Rollback bei Fehlern zu vorigen Versionen. | Markiert eine bestimmte Version/Revision. Hilfreich zB wenn man festhalten will welche Version aktuell auf Produktion ist. Ermöglicht dann auch einen einfachen Rollback bei Fehlern zu vorigen Versionen. | ||
+ | |||
+ | ===== git stash ===== | ||
+ | |||
+ | Will man zB auf einen anderen branch wechseln ohne die aktuellen Änderungen zu commiten oder zu verwerfen kann man sie "stashen". Nach ''git stash'' hat man einen sauberen directory tree und kann branch wechseln, commiten, testen usw. | ||
+ | |||
+ | Um die Änderungen wieder auf den aktuellen branch anzuwenden gibts folgende Befehle: | ||
+ | |||
+ | <code> | ||
+ | git stash apply | ||
+ | git stash pop | ||
+ | git stash apply --index | ||
+ | git stash pop --index | ||
+ | </code> | ||
+ | |||
+ | * ''apply'' wendet die Änderungen nur an | ||
+ | * ''pop'' wendet die Änderungen an und löscht den Eintrag vom stash. | ||
+ | * Der Parameter ''%%--%%index'' stellt dann auch die "staging area" genauso wieder her wie sie vorher war. | ||
+ | |||
+ | ===== commit rückgängig machen ===== | ||
+ | |||
+ | Jeder commit hat einen Hash (vergleichbar mit Revisionsnummer). Sehen kann man diese hashes über ''git log''. | ||
+ | |||
+ | <code> | ||
+ | commit 1ece8a2f6be4429b3b9ddc934da5030389f7ecb1 | ||
+ | Author: Robert Hofer <robert.hofer@technikum-wien.at> | ||
+ | Date: Tue Jan 20 10:34:08 2015 +0100 | ||
+ | |||
+ | erster commit | ||
+ | </code> | ||
+ | |||
+ | Um zu einem vorigen commit zu springen benötigt man diesen: | ||
+ | |||
+ | <code> | ||
+ | git checkout 1ece8a2f6be4429b3b9ddc934da5030389f7ecb1 | ||
+ | </code> | ||
+ | |||
+ | Das Ganze geht auch kürzer: | ||
+ | |||
+ | <code> | ||
+ | $ git log --oneline | ||
+ | 8d9a142 Squashed commit of the following: | ||
+ | 6121e0e acht | ||
+ | 08d267d Squashed commit of the following: | ||
+ | 37fa721 drei | ||
+ | 274478b zwei | ||
+ | 1ece8a2 erster commit | ||
+ | $ git checkout 1ece8a2 | ||
+ | </code> | ||
+ | |||
+ | Vom hash reichen also auch die ersten 7 Stellen aus. | ||
+ | ===== Working Copy zurücksetzen ===== | ||
+ | Wenn bereits lokale Commits vorhanden sind die verworfen werden sollen kann der aktuelle stand des Remote repositorys geholt werden mit: | ||
+ | <code> | ||
+ | Auf Branch ci | ||
+ | Ihr Branch ist vor 'origin/ci' um 30 Commits. | ||
+ | (benutzen Sie "git push", um lokale Commits zu publizieren) | ||
+ | nichts zu committen, Arbeitsverzeichnis unverändert | ||
+ | </code> | ||
+ | Diese können mit folgenden Befehl verworfen werden: | ||
+ | <code> | ||
+ | git reset --hard origin/ci | ||
+ | </code> | ||
+ | wobei ci der name des Remote Branch ist. | ||
+ | |||
+ | ===== Branch Merge ===== | ||
+ | Wenn die Entwicklung in einem eigenen Branch stattfindet können die Änderungen vom Master in den Branch übernommen werden damit der Branch wieder am aktuellen Stand ist.\\ | ||
+ | 1. Schritt: Master aktualisieren | ||
+ | <code> | ||
+ | git checkout master | ||
+ | git pull | ||
+ | </code> | ||
+ | 2. Schritt: Branch aktualisieren | ||
+ | <code> | ||
+ | git checkout ci | ||
+ | git pull | ||
+ | </code> | ||
+ | 3. Schritt: Änderungen vom Master in den Branch mergen | ||
+ | (Man muss sich im Branch befinden) | ||
+ | <code> | ||
+ | git merge master | ||
+ | </code> | ||
+ | |||
+ | Wenn es zu Konflikten kommt müssen diese aufgelöst werden. | ||
+ | Mit 'git status' bekommt man eine Übersicht über den aktuellen Stand. | ||
+ | \\ | ||
+ | Soll bei einem Konflikt die Version des Branches übernommen werden kann das mit folgendem Befehl gemacht werden: | ||
+ | <code> | ||
+ | git checkout --ours datei.php | ||
+ | </code> | ||
+ | Soll stattdessen die Version aus dem Master übernommen werden: | ||
+ | <code> | ||
+ | git checkout --theirs datei.php | ||
+ | </code> | ||
+ | Anschließend wird die korrigierte Datei hinzugefügt: | ||
+ | <code> | ||
+ | git add datei.php | ||
+ | </code> | ||
+ | Wenn alle Konflikte behoben sind werden die Änderungen commited: | ||
+ | <code> | ||
+ | git commit | ||
+ | </code> | ||
+ | Und nach dem testen gepusht: | ||
+ | <code> | ||
+ | git push | ||
+ | </code> | ||
===== Andere interessante Befehle ===== | ===== Andere interessante Befehle ===== | ||
Zeile 87: | Zeile 218: | ||
git rm index.php</code> | git rm index.php</code> | ||
+ | ===== Branch auf Commandline anzeigen ===== | ||
+ | Um den aktuellen Branch direkt im Prompt auf der Commandline anzuzeigen kann die Variable %%$(__git_ps1)%% in der Datei ~/.bashrc gesetzt werden: | ||
+ | <code> | ||
+ | PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\[\033[0;32m\]$(__git_ps1)\[\033[0m\]\$ ' | ||
+ | </code> | ||
+ | Um zusätzlich anzuzeigen ob es dort Änderungen gibt kann folgende Zeile hinzugefügt werden: | ||
+ | <code> | ||
+ | export GIT_PS1_SHOWDIRTYSTATE=1 | ||
+ | </code> | ||
+ | ==== Alias ==== | ||
+ | In der Datei ~/.gitconfig können Alias Befehle gesetzt werden um zB formatierte Logeinträge leichter anzuzeigen: | ||
+ | <code> | ||
+ | [alias] | ||
+ | ci = commit | ||
+ | lc = log ORIG_HEAD.. --stat --no-merges | ||
+ | st = status | ||
+ | co = checkout | ||
+ | lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative | ||
+ | </code> | ||
===== Workflow ===== | ===== Workflow ===== | ||
Zeile 93: | Zeile 243: | ||
Die Grafiken in der [[http://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging|git doku]] sagen mehr als 1000 Worte. Und [[https://guides.github.com/introduction/flow/index.html|der Guide]] schaut auch übersichtlich aus. | Die Grafiken in der [[http://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging|git doku]] sagen mehr als 1000 Worte. Und [[https://guides.github.com/introduction/flow/index.html|der Guide]] schaut auch übersichtlich aus. | ||
+ | |||
+ | ===== Aktuelle git Version installieren ===== | ||
+ | |||
+ | Für debian gibt es nur relativ alte git Versionen (max. 1.9 über backport). Aktuell sind sie aber bei 2.3.0. Die Version muss man selbst kompilieren. Und zwar so: | ||
+ | |||
+ | <code> | ||
+ | sudo apt-get install autoconf libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev | ||
+ | sudo apt-get remove git | ||
+ | wget https://www.kernel.org/pub/software/scm/git/git-X.Y.Z.tar.gz | ||
+ | tar -zxf git-X.Y.Z.tar.gz | ||
+ | cd git-X.Y.Z | ||
+ | make configure | ||
+ | ./configure --prefix=/usr | ||
+ | make all doc info | ||
+ | sudo make install install-doc install-html install-info | ||
+ | cd .. | ||
+ | rm -r git-X.Y.Z | ||
+ | </code> | ||
+ | |||
+ | Siehe auch [[http://git-scm.com/book/en/v2/Getting-Started-Installing-Git|Installing Git]] | ||
+ | |||
+ | ===== git url alias ===== | ||
+ | |||
+ | Um zum Beispiel https URLs auf ssh URLs umzuschreiben kann man in ''~/.gitconfig'' folgenden Eintrag machen: | ||
+ | |||
+ | <code> | ||
+ | [url "git://git@github.com:"] | ||
+ | insteadOf = https://github.com/ | ||
+ | </code> | ||
+ | |||
+ | ''<nowiki>https://github.com/</nowiki>'' wird jetzt immer durch ''<nowiki>git://git@github.com:</nowiki>'' ersetzt. | ||
+ | |||
+ | Damit dieses Alias bei ''git submodule'' greift, müssen vorher in ''.git/config'' die submodule gelöscht werden. Beispiel: | ||
+ | |||
+ | <code> | ||
+ | [submodule "submodules/tablesorter"] | ||
+ | url = git@github.com:christianbach/tablesorter.git | ||
+ | </code> | ||
+ | |||
+ | Diesen Eintrag entfernen. Den Ordner samt submodule (sicherheitshalber) löschen. Und dann | ||
+ | |||
+ | <code> | ||
+ | git submodule init | ||
+ | git submodule update | ||
+ | </code> | ||
+ | |||
+ | ''.git/config'' kontrollieren, hier sollten jetzt die ssh URLs eingetragen sein. |