Миграция фиксирует из другой ветви, без общего родителя - PullRequest
2 голосов
/ 26 сентября 2011

У меня есть репозиторий, который был создан просто путем проверки исходной версии в какой-то момент.Я знаю точный коммит, с которого он пришел.

Есть ли сейчас простой способ объединить оставшиеся коммиты?Как я могу сделать «объединить все после xyz», не обращая внимания на отсутствующую общую историю перед тем коммитом?

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011

git format-patch ancestor..HEAD в исходном репо и git am в целевом репо, вероятно, будут работать.

1 голос
/ 26 сентября 2011

Одним из вариантов здесь может быть перебазирование вашей работы поверх текущей HEAD репозитория, из которого вы разветвились.

Что делает git rebase, так это обратная ветвь вашей ветки к общему предку, затем быстрая- переадресация всех новых коммитов на ветку, против которой вы перебазируете, и, наконец, пытается применить каждый из ваших коммитов по очереди, пока у вас не появится линейная история, включающая все из другой ветки, а затем всю вашу собственную работу.

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

Учитывая это предостережение, вы сделаете следующее:

git remote add source git://host.that.has.source/repo 
git fetch source
git rebase source/master

Я сделал несколько предположений здесь.

  • что у вас есть доступ к исходному хранилищу: вам нужно импортировать все коммиты, так как вы сделали свою оригинальную ветку, чтобы это работало.

  • То, что вы хотите идти в ногу с главной ветвью этого репозитория: если вы хотите использовать другую ветку, замените слово «master» именем удаленной ветки, с которой вы хотите перебазировать (git branch -r, чтобы увидеть их все).

Примечание. Когда вы запускаете команду rebase, вы можете столкнуться с ситуациями, когда вам нужно разрешать конфликты: делайте это обычным способом.

В случае коммита, который вы упомянули в комментариях, который был ранее выбран или объединен и вызывает конфликты, можно с уверенностью предположить, что вышестоящая копия этого кода превосходит вашу версию: когда git пытаетсячтобы применить этот коммит и встретить ошибки, вы можете просто git reset --hard HEAD и затем git rebase --continue использовать их версию.

1 голос
/ 26 сентября 2011

Хорошим решением именно этой проблемы является использование механизма "прививки" в git, который предназначен для сшивания разных историй. Здесь есть какое-то объяснение:

... и хороший учебник здесь:

Как показывают эти ссылки, вы, вероятно, захотите использовать git filter-branch после добавления трансплантата, чтобы переписать вашу историю, позволяя другим людям клонировать всю историю, включая все, что было в нее добавлено. (Хотя это должно иметь обычные предупреждения о переписывании история.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...