-
1. Úvod
- 1.1 Správa verzí
- 1.2 Stručná historie systému Git
- 1.3 Základy systému Git
- 1.4 Příkazový řádek
- 1.5 Instalace systému Git
- 1.6 První nastavení systému Git
- 1.7 Získání nápovědy
- 1.8 Shrnutí
-
2. Základy práce se systémem Git
-
3. Větve v systému Git
- 3.1 Větve v kostce
- 3.2 Základy větvení a slučování
- 3.3 Správa větví
- 3.4 Postupy při práci s větvemi
- 3.5 Vzdálené větve
- 3.6 Přeskládání
- 3.7 Shrnutí
-
4. Git na serveru
- 4.1 Protokoly
- 4.2 Zprovoznění Gitu na serveru
- 4.3 Generování veřejného klíče SSH
- 4.4 Nastavení serveru
- 4.5 Démon Git
- 4.6 Chytrý HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Možnosti hostování u třetí strany
- 4.10 Shrnutí
-
5. Distribuovaný Git
- 5.1 Distribuované pracovní postupy
- 5.2 Přispívání do projektu
- 5.3 Správa projektu
- 5.4 Shrnutí
-
6. GitHub
-
7. Git Tools
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Ladění v systému Git
- 7.11 Submodules
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 Shrnutí
-
8. Customizing Git
- 8.1 Git Configuration
- 8.2 Atributy Git
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Shrnutí
-
9. Git a ostatní systémy
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Shrnutí
-
10. Git Internals
- 10.1 Plumbing and Porcelain
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Balíčkové soubory
- 10.5 The Refspec
- 10.6 Přenosové protokoly
- 10.7 Správa a obnova dat
- 10.8 Environment Variables
- 10.9 Shrnutí
-
A1. Appendix A: Git in Other Environments
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in Powershell
- A1.7 Shrnutí
-
A2. Appendix B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
-
A3. Appendix C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
2.4 Základy práce se systémem Git - Návrat do předchozího stavu
Návrat do předchozího stavu
Kdykoli se může stát, že něco chcete vrátit do původního stavu. Proto se podíváme na pár základních nástrojů pro vracení změn, které jste udělali. Ale buďte opatrní, protože ne vždy můžete návrat zpět vrátit zase vpřed. Je to jedna z mála oblastí, kdy při neuváženém postupu v Gitu riskujete, že přijdete o část své práce.
Jeden z běžných důvodů pro vracení úprav nastane, když zapíšete revizi příliš brzy a například jste zapomněli přidat některé soubory, nebo jste něco popletli ve zprávě k revizi.
Chcete-li poslední revizi vytvořit znovu, můžete spustit příkaz commit
s volbou --amend
:
$ git commit --amend
Tento příkaz vezme vaši oblast připravených změn a použije ji k vytvoření revize. Pokud jste od poslední revize neprovedli žádné změny (například spustíte tento příkaz bezprostředně po předchozím zápisu), bude snímek vypadat úplně stejně a jediné, co změníte, je zpráva k revizi.
Spustí se stejný editor pro editaci zpráv k revizím, ale tentokrát už obsahuje zprávu z vaší předchozí revize. Zprávu můžete editovat stejným způsobem jako vždy, ale předchozí revize se přepíše.
Pokud například zapíšete revizi a potom si uvědomíte, že jste zapomněli připravit k zapsání změny v souboru, který jste chtěli do této revize přidat, můžete provést následující:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
Výsledkem je jediná revize — druhý příkaz commit
nahradí výsledky prvního.
Odstranění souboru z oblasti připravených změn
Následující dvě části popisují, jak se poprat s oblastí připravených změn a se změnami v pracovním adresáři.
Dobré je, že příkaz, jímž se zjišťuje stav těchto dvou oblastí, zároveň připomíná, jak v nich nežádoucí změny zrušit.
Řekněme například, že jste změnili dva soubory a chcete je zapsat jako dvě oddělené změny, jenže omylem jste zadali příkaz git add *
a oba soubory jste tím připravili k zapsání.
Jak lze tyto dva soubory vrátit z oblasti připravených změn?
Připomene vám to příkaz git status
:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
Přímo pod textem „Changes to be committed“ („Změny k zapsání“) se říká: „pro odstranění z oblasti připravených změn použijte příkaz git reset HEAD <soubor>...
“
Budeme se tedy řídit touto radou a z oblasti připravených změn odstraníme soubor CONTRIBUTING.md
:
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Příkaz je sice trochu zvláštní, ale funguje.
Soubor CONTRIBUTING.md
má stav „změněn“, ale už se nenachází v oblasti připravených změn.
Note
|
Příkaz |
Prozatím je tato magická formule vše, co o příkazu git reset
potřebujete vědět.
Podrobněji se budeme tím, co příkaz reset
dělá a jak jej využít pro opravdu zajímavé věci, v podkapitole Reset Demystified.
Rušení změn ve změněných souborech
A co když zjistíte, že nechcete zachovat změny, které jste provedli v souboru CONTRIBUTING.md
?
Jak je můžete snadno zrušit a vrátit soubor zpět do podoby při posledním zápisu revize (nebo při prvním klonování nebo při jakékoliv činnosti, kterou jste soubor dostali do pracovního adresáře)?
Příkaz git status
vám naštěstí i tentokrát řekne, co dělat.
U posledního příkladu vypadá oblast připravených změn takto:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Git přímo říká, jak se dají vámi provedené změny zrušit. Uděláme, co nám radí:
$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Jak vidíte, změny byly vráceny zpět.
Important
|
Je důležité, abyste porozuměli tomu, že příkaz |
Pokud byste chtěli provedené změny souboru uchovat, ale pro tento okamžik je přesto chcete odklidit z cesty, podíváme se později na odkládání (stashing) a v kapitole Větve v systému Git na větvení. Tyto postupy bývají většinou vhodnější.
Zapamatujte si, že vše, co je v Gitu zapsáno, lze téměř vždy obnovit.
Obnovit lze dokonce i objekty revizí na odstraněných větvích nebo objekty revizí, které byly přepsány příkazem commit --amend
(obnovování dat se věnuje kapitola Data Recovery).
Pokud však dojde ke ztrátě dat, která dosud nebyla součástí žádné revize, už je asi nikdy neuvidíte.