Added it/drawbacks.txt
[gitmagic.git] / uk / basic.txt
blob81aec72d33d939288e425c0169cd3ae7322e4319
1 == Базові операції ==
3 Перш ніж занурюватися в нетрі численних команд Git, спробуйте скористатися наведеними нижче простими прикладами, щоб трохи освоїтися. Кожен із них корисний, незважаючи на свою простоту. Насправді перші місяці використання Git я не виходив за рамки матеріалу цього розділу.
5 === Збереження стану ===
7 Збираєтеся спробувати внести якісь радикальні зміни? Попередньо створіть знімок всіх файлів у поточному каталозі за допомогою команд
9  $ git init
10  $ git add .
11  $ git commit -m "Моя перша резервна копія"
13 Тепер, якщо нові правки все зіпсували, можна відновити початкову версію:
15  $ git reset --hard
17 Щоб зберегти стан знову:
19  $ git commit -a -m "Друга резервна копія"
21 === Додавання, видалення, перейменування ===
23 Наведений вище приклад відстежує лише ті файли, які існували при першому запуску *git add*. Якщо ви створили нові файли або підкаталоги, доведеться сказати Git'у:
25  $ git add readme.txt Documentation
27 Аналогічно, якщо хочете, щоб Git забув про деякі файли:
29  $ git rm kludge.h obsolete.c
30  $ git rm -r incriminating/evidence/
32 Git видалить ці файли, якщо ви не видалили їх самі.
34 Перейменування файлу — це те ж саме, що й видалення старого імені та додавання нового. Для цього є *git mv*, яка має той же синтаксис, що і команда *mv*. Наприклад:
36  $ git mv bug.c feature.c
38 === Розширені скасування/повернення ===
40 Іноді просто хочеться повернутися назад і забути всі зміни до певного моменту, тому що всі вони були неправильними. У такому випадку
42  $ git log
44 покаже список останніх коммітів і їхні хеші SHA1:
46 ----------------------------------
47 commit 766f9881690d240ba334153047649b8b8f11c664
48 Author: Іван <ivan@example.com>
49 Date:   Tue Mar 14 01:59:26 2000 -0800
51     Замінив printf() на write().
53 commit 82f5ea346a2e651544956a8653c0f58dc151275c
54 Author: Марічка <marichka@example.com>
55 Date:   Thu Jan 1 00:00:00 1970 +0000
57     Початковий комміт.
58 ----------------------------------
60 Щоб вказати комміт, достатньо перших декількох символів його хешу, але можете скопіювати і весь хеш. Наберіть:
62  $ git reset --hard 766f
64 для відновлення стану до зазначеного комміта і видалення всіх наступних безповоротно.
66 Можливо, іншим разом ви захочете швидко перескочити до старого стану. У цьому випадку наберіть
68  $ git checkout 82f5
70 Ця команда перенесе вас назад у часі, зберігши при цьому більш нові комміти. Однак, як і у фантастичних фільмах про подорожі в часі, якщо тепер ви відредагуєте і закоммітите код, то потрапите в альтернативну реальність, тому що ваші дії відрізняються від тих, що були минулого разу.
72 Ця альтернативна реальність називається «гілкою» (branch) і <<branch,трохи пізніше ми поговоримо про це докладніше>>. А зараз просто запам'ятайте, що команда
74  $ git checkout master
76 поверне вас назад у теперішнє. Крім того, щоб не отримувати попереджень від Git, завжди робіть commit або скидайте зміни перед запуском checkout.
78 Ще раз скористаємося аналогією з комп'ютерними іграми:
80 - *git reset --hard*: завантажує раніше збережену гру і видаляє всі версії, збережені після тількищо завантаженої.
82 - *git checkout*: завантажує стару гру, але якщо ви продовжуєте грати, стан гри буде відрізнятися від більш нових збережень, які ви зробили в перший раз. Будь-яка гра, яку ви тепер зберігаєте, потрапляє в окрему гілку, що представляє альтернативну реальність, в яку ви потрапили. <<branch,Ми обговоримо це пізніше>>.
84 Можна також відновити тільки певні файли і підкаталоги, перерахувавши їх імена після команди:
86  $ git checkout 82f5 якийсь.файл інший.файл
88 Будьте уважні: така форма *checkout* може мовчки перезаписати файли. Щоб уникнути неприємних несподіванок, виконуйте commit перед checkout, особливо якщо ви тільки вивчаєте Git. Взагалі, якщо ви не впевнені у якісь операції, чи то команда Git чи ні, виконайте попередньо *git commit -a*.
90 Не любите копіювати і вставляти хеші? Використовуйте
92  $ git checkout :/"Моя перша р"
94 для переходу на комміт, опис якого починається з наведеного рядка.
96 Можна також запитати 5-й з кінця збережений стан:
98  $ git checkout master~5
100 === Повернення ===
102 У залі суду пункти протоколу можуть викреслювати прямо під час слухання. Подібним чином і ви можете вибирати комміти для скасування.
104  $ git commit -a
105  $ git revert 1b6d
107 скасує комміт із заданим хешем. Повернення буде збережене у вигляді нового комміта. Можете запустити *git log*, щоб переконатися в цьому.
109 === Створення списку змін ===
111 Деяким проектам потрібен http://en.wikipedia.org/wiki/Changelog[спискок змін (changelog)]. Створіть його такою командою:
113  $ git log > ChangeLog
115 === Завантаження файлів ===
117 Отримати копію проекту під управлінням Git можна, набравши
119  $ git clone git://сервер/шлях/до/файлів
121 Наприклад, щоб отримати всі файли, які я використав для створення цього документу,
123  $ git clone git://git.or.cz/gitmagic.git
125 Пізніше ми поговоримо про команду *clone* докладніше.
127 === Тримаючи руку на пульсі ===
129 Якщо ви вже завантажили копію проекту за допомогою *git clone*, можете оновити її до останньої версії, використовуючи
131  $ git pull
133 === Невідкладна публікація ===
135 Припустимо, ви написали скрипт, яким хочете поділитися з іншими. Можна просто запропонувати їм скачувати його з вашого комп'ютера, але якщо вони будуть робити це коли ви допрацьовуєте його або додаєте експериментальну функціональність, у них можуть виникнути проблеми. Очевидно, тому й існують цикли розробки. Розробники можуть постійно працювати над проектом, але загальнодоступним вони роблять свій код лише після того, як приведуть його у пристойний вигляд.
137 Щоб зробити це за допомогою Git, виконайте в каталозі, де лежить ваш скрипт,
139  $ git init
140  $ git add .
141  $ git commit -m "Перший реліз"
143 Потім скажіть вашим користувачам запустити
145  $ git clone ваш.комп’ютер:/шлях/до/скрипту
147 щоб завантажити ваш скрипт. Тут мається на увазі, що у них є доступ по ssh. Якщо ні, запустіть *git daemon* і скажіть користувачам запустити цю команду замість вищенаведеної:
149  $ git clone git://ваш.комп’ютер/шлях/до/скрипту
151 З цих пір щоразу, коли ваш скрипт готовий до релізу, виконуйте
153  $ git commit -a -m "Наступний реліз"
155 і ваші користувачі зможуть оновити свої версії, перейшовши в каталог з вашим скриптом і набравши
157  $ git pull
159 Ваші користувачі ніколи не наткнуться на версію скрипта, яку ви не хочете їм показувати.
161 === Що я зробив? ===
163 З'ясуйте, які зміни ви зробили з часу останнього комміта:
165  $ git diff
167 Чи з вчорашнього дня:
169  $ git diff "@{yesterday}"
171 Чи між певною версією і версією, зробленою 2 комміти назад:
173  $ git diff 1b6d "master~2"
175 У кожному разі на виході буде патч, який може бути застосований за допомогою *git apply*. Спробуйте також:
177  $ git whatchanged --since="2 weeks ago"
179 Часто замість цього я використовую для перегляду історії http://sourceforge.net/projects/qgit[qgit], через приємний інтерфейс, або http://jonas.nitro.dk/tig[tig] з текстовим інтерфейсом, який добре працює через повільне з'єднання. Як варіант, встановіть веб-сервер, введіть *git instaweb* і запустіть будь-який веб-браузер.
181 === Вправа ===
183 Нехай A, B, C, D — чотири послідовні комміти, де В відрізняється від A лише кількома видаленими файлами. Ми хочемо повернути ці файли в D. Як ми можемо це зробити?
185 Існує як мінімум три розв’язки. Припустимо, що ми знаходимося на D.
187   1. Різниця між A і B — видалені файли. Ми можемо створити патч, що відображає ці зміни, і застосувати його:
189    $ git diff B A | git apply
191   2. Оскільки в комміті A ми зберегли файли, то можемо відновити їх:
193    $ git checkout A foo.c bar.h
195   3. Ми можемо розглядати перехід від A до B як зміни, які хочемо скасувати:
197    $ git revert B
199 Який спосіб найкращий? Той, який вам більше подобається. За допомогою Git легко отримати бажане і часто існує багато способів це зробити.