Smazání souboru v Gitu

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: vitfo 
Date:   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: 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

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.

Napsat komentář