lwilis — Git - что нужно для начала?
Немного расскажу про систему контроля версий git. Базой этой заметки служат обе части gittutorial, man gitignore, man git-update-index, man git-reset. Заметка подойдет для быстрого старта. Пригодится для контроля изменений в /etc.
Система контроля версий полезна для документирования изменений в конфигурации вашей ОС. Во-первых, появляется возможность проводить эксперименты при конфиругировании, имея возможность вернуться к заведомо рабочим параметрам. Во-вторых, проще клонировать действительно нужные параметры, если завести несколько веток в репозитарии, - две (основная и экспериментальная) для PC и две для нетбука.
Ветка (branch) - это одна из версий состояния файлов в каталоге вашего проекта
Документирование строится путем осуществления commit`ов в ветку.
Commit - это способ регистрации изменения в одном или нескольких файлах проекта. Здесь нужно заметить, что после внесения изменений в файл или создания нового файла, необходимо добавить файл в репозитарий. И после добавления можно создать commit, то есть зафиксировать изменение и дать ему описание.
Внутри репозитарий git представляет из себя каталог .git, расположенный в каталоге проекта. В .git лежат как служебные файлы, так и наши рабочие данные. Рабочие данные находятся в каталоге .git/objects. Углубляться в устройство git здесь не буду, но в конце заметки будет ссылка именно по внутренностям git.
Для начала рекомендую потренироваться "на кошках", поэтому сразу в /etc не полезем.
Поехали.
Начало положено. Дальнейшая работа предполагает внесение изменений в файлы и выполнение операций добавления, с последующим выполнением commit`ов.
Но, сразу после начала знакомства с git мне потребовалось
Продолжим.
Предположим, что изменения в файл autochangingfile вносятся каким-то системным процессом, и нас устраивает ничего о них не знать, тем не менее файл в проекте требуется.
На текущем этапе есть два варианта. В первом случае сделаны неверные изменения в самом файле, а во втором - изменения в файле необходимы, но вот коммит сделан неверно (например текст сообщения). Первый случай - тяжелый, второй - мягкий. Соответственно для отмены и того, и другого нужна команда reset, но в первом случае с параметром --hard, во втором --soft. Я рассморю первый случай.
После операции reset можно убедиться в успешном откате командами git status и git log
На этом, пожалуй, закончу. Если будет интересно, то тему слияния веток, сравнение состояния файлов в разных ветках и что-нибудь еще рассмотрю в следующий раз.
внутренности git
Система контроля версий полезна для документирования изменений в конфигурации вашей ОС. Во-первых, появляется возможность проводить эксперименты при конфиругировании, имея возможность вернуться к заведомо рабочим параметрам. Во-вторых, проще клонировать действительно нужные параметры, если завести несколько веток в репозитарии, - две (основная и экспериментальная) для PC и две для нетбука.
Ветка (branch) - это одна из версий состояния файлов в каталоге вашего проекта
Документирование строится путем осуществления commit`ов в ветку.
Commit - это способ регистрации изменения в одном или нескольких файлах проекта. Здесь нужно заметить, что после внесения изменений в файл или создания нового файла, необходимо добавить файл в репозитарий. И после добавления можно создать commit, то есть зафиксировать изменение и дать ему описание.
Внутри репозитарий git представляет из себя каталог .git, расположенный в каталоге проекта. В .git лежат как служебные файлы, так и наши рабочие данные. Рабочие данные находятся в каталоге .git/objects. Углубляться в устройство git здесь не буду, но в конце заметки будет ссылка именно по внутренностям git.
Для начала рекомендую потренироваться "на кошках", поэтому сразу в /etc не полезем.
Поехали.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ mkdir ~/test && cd ~/test $ git config --global user.name "Имя владельца репозитария" #Будем лицезреть заковыченные строки $ git config --global user.email "[email protected]" #в поле Author commit`ов $ git init Initialized empty Git repository in .git/ $ touch workfile autochangingfile #создадим пару файлов для добавления в проект $ git add . #добавили все файлы каталога в репозитарий $ git commit -m "initial commit" #сделали первый commit в репозитарий Created initial commit 5ea37d2: initial commit 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 autochangingfile create mode 100644 workfile $ git branch current #создали ветку current $ git checkout current #перешли на ветку current Switched to branch "current" |
Но, сразу после начала знакомства с git мне потребовалось
- смотреть на прогресс и состояние репозитария
- отменить слежение за изменениями в некоторых файлах
- некоторые файлы я не хотел добавлять в репозитарий, и хотел, чтобы git их игнорировал
- мне нужно было откатывать свои изменения
Продолжим.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ git branch #Убедимся, что находимся экспериментальной ветке * current master $ git status #Убедимся, что проект готов к изменениям, то есть git не выдает предупреждений, и рабочий каталог чист (все изменения внесены в commit) # On branch current nothing to commit (working directory clean) $ cat>workfile some changes ^C $ git status #Обращаем внимание на предупреждение git о изменениях в файле. Так как файл был ранее внесен в репозитарий, то можно делать сразу commit с опцией -a # On branch current # Changed but not updated: # (use "git add <file>..." to update what will be committed) # # modified: workfile # no changes added to commit (use "git add" and/or "git commit -a") $ git commit -a -m "new test feature" Created commit 253a417: new test feature 1 files changed, 1 insertions(+), 0 deletions(-) $ git log #Таким образом можно пронаблюдать изменения в проекте commit 253a41769ba84ddba5e5aee020f4177a6e09a34c Author: Alex Polyakhov <aap@h.pm.local> Date: Tue Jun 23 03:47:37 2009 +0400 new test feature commit 5ea37d28f96e465fb534db7bb88acdb7150fb670 Author: Alex Polyakhov <aap@h.pm.local> Date: Tue Jun 23 03:37:11 2009 +0400 initial commit lines 1-11/11 (END) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ cat>autochangingfile some auto added entry ^C $ git status # On branch current # Changed but not updated: # (use "git add <file>..." to update what will be committed) # # modified: autochangingfile # no changes added to commit (use "git add" and/or "git commit -a") $ git update-index --assume-unchanged autochangingfile #Сказали git, что за файлом autochangingfile наблюдать не нужно $ git status # On branch current nothing to commit (working directory clean) #А git - не против $ touch tempfile $ cat>>.git/info/exclude #Файл tempfile - суть временный, и его не нужно ни отслеживать, ни вообще помещать в проект. Вносим его в список игнорируемых. tempfile ^C $ git status # On branch current nothing to commit (working directory clean) #А git - не против $ cat>workfile #ВПЕЗАПНО испортили рабочий файл weird change ^C $ git commit -a -m "mega cool feature" #Еще и commit сделали |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ git log commit 60c6d91f35fc72b5643141c0e194374f8ae05dd2 #Изменения этого коммита нам не нужны Author: Alex Polyakhov <aap@h.pm.local> Date: Tue Jun 23 04:10:59 2009 +0400 mega cool feature commit 532c0f612a8b11a50b6d24259367af25430bbe80 #Есть желание откатиться на этот коммит Author: Alex Polyakhov <aap@h.pm.local> Date: Tue Jun 23 03:57:48 2009 +0400 new feature commit 5ea37d28f96e465fb534db7bb88acdb7150fb670 Author: Alex Polyakhov <aap@h.pm.local> Date: Tue Jun 23 03:37:11 2009 +0400 initial commit $ git reset --hard 532c0f #Полностью имя коммита можно не набирать, это было бы негуманно HEAD is now at 532c0f6 new feature |
На этом, пожалуй, закончу. Если будет интересно, то тему слияния веток, сравнение состояния файлов в разных ветках и что-нибудь еще рассмотрю в следующий раз.
внутренности git