Содержание

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

Вы должны узнавать файлы в подкаталоге тегов. Каждый файл соответствует тегу, ранее созданному с помощью команды git tag. Его содержание – это всего лишь хэш коммита, привязанный к тегу.

Каталог heads практически аналогичен, но используется для веток, а не тегов. На данный момент у нас есть только одна ветка, так что все, что вы увидите в этом каталоге – это ветка

master.

06 Файл HEAD
Выполните:
cat .git/HEAD
Результат:
$ cat . git/HEAD
ref: refs/heads/master

Файл HEAD содержит ссылку на текущую ветку, в данный момент это должна быть ветка master.

17. Удаление коммитов из ветки

Цели

  • Научиться удалять самые последние коммиты из ветки

Revert из предыдущего раздела является мощной командой, которая позволяет отменить любые коммиты в репозиторий. Однако, и оригинальный и «отмененный» коммиты видны в истории ветки (при использовании команды git log).

Часто мы делаем коммит, и сразу понимаем, что это была ошибка. Было бы неплохо иметь команду «возврата», которая позволила бы нам сделать вид, что неправильного коммита никогда и не было. Команда «возврата» даже предотвратила бы появление нежелательного коммита в истории git log.

01 Команда reset

Мы уже видели команду reset и использовали ее для согласования буферной зоны и выбранного коммита (мы использовали коммит HEAD в нашем предыдущем уроке).

При получении ссылки на коммит (т.е. хэш, ветка или имя тега), команда reset

  1. Перепишет текущую ветку, чтобы она указывала на нужный коммит
  2. Опционально сбросит буферную зону для соответствия с указанным коммитом
  3. Опционально сбросит рабочий каталог для соответствия с указанным коммитом

02 Проверьте нашу историю

Давайте сделаем быструю проверку нашей истории коммитов.

Выполните:
git hist
Результат:
$ git hist
* 45fa96b 2011-03-09 | Revert "Oops, we didn't want this commit" (HEAD, master) [Alexander Shvets]
* 846b90c 2011-03-09 | Oops, we didn't want this commit [Alexander Shvets]
* fa3c141 2011-03-09 | Added HTML header (v1) [Alexander Shvets]
* 8c32287 2011-03-09 | Added standard HTML page tags (v1-beta) [Alexander Shvets]
* 43628f7 2011-03-09 | Added h2 tag [Alexander Shvets]
* 911e8c9 2011-03-09 | First Commit [Alexander Shvets]

Мы видим, что два последних коммита в этой ветке — «Oops» и «Revert Oops». Давайте удалим их с помощью сброса.

03 Для начала отметьте эту ветку

Но прежде чем удалить коммиты, давайте отметим последний коммит тегом, чтобы потом можно было его найти.

Выполните:
git tag oops

04 Сброс коммитов к предшествующим коммиту Oops

Глядя на историю лога (см. выше), мы видим, что коммит с тегом «v1» является коммитом, предшествующим ошибочному коммиту. Давайте сбросим ветку до этой точки. Поскольку ветка имеет тег, мы можем использовать имя тега в команде сброса (если она не имеет тега, мы можем использовать хэш-значение).

Выполните:
git reset --hard v1
git hist
Результат:
$ git reset --hard v1
HEAD is now at fa3c141 Added HTML header
$ git hist
* fa3c141 2011-03-09 | Added HTML header (HEAD, v1, master) [Alexander Shvets]
* 8c32287 2011-03-09 | Added standard HTML page tags (v1-beta) [Alexander Shvets]
* 43628f7 2011-03-09 | Added h2 tag [Alexander Shvets]
* 911e8c9 2011-03-09 | First Commit [Alexander Shvets]

Наша ветка master теперь указывает на коммит v1, а коммитов Oops и Revert Oops в ветке уже нет. Параметр --hard указывает, что рабочий каталог должен быть обновлен в соответствии с новым head ветки.

05 Ничего никогда не теряется

Что же случается с ошибочными коммитами? Оказывается, что коммиты все еще находятся в репозитории. На самом деле, мы все еще можем на них ссылаться. Помните, в начале этого урока мы создали для отмененного коммита тег «oops». Давайте посмотрим на все коммиты.

Выполните:
git hist --all
Результат:
$ git hist --all
* 45fa96b 2011-03-09 | Revert "Oops, we didn't want this commit" (oops) [Alexander Shvets]
* 846b90c 2011-03-09 | Oops, we didn't want this commit [Alexander Shvets]
* fa3c141 2011-03-09 | Added HTML header (HEAD, v1, master) [Alexander Shvets]
* 8c32287 2011-03-09 | Added standard HTML page tags (v1-beta) [Alexander Shvets]
* 43628f7 2011-03-09 | Added h2 tag [Alexander Shvets]
* 911e8c9 2011-03-09 | First Commit [Alexander Shvets]

Мы видим, что ошибочные коммиты не исчезли. Они все еще находятся в репозитории. Просто они отсутствуют в ветке master. Если бы мы не отметили их тегами, они по-прежнему находились бы в репозитории, но не было бы никакой возможности ссылаться на них, кроме как при помощи их хэш имен. Коммиты, на которые нет ссылок, остаются в репозитории до тех пор, пока не будет запущен сборщик мусора.

06 Опасность сброса

Сброс в локальных ветках, как правило, безопасен. Последствия любой «аварии» как правило, можно восстановить простым сбросом с помощью нужного коммита.

Однако, если ветка «расшарена» на удаленных репозиториях, сброс может сбить с толку других пользователей ветки.

24. Создание ветки

Цели

  • Научиться создавать локальную ветку в репозитории

Пора сделать наш hello world более выразительным. Так как это может занять некоторое время, лучше переместить эти изменения в отдельную ветку, чтобы изолировать их от изменений в ветке master.

01 Создайте ветку

Давайте назовем нашу новую ветку «style».

Выполните:
git checkout -b style
git status

Примечание: git checkout -b <имяветки> является шорткатом для git branch <имяветки> за которым идет git checkout <имяветки>.

Обратите внимание, что команда git status сообщает о том, что вы находитесь в ветке «style».

02Добавьте файл стилей style.css
Выполните:
touch lib/style.css
Файл:
lib/style.css
h2 {
  color: red;
}
Выполните:
git add lib/style.css
git commit -m "Added css stylesheet"

03Измените основную страницу

Обновите файл hello.html, чтобы использовать стили style.css.

Файл:
lib/hello.html
<!-- Author: Alexander Shvets ([email protected]) -->
<html>
  <head>
    <link type="text/css" rel="stylesheet" media="all" href="style.
css" />
</head> <body> <h2>Hello, World!</h2> </body> </html>
Выполните:
git add lib/hello.html
git commit -m "Hello uses style.css"

04Измените index.html

Обновите файл index.html, чтобы он тоже использовал style.css

Файл:
index.html
<html>
  <head>
    <link type="text/css" rel="stylesheet" media="all" href="lib/style.css" />
  </head>
  <body>
    <iframe src="lib/hello.html" />
  </body>
</html>
Выполните:
git add index.html
git commit -m "Updated index.html"

05 Далее

Теперь у нас есть новая ветка под названием

style с 3 новыми коммитами. Далее мы узнаем, как осуществлять навигацию и переключаться между ветками.

Лучший курс по Git от Lynda.com. На русском

Люди ошибаются, а вот система контроля Git – нет! Давайте разберемся в ней, чтобы новичок освоил, а опытный закрепил знания.

Первые уроки носят пояснительный характер: что за Git система, история и предшественники, что такое «распределенный контроль версий», а также для кого предназначен Git. В общем, тот базис, который должен лечь в основу изучения. Полезно для начинающих, но совершенно бесполезно для тертых девелоперов. Подойдет и тем, кто с VCS на «ты», а об истоках не знает.

В первых видео изложена инструкция по установке Git для различных ОС: Mac OS X, Windows, а также установка Git на Linux. При этом версия выбранной операционной системы может быть любой.

 

В видео о настройке Git речь пойдет о разноуровневых конфигурациях, автозаполнении и вызове справки.

Инициализация репозитория – первый шаг. Далее разберемся, куда сохраняются файлы для контроля версий проекта. После этого вы создадите первый Git-коммит, напишете для него сообщение и просмотрите лог.

Концепции и архитектура помогут разобраться, как работает VCS. Схематическое представление облегчит понимание, а вплетение рабочего процесса в теорию позволит увидеть все на практике. Ссылка на коммиты и разбор указателя HEAD станут завершающими уроками в этой части.

Вы узнаете:

  • как добавлять файлы в Git-репозиторий со знанием архитектуры;
  • как редактировать;
  • как просматривать изменения;
  • как удалять файлы и отслеживать удаления;
  • как перемещать и переименовывать файлы.

В видео подробно описано, как использовать файлы в реальном проекте. Разложено все, начиная созданием репозитория и заканчивая обработкой изменений. Наглядное использование позволит быстрее освоиться в VCS Git и закрепить знания.

В этих уроках показано, как отменить одно или ряд изменений, даже тех, которые закоммичены в Git-репозиторий. Отменить можно изменения в рабочей директории, буфере или репозитории. Рассказано о проблемах отмены старых коммитов, а также продемонстрированы мощные команды, способные обходить подобные проблемы и даже отменять несколько коммитов сразу.

Гайды по работе с Git
Git за полчаса: руководство для начинающих
20 полезных навыков, которые можно освоить за 3 дня

Git для начинающих — обучение основам, курс уроков по Git на itProger

Небольшой курс по изучению технологии Git для начинающих, а также GitHub. В ходе курса вы научитесь работать с Git, изучите работу с локальным и удаленным хранилищем, а также изучите все основные концепции технологии Git.

Полезные ссылки:

  1. Официальный сайт GitHub;
  2. Официальный сайт Git;
  3. Редактор Atom.

Суть Git в том, что вы всегда можете контролировать где и что пошло не так и в каком месте произошла ошибка. Вы спокойно можете отследить всю цепь событий, которая привела к самой ошибке. Git позволяет заглядывать в историю проекта, а кроме того, он позволяет откатиться до более ранних версий вашего проекта.

Итак, что же такое Git. Git — удобная технология, которая позволяет объединить работу нескольких сотрудников в одном месте. Представим что у вас есть какой-либо крупный проект, над которым трудятся десятки сотрудников. Организовать работу чтобы каждый видел изменения в проекте и видел что делают другие — не простая задача.

Здесь на помощь и приходит Git. Его можно представить как некое облачное хранилище, в которое каждый из сотрудников может загружать свои изменения что он внес в проект и все остальные соавторы проекта видят изменения, знают когда они произошли и знают зачем они были внесены. Таким образом работа над одним проект организовывается и каждый может выполнять свою часть работы. При этом, дабы сотруднику поделиться результатами, ему не приходиться отправлять копию проекта всем членам команды. Все что ему необходимо сделать, так это загрузить новую версию проекта на репозиторий git.


Плюсы работы здесь очевидны: вы знаете кто и что добавил в проект, вы можете отследить все изменения в проекте, а также, вы можете вернуться к предыдущей версии проекта, так как git хранит все ранее загруженные версии. 

Таким образом, даже если возникнет фатальная ошибка в какой-либо из версий, то всегда можно откатиться к предыдущей версии, где этой ошибки еще не было.

Работа с терминалом

Для работы с Git вам стоит обладать базовыми навыками работы с терминалом. Предлагаем вам ознакомиться с небольшим уроком по работе с терминалом, в ходе которого вы быстро сможете изучить все основные команды терминала.