Андрей Попов Заметки, переводы, ссылки на ресурсы

Git в шести сотнях слов

2023-02-11
andpop

перевод статьи Mary Rose Cook “Git in six hundred words”

Представим, что у вас есть каталог alpha, содержащий файл number.txt, в котором записано слово “first”.

Запустите git init для превращения каталога alpha в Git-репозиторий.

Выполните git add number.txt для добавления файла number.txt в индекс (на сцену). Индекс – это список всех файлов, за которыми Git следит. Он отображает имена файлов в их содержимое. Сейчас в нем содержится соответствие number.txt->first. Запуск команды add также добавляет в базу данных Git blob-объект, содержащий строку “first”.

Выполните git commit -m first. В результате будут сделаны три вещи:

  1. В базе данных Git будет создан tree-объект, соответствующий списку элементов на верхнем уровне каталога alpha. В этом объекте есть указатель на blob-объект, содержащий строку “first”, который был создан командой git add number.txt.
  2. Создается объект-коммит, соответствующий версии репозитория, которую вы только что закоммитили. Этот объект содержит ссылку на описанный выше tree-объект.
  3. Создается ветка master – указатель на новый объект-коммит.

Выполните команду git clone . ../beta. В результате будет создан новый каталог beta, являющийся Git-репозиторием.

  • Объекты из базы данных Git в alpha будут скопированы в базу данных Git в beta.
  • Ветка master в beta указывает на тот же коммит, на который указывает ветка master в alpha.
  • Индекс в beta будет иметь то же содержимое, что и в alpha, то есть соответствовать содержимому первого коммита.
  • В каталоге beta появится файл number.txt, содержащий строку “first”.

Перейдите в каталог beta. Измените содержимое файла number.txt на на “second”. Выполните команды git add number.txt и git commit -m second. Будет создан объект-коммит, содержащий указатель на своего родителя, первый коммит. После команды commit ветка main будет указывать на второй коммит.

Вернитесь в каталог alpha. Выполните команду git remote add beta ../beta. В результате репозиторий beta будет считаться удаленным репозиторием для alpha.

Выполните команду git pull beta master.

На самом деле при этом выполнятся две команды. Первая из них git fetch beta master. В результате в репозиторий alpha будут скопированы объекты второго коммита из репозитория beta. Запись в alpha о ветке master в beta будет указывать на второй коммит. Команда обновляет указатель FETCH_HEAD, чтобы показать, что ветка master была загружена из репозитория beta.

Вторая команда, неявно выполняющася при git pull, – это git merge FETCH_HEAD. Эта команда:

  • Читает значение указателя FETCH_HEAD, который показывает, что ветка master репозитория beta была последней загруженной веткой.
  • Получает объект-коммит, на который указывает запись в alpha о ветке master в beta. Это второй коммит. Сейчас ветка master в alpha указывает на первый коммит, являющийся родителем для второго коммита. Это означает, что для завершения слияния команда merge может просто изменить ветку master, чтобы он указывала на второй коммит. Далее команда merge обновляет индекс, чтобы его содержимое соответствовало второму коммиту, и обновляет рабочий каталог, чтобы он соответствовал индексу.

Выполните команду git branch red. В результате будет создана ветка red, которая будет указывать на второй коммит.

Выполните команду git checkout red. Перед этой командой HEAD указывал на ветку master, теперь указывает на ветку red. Ветка red является теперь текущей.

Измените содержимое файла numbers.txt на “third” и выполните команды git add numbers.txt и git commit -m third.

Выполните команду git push beta red. В результате в репозитории alpha будут найдены объекты, соответствующие третьему коммиту, и они будут скопированы в репозиторий beta. В репозитории beta появится ветка red, указывающая на третий коммит.


Содержание