Книга Git сообщества |
- Statistics
- Participants
- Translate into Russian
- Translation result
- 93% translated in draft. Almost done, let's finish it!
##Добро пожаловать в Git##
Добро пожаловать в быструю, распределенную систему контроля версий Git.
Эта книга задумывалась как отправная точка для новичков в Git, чтобы помочь им изучить его максимально легко и быстро.
Эта книга начинается со знакомства читателя с тем, каким образом Git хранит данные, чтобы обеспечить понимание, почему это сделано иначе, чем в остальных средствах контроля версий.
Это должно занять примерно 20 минут.
Далее мы рассмотрим **Базовое использование Git** - команды, которые вы будете использовать 90% времени. Это даст вам хорошую основу, для использования Git в большей части того, для чего вы и планировали его использовать. Для прочтения этой главы вам потребуется около получаса.
Затем мы изучим **Использование Git на Среднем Уровне** - немного более сложные вещи, которые могут заменить некоторые из базовых команд, освоенных в первом разделе. По большей части это будут некоторые трюки и команды, которые позволят вам чувствовать себя немного комфортней после знакомства с базовыми командами.
После того как вы освоите все это, мы охватим **Продвинутое использование Git**, где рассмотрим такие команды, которые большинство людей вряд ли используют так уж часто, но именно они могут быть крайне полезными в определенных ситуациях. Изучение этих команд завершит ваше обучение и вы станете настоящим мастером Git!
Теперь, когда вы уже знаете Git, мы перейдем к разделу **Работая с Git**. Здесь пора перейти к практическому использованию Git в скриптах, совместно со средствами разработки, редакторами и т. п.
Этот раздел предназначен для того, чтобы помочь вам интегрировать Git в ваше окружение.
Напоследок мы представим несколько статей о **низкоуровневой организации** Git, которые могут помочь интересующимся узнать, что происходит внутри самого Git и его протоколах.
### Обратная связь и сотрудничество ###
Если вы заметите ошибку в любом месте этой книги или у вас появятся мысли по улучшению, вы можете написать мне [http://github.com/schacon/gitbook](http://github.com/schacon/gitbook) или модифицировав исходный код этой книги по адресу
[http://github.com/schacon/gitbook](http://github.com/schacon/gitbook)
, прислать мне патч или git:pull-request.
### Ссылки ###
Большая часть этой книги была собрана из различных разрозненных источников.
Если вы хотите посмотреть оригинальные ресурсы,
посетите их и поблагодарите авторов:
* [Git User Manual](http://www.kernel.org/pub/software/scm/git/docs/user-manual.html)
* [The Git Tutorial](http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html)
* [The Git Tutorial pt 2](http://www.kernel.org/pub/software/scm/git/docs/gittutorial-2.html)
* ["My Git Workflow" blog post](http://osteele.com/archives/2008/05/my-git-workflow)
#Введение
## Объектная модель Git ##
### Алгоритм SHA ###
Вся информация, необходимая для представления истории проекта, находится в файлах с 40-символьным именем, которое выглядит примерно так:
6ff87c4664981e4397625791c8ea3bbb5f2279a3
В Git вы постоянно будете встречаться с этими 40-символьными строками.
В каждом случае это имя является хешем содержимого объекта и генерируется с помощью криптографической хеш-функции по алгоритму SHA1.
Для нас это значит, что практически невозможно найти два различных объекта с одним и тем же именем. Отсюда ряд преимуществ, среди которых:
- Git может быстро определить, являются ли два объекта идентичными или нет,
просто сравнив их имена.
- Так как имена объектов вычисляются одним и тем же способом в каждом репозитории,
то объекты с одинаковым содержимым в двух репозиториях будут сохранены
под одним и тем же именем.
- Git может выявлять ошибки чтения объекта, сравнив его имя и вычислив хеш
содержимого по алгоритму SHA1.
### Объекты ###
Каждый объект содержит три атрибута: **тип**, **размер** и **содержимое**.
_Размер_ - это просто размер содержимого, которое зависит от типа объекта.
Существуют четыре различных типа объекта:
"blob", "tree", "commit" и "tag".
- **"blob"** (сырые двоичные данные) используется для хранения содержимого файла, собственно говоря, это и есть сам файл.
- **"tree"** (дерево) в основном похоже на директорию (папку в файловой системе) - это ссылки на множество
других объектов типа tree и/или blob (т.е. файлов и/или поддиректорий).
- **"commit"** (коммит, фиксация изменений) указывает на объект типа tree, который показывает, как выглядел проект
в определенный момент времени. Он содержит метаинформацию
об этом моменте времени, например, о времени создания/модификции этого объекта, авторе изменений,
ссылку на предыдущую фиксацию, и т.д.
- **"tag"** (тег, метка) - это способ указать определенную фиксацию (commit) как особый в некотором смысле.
Обычно он используется для отметки некоторых объектов типа commit как особых релизов
или что-то в этом роде.
Почти все в Git построено на управлении этой простой структурой из четырех
различных типов объектов. Это похоже на небольшую файловую систему, находящуюся поверх
файловой системы компьютера.
### Отличия от SVN ###
Важно заметить, что Git сильно отличается от большинства систем контроля версий,
с которыми вы можете быть знакомы. Subversion, CVS, Perforce, Mercurial и
прочие используют систему _хранения изменений_ - они хранят различия между
двумя последовательными фиксациями. Git поступает по-другому - он сохраняет снимок (snapshot)
всех файлов вашего проекта каждый раз, как вы фиксируете изменения.
При использовании Git это очень важная для понимания концепция.
### Обект типа blob ###
Обект типа blob обычно хранит содержимое файла.
[fig:object-blob]
Вы можете использовать linkgit:git-show[1] для просмотра содержимого любого объекта типа blob.
Предположив, что что у нас есть хеш объекта типа blob, мы можем просмотреть его содержимое так:
$ git show 6ff87c4664
Note that the only valid version of the GPL as far as this project
is concerned is _this_ particular version of the license (ie v2, not
v2.2 or v3.x or whatever), unless explicitly otherwise stated.
...
Объект типа blob есть ни что иное, как фрагмент двоичных данных. Он не имеет ни на что ссылок
и не имеет никаких атрибутов, даже имени файла.
Так как объект типа blob полностью определен своими данными, то если два файла
в дереве директорий (или в различных версиях репозитория)
имеют одинаковое содержимое, то они будут разделять один и тот же blob-объект.
Этот объект полностью независим от своего расположения в дереве директорий,
и переименование файла не изменит объект, с которым этот файл связан.
### Объект типа tree ###
Объект типа tree - это объект, который хранит ссылки на blob-объекты и другие
tree-объекты - и обычно он хранит содержимое директории или поддиректории.
[fig:object-tree]
Многогранная команда linkgit:git-show[1] может быть также использована для просмотра tree-объектов,
но linkgit:git-ls-tree[1] покажет вам больше подробностей.
Предположив, что у нас есть хеш tree-объекта, мы можем просмотреть его так:
$ git ls-tree fb3a8bdd0ce
100644 blob 63c918c667fa005ff12ad89437f2fdc80926e21c .gitignore
100644 blob 5529b198e8d14decbe4ad99db3f7fb632de0439d .mailmap
100644 blob 6ff87c4664981e4397625791c8ea3bbb5f2279a3 COPYING
040000 tree 2fb783e477100ce076f6bf57e4a6f026013dc745 Documentation
100755 blob 3c0032cec592a765692234f1cba47dfdcc3a9200 GIT-VERSION-GEN
100644 blob 289b046a443c0647624607d471289b2c7dcd470b INSTALL
100644 blob 4eb463797adc693dc168b926b6932ff53f17d0b1 Makefile
100644 blob 548142c327a6790ff8821d67c2ee1eff7a656b52 README
...
Как вы можете видеть, tree-объект содержит отсортированный по имени список элементов,
Original (English): Git Community Book
Translation: © zeffyre, saturn721, ivan.borzenkov, Виктор, aiva, Валерий, Дмитрий Исайкин, shergin.com, lexich121, AgurcoV, blog.andrey-chernyshev.com, iBog, k_s, Kroxy, ciiccii, goriy, AmorphDev, aavezel, intnzy, plishas, anatolik, Даниил, ostinru, Владимир Коршунов, mmv-ru, BlackLacost, Bubik, pyromaniac, chemtech, enchantner, and_rew, BrainDamaged, msilen, stogerc .
License: GPL
