У меня кот repo1
и repo2
на локальной машине. Они очень похожи, но последняя - это какая-то другая ветка ( repo1
больше не поддерживается).
/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X
Как применить изменения, сделанные фиксацией <some_sha>
вrepo1
к repo2
?
Мне нужно подготовить какой-то патч или можно сделать что-то cherry-pick
между репозиториями?
Как насчет того же, но для диапазона коммитов?
Ответы:
В качестве взлома вы можете попробовать изменить рецепт для сравнения коммитов в двух разных репозиториях на странице GitTips , то есть:
где
../repo
путь к другому репозиторию.В современном Git вы можете использовать несколько ревизий и диапазонов ревизий с помощью Cherry-Pick .
$(git --git-dir=../repo/.git rev-parse --verify <commit>)
Здесь , чтобы перевести<commit>
(напримерHEAD
, илиv0.2
, илиmaster~2
, которые являются значениями во втором хранилище скопированного с) в SHA-1 идентификатор фиксации. Если вам известен SHA-1 изменения, которое вы хотите выбрать, в этом нет необходимости.Обратите внимание, однако, что Git может пропускать копирование объектов из исходного репозитория, поскольку он не знает, что альтернативный репозиторий объектов является временным для одной операции. Возможно, вам потребуется скопировать объекты из второго репозитория с помощью:
Это помещает объекты, заимствованные из второго репозитория, в исходное хранилище репозитория.
Не проверено.
Не такое уж хитрое решение - следовать ответу knittl :
git format-patch
git am --3way
для применения патчейисточник
fatal: unable to read tree ...
но после того, какgit reset HEAD^
все работает нормально<commit>
ноrev-parse --verify
команде это не нравится, поскольку она принимает только одиночные значения фиксации. Но посколькуcherry-pick
принимает как одиночные, так и диапазонные значения фиксации, я спрашиваю: зачем этоrev-parse
нужно?git rev-parse
необходимо , если вы хотите обратиться к фиксации его реф на основе имени в другом хранилище, напримерmaster
,HEAD^^
или что - то в этом роде; rev-parse превращает его в универсальный идентификатор SHA-1.Вы, вероятно, захотите использовать,
git format-patch
а затемgit am
применить этот патч к своему репозиторию.Или в одной строке:
источник
GIT_ALTERNATE_OBJECT_DIRECTORIES
(это может повредить мой репозиторий).--ignore-whitespace
вgit am
команду может разрешить любые конфликты и избежать необходимости выполнять трехстороннее слияниеВы можете сделать это,
cherry-pick
если добавите второе репо в качестве удаленного к первому (а затемfetch
).источник
git fetch [remote-name]
во втором репо, а потомgit cherry-pick [sha1]
.cherry-pick
. Таким образом, даже если это может показаться «правильным», это не всегда наиболее практично.Я написал небольшой скрипт для применения вывода diff репо diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0
источник