✅ Решения и разбор

⚡ Кратко

Ключевые команды: gt initgt create -a -m ×3 → gt log shortgt bottomgt modify -a.

Часть 1. Ответы на опрос

  1. trunk — основная ветка (main/master), от которой растут стеки. Задаётся один раз командой gt init.
  2. В стеке каждая логическая часть — это отдельная ветка и отдельный маленький PR, который ревьюится и вливается независимо. В одной большой ветке всё это — один гигантский дифф в одном PR.
  3. gt create [name] -a -m "msg": -a застейджит все изменения, ветка создаётся поверх текущей.
  4. После amend gt modify автоматически перестраивает (restack) все ветки выше по стеку на исправленный коммит.
  5. restack — перебазирование цепочки веток на актуальные вершины их родителей. Автоматически — после gt modify; вручную — gt restack.
  6. gt up — к потомку (вверх), gt down — к родителю (вниз); ещё gt top/gt bottom.
  7. Restack переписывает хеши коммитов, поэтому ветку нужно «перезаписать» на remote — это force-push. Для личных feature-веток стека это безопасно, ведь на них никто не основывается, кроме вашего же стека.
  8. gt sync подтягивает свежий main (уже с влитой нижней веткой), перебазирует оставшийся стек и предлагает удалить локальную ветку влитого PR.

Часть 2. Собрать стек — эталон

gt init                      # trunk: main

echo "header" > header.txt
gt create feat/header -a -m "feat: add header"

echo "body" > body.txt
gt create feat/body -a -m "feat: add body"

echo "footer" > footer.txt
gt create feat/footer -a -m "feat: add footer"

gt log short
# ◉ feat/footer  (current)
# ◯ feat/body
# ◯ feat/header
# ◯ main

Часть 3. Правка нижней ветки — эталон

gt bottom                    # на feat/header
echo "header v2" > header.txt
gt modify -a                 # amend + авто-restack
# ✓ Restacked feat/body
# ✓ Restacked feat/footer

Вывод со строками Restacked … подтверждает, что верхние ветки перестроены на исправленную нижнюю.

Часть 4. На подумать

  1. В чистом Git — 3 ручных git rebase (каждую из трёх веток выше нужно перебазировать по очереди). В Graphite — один gt modify -a (или gt restack).
  2. В стек включаются ветки, которые gt submit force-push'ит. main — общая ветка команды; force-push в неё перепишет общую историю и сломает работу всем. Поэтому trunk никогда не входит в отправляемый набор.
⚠️ Проверить по документации. Вывод команд приведён схематично. На вашей версии формат может отличаться — ориентируйтесь на смысл, сверяйтесь с gt --help.