Ветки и слияния: rebase, squash, cherry-pick, conflict
Тема дорожной карты · Английский для IT
🔊 Словарь терминов с произношением →
Терминология веток в Git почти не переводится, и даже в русскоязычных командах говорят rebase, squash, cherry-pick. Базовые понятия: branch — ветка, to branch off — ответвиться от (branch off master), trunk / main / master — основная ветка, feature branch — ветка задачи, release branch — ветка релиза, hotfix branch. HEAD — указатель на текущий коммит, detached HEAD — состояние без ветки. Upstream — ветка или репозиторий, откуда берутся изменения; downstream — куда они уходят; origin — имя удалённого репозитория по умолчанию; fork — ваша копия чужого репозитория. Операции: merge — слить, создаёт merge commit; fast-forward — слияние без нового коммита, когда ветка просто продвигается вперёд; rebase — перебазировать, переписать историю ветки поверх другой (rebase onto master); squash — сжать несколько коммитов в один; squash-merge — слить, сжав в один коммит; cherry-pick — перенести отдельный коммит на другую ветку; revert — создать коммит, отменяющий другой; reset — сдвинуть указатель ветки (soft, mixed, hard); stash — временно спрятать изменения; amend — изменить последний коммит; force-push — принудительно перезаписать удалённую ветку (force-push with lease — безопасный вариант). Conflict — конфликт слияния, to resolve a conflict — разрешить; conflict markers — метки <<<<<<<, =======, >>>>>>>; ours и theirs — «наша» и «их» стороны конфликта, значение которых меняется при rebase. Diff — разница, hunk — фрагмент диффа, patch — файл с изменениями. Tag — метка версии, annotated tag — тег с сообщением. Blame — построчная история авторства. Bisect — бинарный поиск коммита, который сломал поведение. Submodule — вложенный репозиторий. Worktree — дополнительная рабочая копия.
Как произносится
Rebase /ˌriːˈbeɪs/ («ри-бЕйс»), squash /skwɒʃ/ («сквош», не «скваш»), cherry-pick /ˈtʃɛri pɪk/, merge /mɜːrdʒ/, conflict /ˈkɒnflɪkt/ (существительное, ударение на первый слог), resolve /rɪˈzɒlv/, revert /rɪˈvɜːrt/, reset /ˌriːˈsɛt/, stash /stæʃ/, amend /əˈmɛnd/, fast-forward /ˌfɑːst ˈfɔːrwərd/, upstream /ˈʌpstriːm/, origin /ˈɒrɪdʒɪn/ (ударение на первый слог, «Ориджин»), detached /dɪˈtætʃt/, hunk /hʌŋk/, bisect /ˈbaɪsɛkt/, blame /bleɪm/, submodule /ˈsʌbmɒdjuːl/, worktree /ˈwɜːrktriː/.
Как употребляется
- Branch off master, and rebase before opening the PR. — Ответвись от master и сделай rebase перед PR.
- We squash-merge everything, so don't worry about the commit history in the branch. — Мы всё сливаем со сжатием, история в ветке не важна.
- Cherry-pick the fix onto the release branch. — Перенеси фикс на релизную ветку.
- I've got a conflict in
package-lock.json; I'll take theirs. — Конфликт в lock-файле, беру их версию. - Don't force-push to shared branches. — Не делай force-push в общие ветки.
- Reset hard to origin/master and start over. — Сбрось до origin/master и начни заново.
- Let's bisect to find which commit broke the build. — Найдём бинарным поиском коммит, сломавший сборку.
- You're in detached HEAD state; check out a branch first. — Ты в состоянии detached HEAD, сначала переключись на ветку.
Ловушки
Первая ловушка — merge и rebase как синонимы «объединить»: результат разный, и на вопрос did you merge or rebase? нужно отвечать точно. Вторая — ours и theirs при rebase: во время rebase «ours» это ветка, на которую перебазируют, а не ваша ветка; это сбивает даже опытных. Третья — revert и reset: revert создаёт новый коммит и безопасен для общих веток, reset переписывает историю. Четвёртая — «залить» и «запушить»: push это отправка коммитов, upload для файлов; «залить ветку» — push the branch. Пятая — checkout в двух смыслах: переключение на ветку и восстановление файла; в новых версиях Git их разделили на switch и restore. Шестая — master и main: с 2020 года GitHub по умолчанию создаёт main, и в международных проектах фраза push to master может вызвать вопрос, какая ветка имеется в виду.