Иногда бывает так: лезешь в историю, находишь нужный коммит — то ли баг там ещё не был завезён, то ли фича работала как надо — и хочешь от него ответвиться. Не от текущего HEAD, а именно от той точки. Задача простая, но вспоминается не сразу, поэтому записываю.
Самый короткий путь
Если нужно создать ветку и сразу на неё перейти:
|
1 |
git switch -c имя-ветки <commit-id> |
Всё. HEAD новой ветки будет смотреть ровно на этот коммит, вы на ней, можно работать.
Раньше все привыкли к checkout, и он всё ещё работает:
|
1 |
git checkout -b имя-ветки <commit-id> |
Разницы по результату никакой, просто switch появился позже именно для таких операций и читается понятнее.
Если переключаться пока не хочется
Бывает, что ветку надо просто завести
|
1 |
git branch имя-ветки <commit-id> |
Ветка создана, вы остаётесь там же, где были. Дальше уже git switch имя-ветки, когда понадобится.
Про сам хеш
<commit-id> — это может быть как полный хеш из сорока символов, так и сокращённый. Обычно хватает семи-восьми символов, главное чтобы он был однозначным. Если вдруг git ругнётся на неоднозначность — просто добавьте пару символов.
Отдельный случай: вы уже в detached HEAD
Частая ситуация. Вы сделали git checkout <commit-id> (без -b), посмотрели, что там внутри, и решили, что от этого места надо строить ветку. Тогда хеш уже не нужен — вы и так на нём:
|
1 |
git switch -c имя-ветки |
И всё. Ветка создастся от текущего положения HEAD, а он у вас как раз на нужном коммите.
Пара моментов, которые стоит держать в голове
Новая ветка будет содержать историю до указанного коммита включительно. Всё, что было закоммичено позже, в неё не попадёт — она как бы отрезана от основной линии в этой точке. Это обычно и нужно, но полезно помнить.