V tomto příspěvku si ukážeme, jak smazat z Gitu nechtěný soubor tak, aby po něm nezůstala (ani po komitu) žádná zmínka.
Nejdříve si vytvoříme adresář a začneme jej verzovat pomocí Gitu.
$ mkdir git-reset-pokus $ cd git-reset-pokus/ git-reset-pokus$ git init Initialized empty Git repository in /home/vitfo/Documents/gitpokus/git-reset-pokus/.git/ git-reset-pokus$ ll total 12 drwxrwxr-x 3 vitfo vitfo 4096 led 30 09:28 ./ drwxrwxr-x 3 vitfo vitfo 4096 led 30 09:28 ../ drwxrwxr-x 7 vitfo vitfo 4096 led 30 09:28 .git/
Jak je vidět na výpisu adresáře, přibyla nám po inicializaci skrytá složka .git. Vytvoříme prázdný soubor a komitneme změnu.
git-reset-pokus$ touch mysmallfile git-reset-pokus$ git add mysmallfile git-reset-pokus$ git commit mysmallfile -m 'initial commit' *** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. Omit --global to set the identity only in this repository. fatal: unable to auto-detect email address (got 'vitfo@vitfo-VirtualBox.(none)')
Na výpisu je vidět chyba. Nelze komitnou do Gitu, pokud nemáme nastaveno alespoň jméno a email. To napravíme pomocí příkazu git config a provedeme komit.
gitpokus/git-reset-pokus$ git config --global user.email "vitfo@vitfo.cz" gitpokus/git-reset-pokus$ git config --global use.name "vitfo" gitpokus/git-reset-pokus$ git commit mysmallfile -m 'initial commit' [master (root-commit) 31b70d7] initial commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 mysmallfile
Do souboru uložíme nějaká data (v tomto případě výpis aktuální složky) a změnu komitneme s komentářem „adding content to a file“.
gitpokus/git-reset-pokus$ ll > mysmallfile gitpokus/git-reset-pokus$ cat mysmallfile total 12 drwxrwxr-x 3 vitfo vitfo 4096 led 30 09:29 ./ drwxrwxr-x 3 vitfo vitfo 4096 led 30 09:28 ../ drwxrwxr-x 8 vitfo vitfo 4096 led 30 09:40 .git/ -rw-rw-r-- 1 vitfo vitfo 0 led 30 09:41 mysmallfile gitpokus/git-reset-pokus$ git add mysmallfile gitpokus/git-reset-pokus$ git commit mysmallfile -m 'adding content to a file' [master e736c1d] adding content to a file 1 file changed, 5 insertions(+)
Podobným způsobem vytvoříme, naplníme a komitneme další soubor. Příkazem cat si zkontrolujeme obsah souboru.
gitpokus/git-reset-pokus$ touch mybigfile gitpokus/git-reset-pokus$ ll / > mybigfile gitpokus/git-reset-pokus$ cat mybigfile total 108 drwxr-xr-x 24 root root 4096 led 26 08:06 ./ drwxr-xr-x 24 root root 4096 led 26 08:06 ../ drwxr-xr-x 2 root root 4096 led 11 06:34 bin/ drwxr-xr-x 3 root root 4096 led 26 08:09 boot/ drwxrwxr-x 2 root root 4096 led 10 08:35 cdrom/ drwxr-xr-x 18 root root 3940 led 29 08:31 dev/ drwxr-xr-x 138 root root 12288 led 29 08:31 etc/ drwxr-xr-x 3 root root 4096 led 10 08:36 home/ lrwxrwxrwx 1 root root 33 led 26 08:06 initrd.img -> boot/initrd.img-4.13.0-32-generic lrwxrwxrwx 1 root root 33 led 11 06:35 initrd.img.old -> boot/initrd.img-4.13.0-26-generic drwxr-xr-x 23 root root 4096 led 10 08:59 lib/ drwxr-xr-x 2 root root 4096 led 18 16:41 lib64/ drwx------ 2 root root 16384 led 10 08:34 lost+found/ drwxr-xr-x 3 root root 4096 led 10 08:54 media/ drwxr-xr-x 2 root root 4096 srp 1 13:17 mnt/ drwxr-xr-x 3 root root 4096 led 26 12:50 opt/ dr-xr-xr-x 164 root root 0 led 29 08:31 proc/ drwx------ 7 root root 4096 led 26 10:51 root/ drwxr-xr-x 26 root root 880 led 29 08:36 run/ drwxr-xr-x 2 root root 12288 led 18 16:46 sbin/ drwxr-xr-x 2 root root 4096 dub 29 2017 snap/ drwxr-xr-x 2 root root 4096 srp 1 13:17 srv/ dr-xr-xr-x 13 root root 0 led 29 08:31 sys/ drwxrwxrwt 11 root root 4096 led 30 09:43 tmp/ drwxr-xr-x 11 root root 4096 srp 1 13:24 usr/ drwxr-xr-x 14 root root 4096 srp 1 13:34 var/ lrwxrwxrwx 1 root root 30 led 26 08:06 vmlinuz -> boot/vmlinuz-4.13.0-32-generic lrwxrwxrwx 1 root root 30 led 11 06:35 vmlinuz.old -> boot/vmlinuz-4.13.0-26-generic git-reset-pokus$ git add mybigfile git-reset-pokus$ git commit mybigfile -m 'adding big file'[master d576cba] adding big file 1 file changed, 29 insertions(+) create mode 100644 mybigfile
Pomocí příkazu git log si vypíšeme komity.
gitpokus/git-reset-pokus$ git log commit d576cba6c120a37af5361d0fe4b9c6fb4d3bd834 Author: vitfoDate: Tue Jan 30 09:43:40 2018 +0100 adding big file commit e736c1d3033ef6e8e628e0beb90af7da861ab355 Author: vitfo Date: Tue Jan 30 09:42:34 2018 +0100 adding content to a file commit 31b70d72a15e5ddb5be802e2f0c64ce3861ec36a Author: vitfo Date: Tue Jan 30 09:40:53 2018 +0100 initial commit
Nyní se budeme chtít zbavit souboru mybigfile tak, aby po něm nikde nezůstala ani zmínka. Důvodem může být to, že jsme třeba omylem komitli soubor s hesly, nebo komitnutý soubor byl příliš velký (velké binární soubory mohou zpomalovat práci s Gitem). Použijeme k tomu příkaz git reset a hash komitu, kam se chceme vrátit.
gitpokus/git-reset-pokus$ git reset --hard e736c1d3033ef6e8e628e0beb90af7da861ab355 HEAD is now at e736c1d adding content to a file gitpokus/git-reset-pokus$ git status On branch master nothing to commit, working directory clean
Výpisem si ověříme, že nechtěný kommit zmizel.
gitpokus/git-reset-pokus$ git log commit e736c1d3033ef6e8e628e0beb90af7da861ab355 Author: vitfoDate: Tue Jan 30 09:42:34 2018 +0100 adding content to a file commit 31b70d72a15e5ddb5be802e2f0c64ce3861ec36a Author: vitfo Date: Tue Jan 30 09:40:53 2018 +0100 initial commit
Pokud byste komit pušli do repozitáře, komitu se zbavíte stejným způsobem, je změny musíte force pušnout pomocí git push -f.