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 11:05] hofer [git tag -a nameDesTags] |
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 95: | Zeile 121: | ||
</code> | </code> | ||
- | ''apply'' wendet die Änderungen nur an. | + | * ''apply'' wendet die Änderungen nur an |
- | ''pop'' wendet die Änderungen an und löscht den Eintrag vom stash. | + | * ''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. | + | * 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 104: | 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 110: | 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. |