Как перейти к определенной фиксации с помощью Git-поддерева?

Я с помощью Git-поддерево Эйвери Pennarun, которая представляет собой расширение для Git.

Как выбрать фиксацию из суб-РЕПО в мое основное РЕПО с помощью поддерева git? Также как я могу идти на определенный коммит в истории суб-РЕПО после того, как я уже сделал в Git поддерево тянет на этот префикс?

Я в первую очередь запускаю это в режиме коммитов squash.

1 ответов


как перейти к конкретной фиксации в истории суб-РЕПО?

если вы раздавили коммиты, то нет никакого способа, так как сквош теряет различные коммиты.

в противном случае с не раздавленным поддеревом вы можете перейти к любой фиксации поддерева с тем же хэшем, что и в исходном репозитории, из которого было создано поддерево.

git subtree (без сквоша) фактически добавляет в ваш репозиторий все соответствующие коммиты из внешнего репозитория в качестве независимого дерева в текущем РЕПО. Когда вы делаете git subtree add вы можете заметить, что добавлены несколько коммитов (все исходные коммиты из внешнего РЕПО) и последний коммит слияния, который перемещает содержимое из этого поддерева в заданный каталог, указанный с помощью . Короче говоря, он проверяет ветвь из другого несвязанного репозитория, а затем объединяет ее в текущую ветвь, перемещая все это содержимое в учитывая вложенную папку.

все это означает, что история внешнего РЕПО доступна для вас, вы можете проверить его так же, имея в виду, что, будучи совершенно другим деревом, эта проверка, вероятно, изменит все содержимое вашего рабочего пространства, которое на больших проектах может быть длительным.

это перемещает нас ко второму:

Как выбрать фиксацию из суб-РЕПО в мое основное РЕПО с помощью git поддерево?

кажется, что нет текущего "cherrypicking" поддерживается git subtree на себя. Но, учитывая последствия всего вышесказанного, можно сделать следующее.

# move yourself to the subtree commit of your choice
git checkout <subtree-hash>

# fetch commits from the subtree repository, to have available the commit you want
# to cherry pick.
git fetch <path-to-remote>

# cherry pick the hash you want
git cherry-pick <cherry-hash>

# move back to your original branch
git checkout <your-branch>

# subtree merge your cherry pick (using the previous HEAD),
# so that it gets moved to the correct location specified by prefix.
git subtree merge --prefix <subtree-prefix> HEAD@{1}

# Since you probably fetched more commits that you needed from
# the remote, you might want to clean those that where not needed
git gc

примите во внимание, что после этого, если вы попытаетесь git subtree pull в ваше поддерево обновление, и оно включает в себя фиксацию, которую вы выбрали, вы закончите конфликтом, так как у вас будет два изменения в одном месте.

еще более простой вариант, если у вас есть доступ к исходному репозиторию поддерева, заключается в том, чтобы сделать вишневый выбор там в ветке, а затем просто git subtree pull эта конкретная ветвь.