Как перейти к определенной фиксации с помощью 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
эта конкретная ветвь.