Git

Git
Тип розподілена система керування версіями
Автор Лінус Торвальдс[1]
Розробник Лінус Торвальдс, Джуніо Хамано
Стабільний випуск 2.26.2 (19 квітня 2020; 4 роки тому (2020-04-19))
Операційна система Linux, POSIX, Windows, OS X
Мова програмування C, Bourne Shell, Tcl, Perl[2]
Ліцензія GNU GPL v2
Репозиторій git.kernel.org/pub/scm/git/git.git
Вебсайт git-scm.com

Git — розподілена система керування версіями файлів та спільної роботи. Проєкт створив Лінус Торвальдс для керування розробкою ядра Linux, а сьогодні підтримується Джуніо Хамано (англ. Junio C. Hamano). Git є однією з найефективніших, надійних і високопродуктивних систем керування версіями, що надає гнучкі засоби нелінійної розробки, що базуються на відгалуженні та злитті гілок. Для забезпечення цілісності історії та стійкості до змін заднім числом використовуються криптографічні методи, також можлива прив'язка цифрових підписів розробників до тегів і комітів.

Прикладами проєктів, що використовують Git, є ядро Linux, Android, LibreOffice, Cairo, GNU Core Utilities, Mesa 3D, Wine, багато проєктів з X.org, XMMS2[ru], GStreamer, Debian DragonFly BSD, Perl, Eclipse, GNOME, KDE, Qt, Ruby on Rails, PostgreSQL, VideoLAN, PHP, One Laptop Per Child (OLPC), АБІС Koha, GNU LilyPond та ELinks і деякі дистрибутиви GNU/Linux (див. нижче).

Програма є вільною і випущена під ліцензією GNU GPL версії 2.

Система спроєктована як набір програм, спеціально розроблених з врахуванням їхнього використання у скриптах. Це дозволяє зручно створювати спеціалізовані системи керування версіями на базі Git або користувацькі інтерфейси. Наприклад, Cogito[en] є саме таким прикладом фронтенду до репозиторіїв Git. А StGit використовує Git для управління колекцією латок.

Система має ряд користувацьких інтерфейсів: наприклад, gitk та git-gui розповсюджуються з самим Git.

Віддалений доступ до репозиторіїв Git забезпечується git-демоном, SSH або HTTP сервером. TCP-сервіс git-daemon входить у дистрибутив Git і є разом з SSH найпоширенішим і надійним методом доступу. Метод доступу HTTP, хоч має низку обмежень, дуже популярний в контрольованих мережах, тому що дозволяє використання наявних конфігурацій мережевих фільтрів.

Принцип роботи

Збереження файлів

Дані як зліпки стану проєкту в часі

Git, на відміну від Subversion і подібних до неї систем, не зберігає інформацію як список змін (патчів) для файлів. Замість цього Git зберігає дані набором зліпків. Кожного разу при фіксації поточної версії проєкту Git зберігає зліпок того, як виглядають всі файли проєкту. Але якщо файл не змінювався, то дається посилання на раніше збережений файл (див. рис. 1). Git схожий на своєрідну файлову систему з інструментами, які працюють поверх неї. Для кожного відстежуваного файлу Git зберігає розмір, час створення та останньої зміни. Ці дані зберігаються у файлі index, який знаходиться у теці .git. Вся база даних Git зберігається в теці з назвою .git
В Git файли можуть знаходитися в одному із 3-х станів: зафіксованому (файл вже збережено в локальній базі даних), зміненому (файл було змінено, але зміни не зафіксовано) і підготовленому (файли було змінено і відмічено для фіксації).

Локальні операції

Більшість дій можна виконувати на локальній файловій системі без використання інтернет підключення. Вся історія змін зберігається локально і при необхідності вивантажується у віддалений репозиторій. На відміну від Subversion, де без підключення до інтернету можна лише редагувати файли, але зберегти зміни в вашу базу даних неможливо (оскільки вона відключена від репозиторію). Будь-який коміт спочатку робиться локально, а потім вивантажується у віддалений репозиторій.

Цілісність даних

У своїй базі Git зберігає все по хешам файлів, які хешуються функцією SHA-1. Перед кожним збереженням файлів Git обчислює SHA-1 хеш файлу й отриманий хеш стає індексом файлу в Git. Використовуючи хеш Git легко відстежує зміни в файлах.

Галуження (гілки)

Галуження — це розмежування від основної лінії розробки. Git дозволяє створити декілька гілок і перемикатися між ними. Це корисно, оскільки дозволяє працювати декільком розробникам над своїм функціоналом не заважаючи іншим і не псуючи основну гілку. За замовчуванням, Git створює гілку з назвою master. Гілка в Git просто являє собою вказівник на одну із фіксацій. При кожній новій фіксації гілка в Git рухається автоматично (тобто перемикається на фіксацію). Гілка є простим файлом, який містить 40 символів контрольної суми SHA-1 фіксації. Створення нової гілки дуже швидке, оскільки це однаково запису в файл 41 байта (40 символів + символ нового рядка).

Зливання та перебазовування даних

Git підтримує два способи для інтеграції змін з гілки в гілку: merge (зливання) та rebase (перебазування). Основна різниця полягає в тому, що rebase запам'ятовує фіксації у вигляді патчів, перемотує гілку і застосовує патчі у вигляді фіксацій на відміну від merge, який зливає дві гілки в одну.

Візуалізатори історії

  • Gitk(gitk) проста, але перевірена і швидка програма. Написана на Tcl/Tk, розповсюджується з самим Git.
  • QGit [Архівовано 18 листопада 2007 у Wayback Machine.] (Sourceforge [Архівовано 26 лютого 2008 у Wayback Machine.]) інтерфейс написаний з використанням Qt, багато в чому схожий з gitk, але дещо відрізняється набором можливостей (Marco Costalba). В наш час[коли?] переписується на Qt4, що спростить його портування на Microsoft Windows.
  • Giggle — варіант на Gtk+.
  • gitg [Архівовано 24 грудня 2010 у Wayback Machine.] — ще один інтерфейс для gtk+/GNOME
  • Git-Cola [Архівовано 13 червня 2011 у Wayback Machine.] — потужний графічний інтерфейс для Git.
  • TortoiseGit [Архівовано 1 січня 2011 у Wayback Machine.] — інтерфейс, реалізований як розширення для провідника Windows.
  • SourceTree [Архівовано 6 серпня 2013 у Wayback Machine.] — безкоштовний Git клієнт для Windows і Mac OS.
  • Magit [Архівовано 9 лютого 2022 у Wayback Machine.] - інтерфейс для GNU Emacs

Приклади

Створення локального репозиторію

Додаємо всі файли

$ cd <path_project> #Шлях до проєкту (наприклад: $ cd с:/www/git). Переходимо в наявну теку, в якій буде розміщено проєкт
$ git init #Ініціалізація репозиторію. Створює в каталозі Project каталог .git і в ньому всі необхідні файли репозиторію
$ git add . #Додаємо всі файли, які наявні в каталозі Project, під версійний контроль
$ git commit -m "Коментар" #Фіксуємо зміни

Клонувати проєкт з віддаленого сервера в локальний каталог

$ git clone <remote_path_project> #Проєкт буде клоновано з віддаленого сервера у поточний локальний каталог (наприклад, https://github.com/git/git.git)

Отримати останні зміни проєкту з віддаленого сервера

$ git pull #Всі файли будуть оновлені до останньої версії з віддаленого сервера

Перегляд історії змін

$ git log #Відображає всі зміни, зроблені в поточній гілці проєкту в хронологічному порядку

Видалення файлів

Видалення з індексу

$ git rm --cached README.txt #Видалення файлу README.txt з індексу, тобто він фізично залишається, але зміни в ньому не відстежуються.

Видалення з репозиторію

$ git rm README.txt #Видалення файлу README.txt з робочого каталогу та індексу  !!! Використовувати уважно!

Рекурсивне видалення

$ git rm --cached -r . #Видалення з індексу всіх файлів в поточному каталозі, включаючи вкладені каталоги

Робота з декількома гілками

Створення нової гілки

$ git branch new_branch # Створення нової гілки з назвою new_branch
$ git checkout new_branch # Перемикання на гілку new_branch

Перегляд всіх гілок

$ git branch # Переглянути всі гілки

Вебінтерфейси

  • gitweb[недоступне посилання з лютого 2019] — написаний на Perl (англ. Kay Sievers). Більшість наведених нижче великих публічних git-репозиторіїв його й застосовує.
  • wit — написаний на Ruby/eRuby (англ. Christian Meder)
  • gitarella — Ruby (Diego Pettenò)
  • git-php [Архівовано 3 грудня 2007 у Wayback Machine.] — PHP (англ. Zack Bartel)
  • cgit — написаний на C (англ. Lars Hjemli)
  • cogito [Архівовано 16 січня 2008 у Wayback Machine.] — інтерфейс з командами спроєктованими для користувачів звиклих до CVS та SVN (англ. Petr Baudis)
  • StGit [Архівовано 29 вересня 2007 у Wayback Machine.] — написана на Python система керування колекцією латок (англ. Catalin Marinas)

Обмін змінами з іншими системами керування версіями

  • CVS — імпорт і експорт, емуляція CVS-сервера, в стандартному постачанні
  • Subversion — імпорт і експорт (частково), в стандартному постачанні
  • .tar.gz, .tar.bz2 (серії версійних файлів) — імпорт і експорт, в стандартному постачанні
  • Perforce — імпорт і експорт (частково), в стандартному постачанні та в архівах Git Mailing List
  • Mercurial — імпорт і експорт, в стандартному постачанні та за допомогою зовнішньої програми (Tailor)

Крім того, завдяки своїй структурі даних та форматам даних обміну Git дозволяє порівняно просто й ефективно реалізувати обмін даними практично зі всіма наявними системами керування версіями.

Проєкти, що використовують Git

Git застосовується в багатьох проєктах; можна відзначити як апстріми, так і дистрибутиви GNU/Linux:

Виноски

  1. https://web.archive.org/web/20151116175401/https://github.com/git/git/commit/e83c5163316f89bfbde7d9ab23ca2e25604af290
  2. git/git.git/tree. git.kernel.org. Архів оригіналу за 27 травня 2012. Процитовано 15 червня 2009.
  3. https://directory.fsf.org/wiki/Git
  4. Kernel.org git repositories. git.kernel.org. Процитовано 30 січня 2024.
  5. Wine. GitLab (англ.). Процитовано 30 січня 2024.
  6. Debian. GitLab (англ.). 30 січня 2024. Процитовано 30 січня 2024.
  7. Perl 5 now uses Git for version control[недоступне посилання з червня 2019]
  8. Архівована копія. Архів оригіналу за 4 вересня 2019. Процитовано 6 січня 2008.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  9. MariaDB moves development to Github. Архів оригіналу за 29 травня 2014. Процитовано 29 травня 2014.

Див. також

  • Домашня сторінка Git [Архівовано 6 лютого 2012 у Wayback Machine.]
  • Переклад українською книги «Pro Git» Скотта Чакона (Scott Chacon) та Бена Страуба (Ben Straub) [Архівовано 22 жовтня 2014 у Wayback Machine.]
  • Книга «Git Magic» українською [Архівовано 28 листопада 2013 у Wayback Machine.]
  • Git User's Manual [Архівовано 5 березня 2018 у Wayback Machine.] (англ.) (також розповсюджується разом з початковим текстом програми: Documentation/user-manual.txt)
  • Сторінка Git на kernel.org
  • Everyday Git [Архівовано 4 березня 2016 у Wayback Machine.] («Git на кожен день») — набір з приблизно 20 команд (насправді їх буде близько 5—6), які стануть у пригоді в повсякденному використанні системи.
  • Linus Torvalds on Git [Архівовано 23 грудня 2015 у Wayback Machine.] — розповідь Лінуса Торвальдса про git та інші системи керування версіями (YouTube)
  • Патчення з допомогою git, cogito та quilt [Архівовано 3 жовтня 2017 у Wayback Machine.]
  • Базове використання Git [Архівовано 23 березня 2010 у Wayback Machine.]


PROG Це незавершена стаття про програмування.
Ви можете допомогти проєкту, виправивши або дописавши її.


  • п
  • о
  • р
Роки, якщо є, показують дату першого стабільного релізу. Системи з іменами виділеними курсивом більше не підтримуються, або заплановано завершення підтримки.
Локальні
SCCS (1972) • RCS (1982)
PVCS (1985) • MKS Source Integrity (1992)
Клієнт-серверні (централізовані)
Вільні/відкриті
CVS (1990) • CVSNT (1998) • Subversion (2000)
Закриті
Software Change Manager (1970s) • ClearCase (1992) • Visual SourceSafe (1994) • Perforce (1995) • MKS Integrity (2001) • Vault (2003) • Team Foundation Server (2005) • AccuRev (?)
Розподілені (децентралізовані)
Вільні/відкриті
GNU arch (2001) • Darcs (2002) • DCVS (2002) • SVK (2003) • Monotone (2003) • Codeville (2005) • Git (2005) • Mercurial (2005) • Bazaar (2005) • Fossil (2007)
Закриті
TeamWare (1990?) • Code Co-op (1997) • BitKeeper (1998) • Plastic SCM (2006)
Концепції
Дерево змін • Набір змін • Стовбур • Гілки • Tag • Фіксація змін • Дельта кодування • Різниця • Злиття • Відгалуження
Список систем керування версіями • Порівняння систем керування версіями

П:  Портал «Програмування»