
Čo sa skrýva vo vnútri Gitu?

655a20f99af32926cbf6d8fab092506ddd70e49cIde najmä o:
Každý objekt je identifikovateľný s pomocou svojho SHA-1 hashu.
Tip: v powershelli môžeš namiesto príkazu cat použiť gc (alias pre Get-Content)
Porcelain:
commit, log, merge, pull, push, status, …Plumbing:
cat-file, commit-tree, hash-object, ls-files, merge-base, rev-parse, …
.git tree.git
├── HEAD ref: refs/heads/main
├── index
├── objects
│ └── 59 blob [test.txt] 'version 1'
│ └── 4dc0e39bc4468ee19c67e65d37b97eb963b68b
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
└── refs
├── heads
|
└── tags
.git ├── HEAD ref: refs/heads/main ├── index ├── objects │ ├── 59 blob [test.txt] 'version 1' │ │ └── 4dc0e39bc4468ee19c67e65d37b97eb963b68b │ ├── 67 tree [blob 594d] │ │ └── 4d4d31b97233152f3be1825cc9e765fa2b2859 │ └── f8 commit [tree 674d] "First" │ └── 0a04ee3dfbeb5eb666ade615abc617c1ea20e3 │ │ │ │ │ │ │ │ │ │ │ │ └── refs ├── heads | └── main f80a... └── tags
.git ├── HEAD ref: refs/heads/main ├── index ├── objects │ ├── 59 blob [test.txt] 'version 1' │ │ └── 4dc0e39bc4468ee19c67e65d37b97eb963b68b │ ├── 67 tree [blob 594d] │ │ └── 4d4d31b97233152f3be1825cc9e765fa2b2859 │ ├── f8 commit [tree 674d] "First" │ │ └── 0a04ee3dfbeb5eb666ade615abc617c1ea20e3 │ ├── f0 blob [test.txt] 'version 2' │ │ └── d983103c610431663d84b3012d1b172f2f52ea │ ├── 37 tree [tree 674d, blob f0d9] │ │ └── 87931e43c8baf51f3ffafc44f6394651a505ca │ └── 53 commit [tree 3787, par. f80a] "Second" │ └── 9f7e662b0fa2ceb0df1dc9332179b06e5cdaec │ │ │ │ │ │ └── refs ├── heads | └── main 539f... └── tags
.git ├── HEAD ref: refs/heads/main ├── index ├── objects │ ├── 59 blob [test.txt] 'version 1' │ │ └── 4dc0e39bc4468ee19c67e65d37b97eb963b68b │ ├── 67 tree [blob 594d] │ │ └── 4d4d31b97233152f3be1825cc9e765fa2b2859 │ ├── f8 commit [tree 674d] "First" │ │ └── 0a04ee3dfbeb5eb666ade615abc617c1ea20e3 │ ├── f0 blob [test.txt] 'version 2' │ │ └── d983103c610431663d84b3012d1b172f2f52ea │ ├── 37 tree [tree 674d, blob f0d9] │ │ └── 87931e43c8baf51f3ffafc44f6394651a505ca │ ├── 53 commit [tree 3787, par. f80a] "Second" │ │ └── 9f7e662b0fa2ceb0df1dc9332179b06e5cdaec │ ├── dc blob [new.txt] 'new' │ │ └── 334bff12fb7d7404c79935fa3ba535c3bb28d0 │ ├── b0 tree [tree 674d, blob f0d9, blob dc33] │ │ └── ea95a512bad604278bcc96e8b8e726b462e010 │ └── 62 commit [tree b0ea, par. 539f] "Third" │ └── e37a96f8f09d0421644817dea320108ceac481 └── refs ├── heads | └── main 62e3... └── tags
.git pre reálny projektpybrickz/.git │ COMMIT_EDITMSG posledný popis záznamu upravený v lokálnom repozitári │ config lokálna konfigurácia, aplikuje sa iba na tento repozitár │ description don't worry about it │ FETCH_HEAD pamätá si, čo bolo naposledy stiahnuté zo vzdialeného repozitára │ HEAD ukazovateľ na aktuálnu vetvu/commit │ index binárny zoznam ciest a SHA-1 hashov, obsah zobraz cez `git ls-files --stage` │ ORIG_HEAD predchádzajúci stav HEAD, nastavený príkazmi s potenciálne nebezpečným správaním │ packed-refs zabalené referencie (heads, tags) ├───hooks […] ├───info […] ├───logs […] ├───objects […] └───refs […]
.git/objectspybrickz/.git │ […] ├───hooks […] ├───info […] ├───logs […] ├───objects objekty - bloby, stromy (trees), commity │ ├───00 │ │ 57f7cf16175d94fa850ad30918dffcd4cd850c │ ├───01 │ │ 4daec1e8a05a71852209c4caf9750bfe4717b1 ... │ ├───fe │ │ 1c754ef352dece245b5f7a0d7047b048d7b1d9 │ │ 8a73f88812537678fde89e91c19c87623ff47c │ ├───ff │ │ 7e837bf1dc59b8835767fdcf789e308528498a │ ├───info […] │ └───pack […] └───refs […]
.git/refspybrickz/.git
│ […]
├───hooks […]
├───info […]
├───logs […]
├───objects […]
└───refs referencie - vetvy, vzdialené vetvy, tagy
├───heads […]
├───remotes […]
└───tags […]
.git/refs/headspybrickz/.git
│ […]
├───hooks […]
├───info […]
├───logs […]
├───objects […]
└───refs
├───heads
│ dev
│ main
│ staging
│ ├───bugfix
│ │ bugfix-1 vetva vytvorená cez `git branch bugfix/bugfix-1`
│ │ bugfix-2 vetva vytvorená cez `git branch bugfix/bugfix-2`
│ └───feature
│ feature-A vetva vytvorená cez `git branch feature/feature-A`
│ feature-B vetva vytvorená cez `git branch feature/feature-B`
├───remotes […]
└───tags […]
.git/refs/remotespybrickz/.git
│ […]
├───hooks […]
├───info […]
├───logs […]
├───objects […]
└───refs
├───heads […]
├───remotes
│ ├───gh
│ │ main
│ └───origin
│ │ dev
│ │ HEAD
│ │ main
│ ├───bugfix
│ │ bugfix-2
│ └───feature
│ my-awesome-feature-A
└───tags […]
.git/refs/tagspybrickz/.git
│ […]
├───hooks […]
├───info […]
├───logs […]
├───objects […]
└───refs
├───heads […]
├───remotes […]
└───tags
v1.0.0
v1.0.1
...
v2.6.4
v2.7.0
.git/HEADHEAD je ukazovateľ na aktuálnu vetvu alebo commitDETACHED HEAD je situácia keď HEAD ukazuje na commit ktorý nie je hlavou vetvyslovak:.git nájdi súbor s hashom na ktorý ukazuje vetva slovak.git rev-parse slovak.git cat-file -p zisti aký obsah sa nacháda v súbore hello.py na vetve slovak.
-p použi hash z predošlého kroku.Po naklonovaní repozitára sa v priečinku .git/objects nachádzajú všetky objekty, ktoré Git používa, niektoré z nich však môžu byť zabalené v priečinku pack.
git clone https://github.com/bbrrck/hello.git
cd hello
ls .git/objects
# .git/objects/info
# .git/objects/pack
ls .git/objects/pack
# .git/objects/pack/pack-48cae0e3bd98461308f23caeb2cfcc3df0b34da8.idx
# .git/objects/pack/pack-48cae0e3bd98461308f23caeb2cfcc3df0b34da8.pack
# .git/objects/pack/pack-48cae0e3bd98461308f23caeb2cfcc3df0b34da8.revManuálne rozbalenie objektov je možné pomocou príkazu git unpack-objects. Ak však tento príkaz použijeme na súbory z predošlého príkladu, nič sa nestane. Je to preto, lebo Git nerozbalí objekty ktoré sa už nachádzajú v repozitári. Pred rozbalením objektov je preto potrebné ich najprv presunúť do inej časti repozitára.
Mimo experimentovania manuálne rozbaľovanie objektov nie je potrebné.
V Gite existujú dva hlavné spôsoby, ako integrovať zmeny z jednej vetvy do druhej: merge a rebase.
mergemain a feature) a ich najnovším spoločným predkommergerebasefeature na vetvu main znamená presunutie začiatku vetvy feature na koniec vetvy mainfeature budú znova vytvorené na vetve mainrebaserebase?git rebase na verejných alebo kolaboratívnych vetvách (najmä main)rebase?mergegit clone https://github.com/bbrrck/hello.git hello-merge; cd hello-merge
git merge origin/french
# Auto-merging hello.py
git merge origin/slovak
# CONFLICT (content): Merge conflict in hello.py
# ... vyrieš konflikt ...
git add .
git commit
# [main cef4a72] Merge remote-tracking branch 'origin/slovak'rebase (french)git clone https://github.com/bbrrck/hello.git hello-rebase; cd hello-rebase
git checkout french
git rebase main
# Successfully rebased and updated refs/heads/french.
git checkout main
git merge french
# Updating 0297280..5f6f019
# Fast-forward
# hello.py | 11 ++++++++++-
# 1 file changed, 10 insertions(+), 1 deletion(-)rebase (slovak) - konfliktgit log --oneline --graph --allMerge:
* cef4a72 (main) Merge branch 'slovak' |\ | * 163a9c3 (slovak) Add docstring for slovak | * bd67d8d Fix slovak | * 75fcf88 Add slovak * | bc3f86b Merge branch 'french' |\ \ | * | a31caf9 (french) Add docstring for french | * | 6d348f3 Add french | |/ * / 0297280 Add docstring for default |/ * 4b4a8ad Add hello.py * 60d4d94 Initial commit
Rebase:
* ab2fda1 (main, slovak) Add docstring for slovak * 806b97a Add slovak * 5f6f019 (french) Add docstring for french * ea40a3b Add french * 0297280 Add docstring for default | * 163a9c3 Add docstring for slovak | * bd67d8d Fix slovak | * 75fcf88 Add slovak |/ | * a31caf9 Add docstring for french | * 6d348f3 Add french |/ * 4b4a8ad Add hello.py * 60d4d94 Initial commit
git log main --onelineMerge (10):
cef4a72 (main) Merge branch 'slovak' bc3f86b Merge branch 'french' 0297280 Add docstring for default 163a9c3 (slovak) Add docstring for slovak bd67d8d Fix slovak 75fcf88 Add slovak a31caf9 (french) Add docstring for french 6d348f3 Add french 4b4a8ad Add hello.py 60d4d94 Initial commit
Rebase (7):
ab2fda1 (main, slovak) Add docstring for slovak 806b97a Add slovak 5f6f019 (french) Add docstring for french ea40a3b Add french 0297280 Add docstring for default 4b4a8ad Add hello.py 60d4d94 Initial commit
zoo-merge:
git merge vetvy origin/krokodil a origin/gorila do lokálnej vetvy main.(pokračovanie na ďalšom slajde)
zoo-rebase:
gorila a zlúč na ňu cez príkaz git rebase vetvu main. Vyrieš vzniknuté konflikty.main a zlúč na ňu cez príkaz git merge vetvu gorila.krokodil a zlúč na ňu cez príkaz git rebase -i vetvu main. Prostredný commit označ ako fixup. Vyrieš vzniknuté konflikty.main a zlúč na ňu cez príkaz git merge vetvu krokodil.git log porovnaj stav oboch repozitárov.git merge --squash vytvorí jediný commit na cieľovej vetve.
Použitie:
* cef4a72 (main) Merge branch 'slovak' |\ | * 163a9c3 (slovak) Add docstring for slovak | * bd67d8d Fix slovak | * 75fcf88 Add slovak * | bc3f86b Merge branch 'french' |\ \ | * | a31caf9 (french) Add docstring for french | * | 6d348f3 Add french | |/ * / 0297280 Add docstring for default |/ * 4b4a8ad Add hello.py * 60d4d94 Initial commit
* f3492de (main) Squash french * d23ef42 Squash slovak * 54b75b3 Add docstring for default | * 437cd19 (slovak) Add docstring for slovak | * 5a92065 Fix slovak | * c1344d5 Add slovak |/ | * 0962e07 (french) Add docstring for french | * 7571e67 Add french |/ * de2c4ac Add hello.py * 944ce4e Initial commit
cef4a72 (main) Merge branch 'slovak' bc3f86b Merge branch 'french' 0297280 Add docstring for default 163a9c3 (slovak) Add docstring for slovak bd67d8d Fix slovak 75fcf88 Add slovak a31caf9 (french) Add docstring for french 6d348f3 Add french 4b4a8ad Add hello.py 60d4d94 Initial commit
f3492de (main) Squash french d23ef42 Squash slovak 54b75b3 Add docstring for default de2c4ac Add hello.py 944ce4e Initial commit
Po vykonaní squash merge by si mal(a) vždy zmazať feature vetvu.
git revertPríkaz git revert vytvorí novú verziu, a nemení históriu repozitára.
git resetPríkaz git reset mení históriu repozitára a môže spôsobiť stratu súborov.
reset vs revert vs checkout| Príkaz | Kontext | Použitie |
|---|---|---|
git reset |
Commit | Zahoď commity v súkromnej vetve alebo zahoď necommitnuté zmeny |
git reset |
Súbor | Odstráň súbor z prípravnej zóny (z indexu) |
git checkout |
Commit | Presun medzi vetvami alebo prezeranie starých verzií |
git checkout |
Súbor | Zahoď zmeny v pracovnom adresári |
git revert |
Commit | Vráť commity vo verejnej vetve |
git revert |
Súbor | (N/A) |
Pozn.: Zmeny, ktoré pridávame pomocou príkazu git add --patch, sú zmeny, ktoré chceme vrátiť späť, nie zmeny, ktoré chceme ponechať.
Presunutie posledných 3 commitov z main na novú vetvu feature:
Ak už bol starý commit pushnutý na remote, po použití git commit --amend je potrebné pushnúť cez git push --force alebo --force-with-lease.
Ak už bol starý commit pushnutý na remote, po použití git commit --amend je potrebné pushnúť cez git push --force alebo --force-with-lease.
V Gite existuje mnoho rôznych workflowov, ktoré sa líšia v tom, ako používajú vetvenie (branching). V tejto kapitole si ukážeme niekoľko najpoužívanejších workflowov a ich výhody a nevýhody.
“Vetvenie je o riadení súhry izolácie a integrácie.”
— Martin Fowler
Patterns for Managing Source Code Branches (Martin Fowler)
Patterns for Managing Source Code Branches (Martin Fowler)
Projekt Git Workflows Warehouse obsahuje katalóg 50-tich workflowov a tiež užitočný zoznam zdrojov.
main), žiadne ďalšie vetvy sa nepoužívajúVýhody:
Nevýhody:
Centralized workflow (Atlassian)
feature vetvách, ktoré sa následne zlučujú do main vetvyVýhody:
mainNevýhody:
Git feature branch workflow (Atlassian)
feature vetvy sú krátke a často mergované do main vetvy (aj niekoľkokrát denne)Výhody:
Nevýhody:
Feature-based deployment can be beneficial for teams that value the isolation of features and are willing to manage the complexities of merging these features back into the mainline. On the other hand, trunk-based deployment is suited for organizations that prioritize rapid integration and releases and have the infrastructure to manage continuous integrations and feature flags.
In recent years, with the rise of DevOps and agile methodologies, there’s been a clear trend towards more frequent integrations and releases. This trend has made trunk-based development, with its emphasis on rapid integration and release, increasingly popular among many tech giants and startups alike. However, as with all methodologies, it’s essential to evaluate the specific needs and capabilities of an organization before adopting a deployment strategy.
Feature-Based Deployment vs. Trunk-Based Deployment by John Nochowitz
develop a release, a hotfix vetvymain - produkčná vetvadevelop - vývojová vetvafeature - vývoj nových funkciírelease - príprava na vydaniehotfix - oprava chýb v produkčnej verziiA successful Git branching model (Vincent Driessen)
Výhody:
Nevýhody:
Poznámka: Gitflow vyhovuje projektom s viacerými produkčnými verziami (napr. inštalácie u zákazníkov). Webové aplikácie s jednou verziou profitujú viac z trunk-based development.
Gitflow is a legacy Git workflow that was originally a disruptive and novel strategy for managing Git branches. Gitflow has fallen in popularity in favor of trunk-based workflows, which are now considered best practices for modern continuous software development and DevOps practices. Gitflow also can be challenging to use with CI/CD.
Gitflow workflow (Atlassian)
The overall flow of Gitflow is:
develop branch is created from mainrelease branch is created from developFeature branches are created from developfeature is complete it is merged into the develop branchrelease branch is done it is merged into develop and mainhotfix branch is created from mainhotfix is complete it is merged to both develop and main
Vetvenie je jednoduché, zlučovanie je ťažšie - vždy naplánujte integráciu pred vytvorením vetvy; vetvy sa v čase rozchádzajú
Frekvencia integrácie súvisí s kvalitou - časté zlučovanie snižuje zložitosť, riziko a strach z integrácie; umožňuje refaktoring a zlepšuje zdravie kódu
Moderná osvedčená prax uprednostňuje trunk-based development - elitné tímy integrujú často s CI/CD
Voľba workflowu závisí od kontextu - rôzne tímy a projekty majú rôzne potreby; vyberte workflow, ktorý najlepšie vyhovuje vašej situácii
Podľa Patterns for Managing Source Code Branches (Martin Fowler) a State of DevOps Report
Príklady:
Making a Pull Request (Atlassian)
ssh-keygen # use default settings
ssh-keygen -t rsa -C "[email protected]" # compatible with most git providers
ssh-keygen -t ed25519 -C "[email protected]" # compatible with GitHub
git gc)| en | sk |
|---|---|
| branch | vetva |
| clone | naklonovanie repozitára |
| commit | záznam |
| commit message | popis záznamu |
| conflict | konflikt medzi verziami |
| conflict resolution | riešenie konfliktov |
| diff | rozdiel medzi verziami |
| merge | zlúčenie vetiev |
| en | sk |
|---|---|
| pull | stiahnutie vzdialených zmien |
| push | odoslanie lokálnych zmien |
| repository | repozitár, úložisko |
| remote | vzdialený repozitár |
| snapshot | snímka |
| staging area | prípravná oblasť (tiež index) |
| status | stav repozitára |
| version | verzia |