10. История
Цели
- Научиться просматривать историю проекта.
Получение списка произведенных изменений — функция команды git log
.
Выполните:
git log
Вы увидите…
Результат:
$ git log commit fa3c1411aa09441695a9e645d4371e8d749da1dc Author: Alexander Shvets <[email protected]> Date: Wed Mar 9 10:27:54 2011 -0500 Added HTML header commit 8c3228730ed03116815a5cc682e8105e7d981928 Author: Alexander Shvets <[email protected]> Date: Wed Mar 9 10:27:54 2011 -0500 Added standard HTML page tags commit 43628f779cb333dd30d78186499f93638107f70b Author: Alexander Shvets <[email protected]> Date: Wed Mar 9 10:27:54 2011 -0500 Added h2 tag commit 911e8c91caeab8d30ad16d56746cbd6eef72dc4c Author: Alexander Shvets <[email protected]> Date: Wed Mar 9 10:27:54 2011 -0500 First Commit
Вот список всех четырех коммитов в репозиторий, которые мы успели совершить.
01 Однострочная история
Вы полностью контролируете то, что отображает log
. Мне, например, нравится однострочный формат:
Выполните:
git log --pretty=oneline
Вы увидите…
Результат:
$ git log --pretty=oneline fa3c1411aa09441695a9e645d4371e8d749da1dc Added HTML header 8c3228730ed03116815a5cc682e8105e7d981928 Added standard HTML page tags 43628f779cb333dd30d78186499f93638107f70b Added h2 tag 911e8c91caeab8d30ad16d56746cbd6eef72dc4c First Commit
02 Контроль отображения записей
Есть много вариантов выбора, какие элементы отображаются в логе. Поиграйте со следующими параметрами:
git log --pretty=oneline --max-count=2 git log --pretty=oneline --since='5 minutes ago' git log --pretty=oneline --until='5 minutes ago' git log --pretty=oneline --author=<your name> git log --pretty=oneline --all
В unix-системах доступна справочная страница man git log
.
03 Изощряемся
Вот что я использую для просмотра изменений, сделанных за последнюю неделю. Я добавлю --author=alex
, если я хочу увидеть только изменения, которые сделал я.
git log --all --pretty=format:"%h %cd %s (%an)" --since='7 days ago'
04 Конечный формат лога
Со временем, я решил, что для большей части моей работы мне подходит следующий формат лога.
Выполните:
git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short
Результат:
$ git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short * fa3c141 2011-03-09 | Added HTML header (HEAD, master) [Alexander Shvets] * 8c32287 2011-03-09 | Added standard HTML page tags [Alexander Shvets] * 43628f7 2011-03-09 | Added h2 tag [Alexander Shvets] * 911e8c9 2011-03-09 | First Commit [Alexander Shvets]
Давайте рассмотрим его в деталях:
--pretty="..."
— определяет формат вывода.%h
— укороченный хэш коммита%d
— дополнения коммита («головы» веток или теги)%ad
— дата коммита%s
— комментарий%an
— имя автора--graph
— отображает дерево коммитов в виде ASCII-графика--date=short
— сохраняет формат даты коротким и симпатичным
Таким образом, каждый раз, когда вы захотите посмотреть лог, вам придется много печатать. К счастью, мы узнаем о git алиасах в следующем уроке.
05 Другие инструменты
Оба gitx
(для Mac) и gitk
(для любой платформы) полезны в изучении истории изменений.
githowto.com
22. Git внутри: Каталог .git
Цели
- Узнать о структуре каталога
.git
01 Каталог .git
Настало время провести небольшое исследование. Для начала, из корневого каталога вашего проекта…
Выполните:
ls -C .git
Результат:
$ ls -C .git COMMIT_EDITMSG MERGE_RR config hooks info objects rr-cache HEAD ORIG_HEAD description index logs refs
Это магический каталог, в котором хранятся все «материалы» git. Давайте заглянем в каталог объектов.
02 База данных объектов
Выполните:
ls -C .git/objects
Результат:
$ ls -C .git/objects 09 24 28 45 59 6a 77 80 8c 97 af c4 e7 info 11 27 43 56 69 6b 78 84 91 9c b5 e4 fa pack
Вы должны увидеть кучу каталогов, имена которых состоят из 2 символов. Имена каталогов являются первыми двумя буквами хэша sha1 объекта, хранящегося в git.
03 Углубляемся в базу данных объектов
Выполните:
ls -C .git/objects/<dir>
Результат:
$ ls -C .git/objects/09 6b74c56bfc6b40e754fc0725b8c70b2038b91e 9fb6f9d3a104feb32fcac22354c4d0e8a182c1
Смотрим в один из каталогов с именем из 2 букв. Вы увидите файлы с именами из 38 символов. Это файлы, содержащие объекты, хранящиеся в git. Они сжаты и закодированы, поэтому просмотр их содержимого нам мало чем поможет. Рассмотрим далее каталог .git внимательно
04 Config File
Выполните:
cat .git/config
Результат:
$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true [user] name = Alexander Shvets email = [email protected]
Это файл конфигурации, создающийся для каждого конкретного проекта. Записи в этом файле будут перезаписывать записи в файле .gitconfig
вашего главного каталога, по крайней мере в рамках этого проекта.
05 Ветки и теги
Выполните:
ls .git/refs ls .git/refs/heads ls .git/refs/tags cat .git/refs/tags/v1
Результат:
$ ls .git/refs heads tags $ ls .git/refs/heads master $ ls .git/refs/tags v1 v1-beta $ cat .git/refs/tags/v1 fa3c1411aa09441695a9e645d4371e8d749da1dc
Вы должны узнавать файлы в подкаталоге тегов. Каждый файл соответствует тегу, ранее созданному с помощью команды
. Его содержание – это всего лишь хэш коммита, привязанный к тегу.
Каталог heads практически аналогичен, но используется для веток, а не тегов. На данный момент у нас есть только одна ветка, так что все, что вы увидите в этом каталоге – это ветка master.
06 Файл HEAD
Выполните:
cat .git/HEAD
Результат:
$ cat .git/HEAD ref: refs/heads/master
Файл HEAD содержит ссылку на текущую ветку, в данный момент это должна быть ветка master.
11. Алиасы
Цели
- Научиться настраивать алиасы и шорткаты для команд git
01 Общие алиасы
Для пользователей Windows:
Выполнить:
git config --global alias.co checkout git config --global alias.ci commit git config --global alias.st status git config --global alias.br branch git config --global alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short" git config --global alias.type 'cat-file -t' git config --global alias.dump 'cat-file -p'
Также, для пользователей Unix/Mac:
git status, git add, git commit, git checkout — общие команды, для которых полезно иметь сокращения.
Добавьте следующее в файл .gitconfig в вашем $HOME каталоге.
Файл: .gitconfig
[alias] co = checkout ci = commit st = status br = branch hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short type = cat-file -t dump = cat-file -p
Мы уже успели рассмотреть команды commit
и status
, в предыдущем уроке рассмотрели команду log
и совсем скоро познакомимся с checkout
. Главное, что стоит запомнить из этого урока, так это то, что теперь вы можете вводить git st
там, где раньше приходилось использовать
. Аналогичным образом, пишем git co
вместо git checkout
и git ci
вместо git commit
. Что лучше всего, команда git hist
позволит избежать ввода очень длинной команды log
.
Попробуйте использовать новые команды.
02 Задайте алиас hist
в файле .gitconfig
По большей части, я буду продолжать печатать полные команды в этом руководстве. Единственным исключением будет использование алиаса hist
, указанного выше, когда мне понадобится посмотреть git лог. Если вы хотите повторять мои действия, убедитесь, что алиас hist
установлен в вашем файле .gitconfig
.
03 Type
и Dump
Мы добавили несколько алиасов для команд, которых мы еще не рассматривали. С командой
разберемся чуть позже, а команда git cat-file
используется для исследования git, в чем мы вскоре убедимся.
04 Алиасы команд (опционально)
Если ваша оболочка поддерживает алиасы или шорткаты, вы можете добавить алиасы и на этом уровне. Я использую:
Файл: .profile
alias gs='git status ' alias ga='git add ' alias gb='git branch ' alias gc='git commit' alias gd='git diff' alias go='git checkout ' alias gk='gitk --all&' alias gx='gitx --all' alias got='git ' alias get='git '
Сокращение go
для команды git checkout
особенно полезно. Оно позволяет мне вводить:
go <branch>
для переключения в отдельную ветку.
И да, я достаточно часто пишу вместо git
get
или got
, поэтому создам алиасы и для них.
githowto.com