Как изменить источник слияния Git поддерева
У меня есть проект, где я слился с библиотекой, используя поддерево Git. Я подтолкнул несколько небольших изменений между библиотекой и проектом.
Позже был создан новый репозиторий, который является окончательным домом для библиотеки. По сути, он содержит ту же версию библиотечного кода, что и мой проект, возможно, с одним или двумя незначительными изменениями. По разным причинам он не делится какой-либо прямой историей Git с предыдущим домом библиотеки (это не клон предыдущей библиотеки).
Теперь я хочу изменить свой проект так, чтобы он вытягивал / выталкивал библиотеку из нового места. В первый раз, когда это происходит, мне также необходимо разрешить любые конфликты слияния, хотя в этом случае изменения тривиальны, и их можно будет просто переделать позже.
Каков наилучший способ сделать это?
Я попытался удалить, взяв копию библиотеки в моем проекте, затем удалив ее вместе со старыми пультами и ветками. Затем я попытался добавить поддерево и т.д. из нового местоположения. Кажется, это работает, но когда я пытаюсь вернуться из своего проекта в библиотеку, я получаю фатальную ошибку плохого объекта.
Я предполагаю, что в подходе, который я пробовал, есть недостаток - возможно, из-за отсутствия общей истории - но у меня нет достаточно глубокого понимания того, что происходит, чтобы знать, как это исправить, или что "правильный" подход к этой проблеме должен быть.
[обновление: отредактировал вопрос, чтобы сделать его немного яснее - это было немного двусмысленно]
3 ответа
Попробуйте клонировать новый проект. затем добавив свой как удаленный и делая
git remote update
Это подтянет все ссылки из вашего проекта. сейчас делаю
git cherry-pick <sha1>
Ша, что вы хотите в новом проекте. Это самый простой способ, я думаю.
Также вы должны знать, что git не требует общей истории (хотя это делает менее приятным объединение в первый раз) для объединения. так что вы можете просто делать то, что я сказал, и тогда вместо того, чтобы собирать вишню, вы можете объединить свою историю. вероятно, будут конфликты. Я предлагаю, как только вы начнете слияние (если вы это сделаете) использовать git mergetool
и знать, как использовать 3-х сторонний дифференциал.
Есть ли какая-то причина, по которой вы не ссылаетесь на свою библиотеку в качестве подмодуля вашего проекта?
(См истинную природу подмодулей)
Преимущество в вашем случае будет в том, как легко изменить адрес подмодуля.
Возможно, вам следует создать отдельную рабочую ветвь (или репозиторий) с вашей версией библиотеки (только дерево библиотеки с вашими изменениями), которую вы затем можете перенести в исходное хранилище библиотеки.
Итак, чтобы перейти к исходному удаленному репо, сначала подготовьте локально то, что, как вы ожидаете, будут отображаться как коммит удаленно; для этого могут быть разные рабочие процессы: либо во время работы над проектом вы сначала фиксируете изменения своей библиотеки в своей специальной локальной рабочей ветви, выделенной для библиотеки (эта ветвь должна наследовать исходную историю библиотеки), а затем объединяются эта ветка с библиотекой переходит в рабочую ветку вашего проекта (где библиотека является поддеревом) или объединяет ваши изменения из рабочей ветки проекта в выделенную рабочую ветку библиотеки. Затем вы можете перенести свою выделенную рабочую ветку в исходное удаленное хранилище, когда пожелаете.
Итак, по сути, сначала вы создаете локальную выделенную рабочую ветку, чтобы она наследовала исходную историю:
git branch MY_LIBFOO REMOTE_BRANCH_LIBFOO
(REMOTE_BRANCH_LIBFOO - это интересующая вас локальная удаленная ветвь, которая обновляется при помощи git fetch)
затем, следуя вашему рабочему процессу, убедитесь, что ваши изменения в библиотеке находятся в рабочей ветке MY_LIBFOO, а затем вы можете
git push original_libfoo MY_LIBFOO:TARGET_BRANCH_REMOTELY
Таким образом, есть четкое представление о том, что происходит.