ru/branch.txt editing finished
[gitmagic/gitmagic.git] / ru / branch.txt
blob2e64d19959dc2667e91bf30607522179f864071d
1 == Чудеса ветвления == 
3 Возможности мгновенного ветвления и слияния — самые потрясающие особенности Git.
5 *Задача*: внешние факторы неизбежно влекут переключение внимания. Серьезная ошибка обнаруживается в уже выпущенной версии без предупреждения. Срок сдачи конкретного функционала приближается. Разработчик, помощь которого нужна вам в работе над ключевой частью проекта, собирается в отпуск. Одним словом, вам нужно срочно бросить все, над чем вы трудитесь в настоящий момент, и переключиться на совершенно другие задачи.
7 Прерывание хода ваших мыслей может серьезно снизить эффективность работы, и чем сложнее переключение между процессами, тем больше будет потеря. При централизованном управлении версиями мы вынуждены скачивать свежую рабочую копию с центрального сервера. Распределенная система лучше: мы можем клонировать нужную версию локально.
9 Однако клонирование все же предполагает копирование всего рабочего каталога, как и всей истории изменений до настоящего момента. Хотя Git и снижает затратность этого действия за счет возможности совместного использования файлов и жестких ссылок, но все файлы проекта придется полностью воссоздать в новом рабочем каталоге.
11 *Решение*: у Git есть более удобный инструмент для таких случаев, который сэкономит и время, и дисковое пространство по сравнению с клонированием — это *git branch* (branch — ветка, прим. пер.).
13 Этим волшебным словом файлы в вашем каталоге мгновенно преобразуются от одной версии к другой. Это изменение позволяет сделать намного больше, чем просто вернуться назад или продвинуться вперед в истории. Ваши файлы могут изменится с последней выпущенной версии на экспериментальную, с экспериментальной — на текущую версию в разработке, с неё — на версию вашего друга и так далее.
15 === Кнопка босса ===
17 Играли когда-нибудь в одну из таких игр, где при нажатии определеной клавиши («кнопки босса»), на экране мгновенно отображается таблица или что-то вроде того? То есть, если в офис зашел начальник, а вы играете в игру, вы можете быстро ее скрыть.
19 В каком-нибудь каталоге:
21  $ echo "Я хитрее моего босса" > myfile.txt 
22  $ git init 
23  $ git add .  
24  $ git commit -m "Начальный коммит"
26 Мы создали хранилище Git, содержащее один текстовый файл с определенным сообщением. Теперь выполните
28  $ git checkout -b boss # вероятно, это последнее изменение
29  $ echo "Мой босс меня умнее" > myfile.txt
30  $ git commit -a -m "Другой коммит"
32 Это выглядит так, будто мы только что перезаписали файл и сделали коммит. Но это иллюзия. Наберите
34  $ git checkout master # переключиться на оригинальную версию файла
36 Вуаля! Текстовый файл восстановлен. А если босс решить сунуть нос в этот каталог, запустите
38  $ git checkout boss # перейти на версию, подходящую для глаз босса
40 Вы можете переключаться между двумя версиями этого файла так часто, как вам хочется и делать коммиты каждой из них независимо.
42 === Грязная работа ===
44 [[branch]]
45 Допустим, вы работаете над некой функцией, и вам зачем-то понадобилось вернуться на три версии назад и временно добавить несколько операторов вывода, чтобы посмотреть как что-либо работает. Тогда введите
47  $ git commit -a
48  $ git checkout HEAD~3
50 Теперь вы можете добавлять временный черновой код в любых местах. Можно даже закоммитить эти изменения. Когда закончите, выполните
52  $ git checkout master
54 чтобы вернуться к исходной работе. Заметьте, что любые изменения, не внесенные в коммит, будут перенесены.
56 А что, если вы все-таки хотели сохранить временные изменения? Запросто:
58  $ git checkout -b dirty
60 а затем сделайте коммит перед возвращением в ветку master. Всякий раз, когда вы захотите вернуться к черновым изменениям, просто выполните
62  $ git checkout dirty
64 Мы говорили об этой команде в одной из предыдущих глав, когда обсуждали загрузку старых состояний. Теперь у нас перед глазами полная картина: файлы изменились к нужному состоянию, но мы должны покинуть ветвь master. Любые коммиты, сделанные с этого момента, направят файлы по другому пути, который может быть указан позже.
66 Другими словами, после переключения на более старое состояние Git автоматически направляет вас по новой безымянной ветке, которой можно дать имя и сохранить с помощью *git checkout -b*.
68 === Быстрые исправления ===
70 Ваша работа в самом разгаре, когда вдруг выясняется, что нужно все бросить и исправить только что обнаруженную ошибку в коммите «1b6d…»:
72  $ git commit -a
73  $ git checkout -b fixes 1b6d
75 После исправления ошибки сделайте
77  $ git commit -a -m "Ошибка исправлена"
78  $ git push # в центральное хранилище
79  $ git checkout master
81 и вернитесь к работе над вашими исходными задачами.
83 Вы можете даже «влить» только что сделанное вами исправление ошибки, набрав
85  $ git merge fixes
87 или
89  $ git pull
91 т.к. вы уже отправили это исправление в основное хранилище.
93 === Слияния ===
95 В некоторых системах управления версиями создавать ветки легко, а вот сливать их воедино трудно. В Git слияние столь тривиально, что вы можете его не заметить.
97 Действительно, хотя мы только познакомились с *git merge*, мы сталкивались со слияниями уже давно. Команда *pull* по сути получает коммиты, а затем сливает их с вашей текущей веткой. Если у вас нет локальных изменений, слияние произойдёт само собой, как вырожденный случай вроде получения последней версии в централизованной системе управления версиями. Если же у вас есть локальные изменения, Git автоматически произведет слияние и сообщит о любых конфликтах.
99 Обычно у коммита есть один «родитель», а именно предыдущий коммит. Слияние веток приводит к коммиту как минимум с двумя родителями. Отсюда возникает вопрос: к какому коммиту на самом деле отсылает HEAD~10? Коммит может иметь несколько родителей, так за которым из них следовать далее?
101 Оказывается, такая запись всегда выбирает первого родителя. Это хороший выбор, потому что коммиты в текущей ветке становятся первыми родителями во время слияния. Часто вас интересуют только изменения, сделанные вами в текущей ветке, а не те, которые влились из других веток.
103 Вы можете обращаться к конкретному родителю с помощью символа «^». Например, чтобы показать запись в журнале от второго родителя, наберите
105  $ git log HEAD^2
107 Для первого родителя номер можно опустить. Например, чтобы показать разницу с первым родителем, введите
109  $ git diff HEAD^
111 Вы можете сочетать такую запись с другими. Например,
113  $ git checkout 1b6d^^2~10 -b ancient
115 создаст новую ветку «ancient» («древняя», прим. пер.), отражающую состояние на десять коммитов назад от второго родителя первого родителя коммита, начинающегося с 1b6d.
117 === Непрерывный рабочий процесс ===
119 В производстве техники часто бывает, что второй шаг плана должен ждать завершения первого шага. Автомобиль, нуждающийся в ремонте, может тихо стоять в гараже до прибытия с завода конкретной детали. Прототип может ждать производства чипа, прежде чем разработка будет продолжена.
121 И в разработке ПО может быть то же. Вторая часть нового функционала может быть вынуждена ожидать выпуска и тестирования первой части. Некоторые проекты требуют проверки вашего кода перед его принятием, так что вы должны дождаться утверждения первой части, прежде чем начинать вторую.
123 Благодаря безболезненным ветвлению и слиянию, мы можем изменить правила и работать над второй частью до того, как первая официально будет готова. Допустим, вы закоммитили первую часть и выслали её на проверку. Скажем, вы в ветке master. Теперь смените ветку:
125  $ git checkout -b part2 # часть2
127 Затем работайте над второй частью, попутно внося коммиты ваших изменений. Человеку свойственно ошибаться, и часто вы хотите вернуться и поправить что-то в первой части. Если вы везучи или очень искусны, можете пропустить эти строки.
129  $ git checkout master  # Возвращаемся к первой части.
130  $ edit files           # Исправляем её.
131  $ git checkout part2   # Возвращаемся ко второй части.
132  $ git merge master     # Вливаем сделанные исправления.
134 В конечном счёте, первая часть утверждена:
136  $ git checkout master  # Возвращаемся к первой части.
137  $ некая_команда        # Некая команда, которую вам нужно выполнить,
138                         # когда текущий рабочий каталог формально готов.
139  $ git merge part2      # Вливаем вторую часть.
140  $ git branch -d part2
142 Теперь вы снова в ветке master, а вторая часть — в вашем рабочем каталоге.
144 Этот приём легко расширить на любое количество частей. Столь же легко сменить ветку задним числом. Предположим, вы слишком поздно обнаружили, что должны были создать ветку семь коммитов назад. Тогда введите:
146  $ git branch -m master part2
147  $  # Переименовываем ветку master в part2.
148  $ git checkout HEAD~7 -b master
150 Теперь ветка master содержит только первую часть, а ветка part2 — всё остальное.
152 === Изменяем состав смеси ===
154 Предположим, вам нравится работать над всеми аспектами проекта в одной и той же ветке. Вы хотите закрыть свой рабочий процесс от других, чтобы все видели ваши коммиты только после того, как они будут хорошо оформлены. Создайте пару веток:
156  $ git checkout -b sanitized
157  $ git checkout -b medley
159 Далее делайте всё что нужно: исправляйте ошибки, добавляйте новые функции, добавляйте временный код и так далее, при этом почаще выполняя коммиты. После этого
161  $ git checkout sanitized 
162  $ git cherry-pick medley^^
164 применит коммит «пра-родителя» головы ветки «medley» к ветке «sanitized». Правильно подбирая элементы, вы сможете создать ветку, в которой будет лишь окончательный код, а связанные между собой коммиты будут собраны вместе.
166 === Управление Ветками ===
168 Для просмотра списка всех веток наберите
170  $ git branch
172 По умолчанию вы начинаете с ветки под названием «master». Кому-то нравится оставлять ветку «master» нетронутой и создавать новые ветки со своими изменениями.
174 Опции *-d* и *-m* позволяют удалять и перемещать (переименовывать) ветки. См. *git help branch*.
176 Ветка «master» — это удобная традиция. Другие могут предполагать, что в вашем хранилище есть ветка с таким именем и что она содержит официальную версию проекта. Хотя вы можете переименовать или уничтожить ветку «master», лучше соблюсти общее соглашение.
178 === Временные Ветки ===
180 Через какое-то время вы можете обнаружить, что создаете множество временных веток для одной и той же краткосрочной цели: каждая такая ветка всего лишь сохраняет текущее состояние, чтобы вы могли вернуться назад и исправить серьёзную ошибку или сделать что-то еще.
182 Это похоже на то, как вы переключаете телевизионные каналы, чтобы посмотреть что показывают по другим. Но вместо того, чтобы нажать на пару кнопок, вам нужно создавать, выбирать (checkout), сливать (merge) а затем удалять временные ветки. К счастью, в Git есть сокращенная команда, столь же удобная, как пульт дистанционного управления.
184  $ git stash
186 Эта команда сохранит текущее состояние в во временном месте («тайнике», stash) и востановит предыдущее состояние. Ваш каталог становиться точно таким, каким был до начала редактирования, и вы можете исправить ошибки, загрузить удаленные изменения и тому подобное. Когда вы хотите вернуться назад в состояние «тайника», наберите:
188  $ git stash apply # Возможно, понадобится устранить возникшие конфликты.
190 Можно создавать несколько тайников, используя их по-разному. См. *git help stash*. Как вы могли догадаться, Git оставляет ветки «за кадром» при выполнении этого чудесного приема.
192 === Работайте как вам нравится ===
194 Возможно, вы сомневаетесь, стоят ли ветки таких хлопот. В конце концов, клоны почти столь же быстрые и вы можете переключаться между ними с помощью *cd* вместо загадочных команд Git.
196 Посмотрим на веб-браузеры. Зачем нужна поддержка вкладок вдобавок к окнам? Поддержка и тех, и других позволяет приспособиться к широкому разнообразию стилей работы. Некоторым пользователям нравится держать открытым единственное окно и использовать вкладки для множества веб-страниц. Другие могут впасть в другую крайность: множество окон без каких-либо лишних вкладок. Третьи предпочтут нечто среднее.
198 Ветки похожи на вкладки для рабочего каталога, а клоны — на новые окна браузера. Эти операции быстры и выполняются локально, так почему бы не поэкспериментировать и не найти наиболее удобную для себя комбинацию? Git позволяет работать в точности так, как вам нравится.