====== GIT ====== * http://rogerdudler.github.com/git-guide/ * http://marklodato.github.com/visual-git-guide/index-en.html * http://www.gitguys.com/topics/ * http://git-scm.com * [[http://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit-in-git|Author names ändern]] * http://365git.tumblr.com * http://theterrorists.org/~ben/cheat/git.png * http://eagain.net/articles/git-for-computer-scientists/ * http://salkuma.files.wordpress.com/2011/07/git-transport.png (workspace, index, remote, ... werlcher befehl arbeitet wo) * https://github.com/ginatrapani/ThinkUp/wiki/Developer-Guide:-Get-the-Source-Code-from-GitHub-and-Keep-It-Updated/abbe99abacc7bb5623cdc075424514ffadac2b17 * Sehr guter [[http://youtu.be/GYnOwPl8yCE|Vortrag]] ([[https://speakerdeck.com/pbhogan/power-your-workflow-with-git|Slides]]) Zubeginn ist alles leer (Working directory & Index): $ git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track) $ git ls-files --debug -s Anlegen eines zweier files, wovon eins in den Index kommt (stage) $ touch unused $ touch foo $ git add foo $ git commit -a -m "Added foo" [master (root-commit) 5f3450e] Added foo 0 files changed create mode 100644 foo $ git status # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # # unused nothing added to commit but untracked files present (use "git add" to track) $ git ls-files --debug -s 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 foo ctime: 1354306311:692664264 mtime: 1354306311:692664264 dev: 28 ino: 119763 uid: 1000 gid: 1000 size: 0 flags: 0 ''foo'' touchen, aber nicht den Inhalt verändern $ touch foo Keine Änderung wird erkannt & Neue m-time: $ git status # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # # unused nothing added to commit but untracked files present (use "git add" to track) $ git ls-files --debug -s 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 foo ctime: 1354306421:958755979 mtime: 1354306421:958755979 dev: 28 ino: 119763 uid: 1000 gid: 1000 size: 0 flags: 0 ''foo'' touchen & Inhalt verändern: $ echo "content" > foo Änderung erkannt & m-time bleibt alt: $ git status # On branch master # Changes not staged for commit: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # modified: foo # # Untracked files: # (use "git add ..." to include in what will be committed) # # unused no changes added to commit (use "git add" and/or "git commit -a"): $ git ls-files --debug -s 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 foo ctime: 1354306421:958755979 mtime: 1354306421:958755979 dev: 28 ino: 119763 uid: 1000 gid: 1000 size: 0 flags: 0 ''foo'' In den Index hinzufügen (stagen): $ git add foo Änderungen übernommen (neue SHA1) & neue m-time: $ git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: foo # # Untracked files: # (use "git add ..." to include in what will be committed) # # unused $ git ls-files --debug -s 100644 d95f3ad14dee633a758d2e331151e950dd13e4ed 0 foo ctime: 1354306489:705068567 mtime: 1354306489:705068567 dev: 28 ino: 119763 uid: 1000 gid: 1000 size: 8 flags: 0 Committen: $ git commit -a -m "Modified foo" [master fc724cf] Modified foo 1 file changed, 1 insertion(+) Index bleibt unverändert: $ git status # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # # unused nothing added to commit but untracked files present (use "git add" to track) $ git ls-files --debug -s 100644 d95f3ad14dee633a758d2e331151e950dd13e4ed 0 foo ctime: 1354306489:705068567 mtime: 1354306489:705068567 dev: 28 ino: 119763 uid: 1000 gid: 1000 size: 8 flags: 0 * Index ist immer über alle getrackten Dateien. \\ => Untracked files sind nicht im Index. \\ => Sie werden nicht committed. $ cp old new $ git rm old rm 'old' $ git add new $ git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # renamed: old -> new # # Untracked files: # (use "git add ..." to include in what will be committed) # # unused $ git commit -a -m "renaming" [master 289cf21] renaming 1 file changed, 0 insertions(+), 0 deletions(-) rename old => new (100%) * File moves werden nicht protokolliert, sondern on-demand heuristisch erkannt * Ein Commit ist ein eingefrorener Index zustand (über alle getrackten Dateien/Ordner, egal ob geändert oder nicht) * Da Index \ne Working copy sein kann, sind alle Dateien/Ordner im Index links auf GIT Objekte ===== Wichtige Befehle ===== ^ Befehl ^ Bedeutung ^ | ''git add -p '' | Wähle aus //welche// Änderungen in den Index sollen | | ''git diff []'' | Working coppy VS. Index (of a file) | | ''git diff --cached []'' | Index VS. HEAD (of a file) | | ''git log []'' | Commit history (of a file) | | ''git show '' | Commit message + diffs | | ''git cat-file -p '' | Zeige GIT Objekte aus dem object strorre | | ''git clone '' \\ ''git submodule init'' \\ ''git submodule update'' | Repo mit submodulen inizialisieren (clonen) \\ (submodule müssen extra explizit behandelt werden) | ===== Dateistruktur ===== ==== Objects ==== ''/objects//'' Können entweder mit for x in t s p ; do git cat-file -$x 3d646c3d1bf84007c93ab1d78e7f6941ef65bdc2 ; done oder mit perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' .git/objects/28/9cf21ee611ca2c335fa77f48f4613bd5255aa3 angeschaut werden ==== Refs ==== ''/refs/'' In Ordnern sind files die einen Hash enthalten. Somit Wird einem GIT object ein Name gegeben. ''/HEAD'' Referenz auf eine file in ''/refs''. Ist link auf den //aktuellen HEAD// des //aktuellen branches// und somit indirekt auf den letzten commit. ==== Tags ==== ''/refs/tags/'' ist eine datei die den Hash eines der follgenden Objekte enthält ^ Was ^ Tag typ ^ | tag object | Annotiated Tag | | blob object | Leightweight Tag | | tree object | ::: | | commit object | ::: | * Ein tag object kann auf alle //4// Typen (auch tags selbst) wieder verweisen * Nur annotiated tags können commitet werden (sie sind ja schließlich eigene objekte. Commits als tags könnten nicht vom commit selbst unterschieden werden) * Annotiated Tags werden standartmäsig //nicht// committed (???) * Annotiated tags sind zu bevorzugen, da dort u.a. auch der ersteller gespeichert wird.