Git Milan Rybář <email@milanrybar.cz>
Obsah Procházení historie Tagy Rebase Patch
Procházení historie Mocný příkaz git log Mnoho možností $ git log commit 8c7a786b6c8eae8eac91083cdc9a6e337bc133b0 Author: Junio C Hamano <gitster@pobox.com> Date: Sun Oct 21 13:56:23 2012-0700 Git 1.8.0 Signed-off-by: Junio C Hamano <gitster@pobox.com> commit 8ead1bfe111085ef1ad7759e67340f074996b244 Merge: 87a5461 f6dd784 Author: Junio C Hamano <gitster@pobox.com> Date: Wed Oct 17 15:55:46 2012-0700 Merge tag 'gitgui-0.17.0' of git://repo.or.cz/git-gui git-gui 0.17.0... * tag 'gitgui-0.17.0' of git://repo.or.cz/git-gui: git-gui 0.17 git-gui: Don't prepend the prefix if value looks like a full path
git log Základní možnosti -p diff u každého commitu -<n> omezení výstupu na n položek $ git log -p -1 commit 8c7a786b6c8eae8eac91083cdc9a6e337bc133b0 Author: Junio C Hamano <gitster@pobox.com> Date: Sun Oct 21 13:56:23 2012-0700 Git 1.8.0 Signed-off-by: Junio C Hamano <gitster@pobox.com> diff --git a/documentation/relnotes/1.8.0.txt b/documentation/relnotes/1.8.0.txt index 04f6ace..43883c1 100644 --- a/documentation/relnotes/1.8.0.txt +++ b/documentation/relnotes/1.8.0.txt @@ -4,16 +4,18 @@ Git v1.8.0 Release Notes Backward compatibility notes ---------------------------- -In the next major release, we will change the behavior of the "git -push" command. When "git push [$there]" does not say what to push, we -have used the traditional "matching" semantics so far (all your branches were -sent to the remote as long as there already are branches of the same...
git log Základní možnosti 2 --stat statistika u každého commitu Seznam modifikovaných souborů Počet modifikovaných souborů Počet přidaných a smazaných řádků v těchto souborech $ git log --stat -1 commit 8c7a786b6c8eae8eac91083cdc9a6e337bc133b0 Author: Junio C Hamano <gitster@pobox.com> Date: Sun Oct 21 13:56:23 2012-0700 Git 1.8.0 Signed-off-by: Junio C Hamano <gitster@pobox.com> Documentation/RelNotes/1.8.0.txt 22 +++++++++++++--------- Documentation/git.txt 5 +++++ GIT-VERSION-GEN 2 +- 3 files changed, 19 insertions(+), 10 deletions(-)
git log Formátování výstupu --pretty formátování výstupu oneline každý commit na jedné řádce $ git log --pretty=oneline -3 8c7a786b6c8eae8eac91083cdc9a6e337bc133b0 Git 1.8.0 8ead1bfe111085ef1ad7759e67340f074996b244 Merge tag 'gitgui-0.17.0' of git://repo.or.cz/git-gui f6dd784ed4c1705d465b1238f9a5971f2733e582 git-gui 0.17 short, full a fuller liší se pouze množstvím informací format definice vlastního formátování $ git log --pretty=format:"%h - %an, %ar : %s" 8c7a786 - Junio C Hamano, 2 weeks ago : Git 1.8.0 8ead1bf - Junio C Hamano, 3 weeks ago : Merge tag 'gitgui-0.17.0' of git://repo.or.cz/git-gui f6dd784 - Pat Thoyts, 3 weeks ago : git-gui 0.17 df46eda - Andrew Wong, 5 weeks ago : git-gui: Don't prepend the prefix if value looks like a full path e3d06ca - Andrew Wong, 5 weeks ago : git-gui: Detect full path when parsing arguments 87a5461 - Junio C Hamano, 3 weeks ago : Git 1.8.0-rc3 3d0a2d6 - Junio C Hamano, 3 weeks ago : Merge git://github.com/git-l10n/git-po d2bfef2 - Junio C Hamano, 3 weeks ago : Sync with 1.7.12.4...
git log Formátování výstupu 2 Užitečné parametry pro --pretty=format Option Description of Output %H Commit hash %h Abbreviated commit hash %T Tree hash %t Abbreviated tree hash %P Parent hashes %p Abbreviated parent hashes %an %ae %ad %ar Author name Author e-mail Author date (format respects the date= option) Author date, relative Option Description of Output %cn Committer name %ce Committer email %cd Committer date %cr Committer date, relative %s Subject
git log Vizuální znázornění --graph ASCII graf znázorňující branch a merge historii $ git log --pretty=format:"%h %s" --graph * 8c7a786 Git 1.8.0 * 8ead1bf Merge tag 'gitgui-0.17.0' of git://repo.or.cz/git-gui \ * f6dd784 git-gui 0.17 * df46eda git-gui: Don't prepend the prefix if value looks like a full path * e3d06ca git-gui: Detect full path when parsing arguments * 5a5e4d2 git-gui: remove.git/cherry_pick_head after committing * 9ef7508 git-gui: Fix a loose/lose mistake * 44e88ce git-gui: Fix semi-working shortcuts for unstage and revert * 272b929 Merge branch 'rt/trans' \ * 1a8cdac git-gui: de.po: translate "remote" as "extern" * 774b79f git-gui: de.po: translate "bare" as "bloă" * 3c3737d git-gui: de.po: consistently add untranslated hook names within braces * fda1ba0 git-gui: preserve commit messages in utf-8 * c42939d git-gui: open console when using --trace on windows / * ef42057 git-gui: fix a typo in po/ files * 446f822 git-gui: Use PWD if it exists on Mac OS X * ba5d445 git-gui: fix git-gui crash due to uninitialized variable...
git log Filtrování Implicitně se zobrazuje historie pouze k poslednímu commitu (HEAD), resp. tam kde se nacházíme --branches[=<pattern>] - zobrazí všechny branches nebo omezí podle <pattern> --tags[=<pattern>] podobné jako u --branches --all zobrazí celou historii --merges pouze merge commits --no-merges bez merge commits
git log Filtrování 2 --since, --after commity po tomto datu Konkrétní datum --since="2008-01-15" Relativní --since="2 years 1 day 3 minutes ago" --until, --before commity před tímto datem --committer --author $ git log --author="linus Torvalds" --pretty="%ar - %s" -- README 8 years ago - Update README to reflect the hierarchical tree objects, and other newfangled things like merging. 8 years ago - Rename ".dircache" directory to ".git" 8 years ago - Initial revision of "git", the information manager from hell
Procházení historie - GUI gitk platí pro něj stejná pravidla jako pro git log
Tagy git tag seznam tagů v abecedním pořadí Filtrace pomocí parametru -l 2 typy tagů Lightweight tag Podobný jako branch, který se nemění - pouze ukazatel na konkrétní commit Vytvoření git tag <tagname> Annotated tag Uloženy jako plné objekty v Git databázi Obsahují jméno a email autora tagu, datum, zprávu a mohou být podepsány (a zkontrolovány) pomocí GPG (GNU Privacy Guard) Doporučeno používat tento typ, kde jsou obsaženy veškeré informace Vytvoření git tag a <tagname> [-m <msg>]
Tagy 2 git show <tagname> - informace o tagu a commitu git tag d <tagname> - smazání tagu Obdobně jako u branches git push implicitně nepřenáší tagy Explicitní přenos tagu pomocí - git push origin <tagname> Automatický přenos tagů - git push origin --tags
Rebase 2 způsoby jak začlenit změny z jedné větve do druhé merge a rebase Merge Three-way merge mezi C3 a C4 a jejich posledním předkem (C2) Rebase Vezme patch změn z C3 a aplikuje je na C4 Obrázky převzaty z Git Book (http://git-scm.com/book/)
Rebase Princip $ git checkout experiment $ git rebase master First, rewinding head to replay your work on top of it... Applying: added staged command Jde se do společného předka dvou větví. Vezme se diff každého commitu z větve, na které jsme. Uložení diffů do dočasných souborů. Přepnutí na větev, do které provádíme rebase. Postupná aplikace každé změny.
Rebase Princip 2 Vrácení se do větve, na kterou provádíme rebase, a provedení fast-forward merge (pouhé posunutí ukazatele). Výsledek C3 je stejný jako C5 vytvořený v merge příkladě. Výsledek je sice stejný, ale rebase vytváří čistčí historii. Při zkoumání rebased větve to vypadá jako lineární historie. Při přispívání do projektu nemusí správce provádět žádnou práci při začleňování, pouze fast-forward
Rebase Zajímavější příklad Merge client větve do master, ale zatím beze změn ze server větve. $ git rebase --onto master server client Zjistí patche ze společného předka větví client a server a potom je aplikuje na master větev. Posune master větev. $ git checkout master $ git merge client
Rebase Zajímavější příklad 2 Potom se rozhodneme začlenit také server větev. $ git rebase master server Posun master větve a smazání nepotřebných větví. $ git checkout master $ git merge server $ git branch -d client $ git branch -d server
Patch Vytvoření a poslání Přispívání do projektu pomocí patche git format-patch vytvoří patch soubory (mailbox format), které lze poslat na mailing list vývojářů Každý commit je samostatný soubor Přepínač M hledá i přejmenování Soubory lze poslat ručně přes email nebo pomocí git příkazu send-email git send-email *.patch
Patch Formát Vytvoření patche z větve, která vychází z master $ git format-patch master 0001-Modify-hello-message.patch $ cat 0001-Modify-hello-message.patch From 008f4de47cddcd6a12218d22ee5082e72ffa6a57 Mon Sep 17 00:00:00 2001 From: Milan Rybar <email@milanrybar.cz> Date: Tue, 6 Nov 2012 16:43:16 +0100 Subject: [PATCH] Modify hello message --- hello.c 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hello.c b/hello.c index f70a3a8..a8646ca 100644 --- a/hello.c +++ b/hello.c @@ -2,6 +2,6 @@ int main(int argc, char ** argv) { -print("hello World"); +print("hello Heaven"); return 0;...
Patch Aplikování Integrace v nové větvi, kde se nejdříve otestuje správnost 2 možnosti integrace git apply Integrace patche vytvořeného pomocí git diff nebo diff Podobné přikazu patch, ale git apply aplikuje vše nebo nic Formát vygenerovaný pomocí git diff navíc popisuje vytvořené, smazané a přejmenované soubory git apply --check - kontrola jestli se podaří patch aplikovat git am Patch vygenerován pomocí git format-patch, jednoduší integrace, protože patch obsahuje informace o autorovi a commit zprávu Čte mbox soubory plain-text formát pro uložení více emailových zpráv do jednoho textového souboru
Patch git am - Konflikty Mohou nastat konflikty Hlavní větev se hodně změnila oproti větvi, z které je patch vyroben Patch závisí na jiném patchi, který ješte nebyl aplikován $ git am 0001-seeing-if-this-helps-the-gem.patch Applying: seeing if this helps the gem error: patch failed: ticgit.gemspec:1 error: ticgit.gemspec: patch does not apply Patch failed at 0001. When you have resolved this problem run "git am --resolved". If you would prefer to skip this patch, instead run "git am --skip". To restore the original branch and stop patching run "git am --abort".
Zdroje Git Book - http://git-scm.com/book/
Děkuji za pozornost