Как переместить локальные неотправленные коммиты из поврежденного репозитория git в другой репозиторий?

Обычно я могу переместить отправленные коммиты в другой репозиторий, используя cherry-pick: я fetch связанную ветку из «другого» репозитория в мое новое репо и cherry-pick с идентификатором коммита.

Я хочу сделать то же самое для локальных — неотправленных — коммитов в поврежденном репозитории (что-то пошло не так, и я не могу отправить свои изменения, но мне нужно переместить их в другое репо).

Есть ли способ cherry-pick коммитов из поврежденного репо в другое репо?

PS: Оба репозитория существуют на одной машине.


person likeachamp    schedule 01.03.2017    source источник


Ответы (3)


Еще один возможный метод.

cd repo1_path
git format-patch -1 <commit> --stdout > /tmp/xxx.patch
cd repo2_path
git checkout <branch>
git am /tmp/xxx.patch
person ElpieKay    schedule 01.03.2017
comment
означает ли это ‹commit› SHA? - person likeachamp; 01.03.2017
comment
@likeachamp да, тот, который вы хотите переместить. Это может быть ветка, тег или sha1, представляющий фиксацию. - person ElpieKay; 01.03.2017
comment
Удивительно! Поскольку мой старый репо поврежден, это идеальное решение для меня. - person likeachamp; 01.03.2017
comment
Можно ли указать диапазон дат для коммитов вместо того, чтобы выбирать один за другим? - person likeachamp; 01.03.2017
comment
@likeachamp да, есть несколько способов указать диапазон ревизий. -1 <commit> может быть -n commit, где n — положительное число. <commit1>..<commit2 тоже нормально. Например, A-B-C-D-E, -4 E означает BCDE. Как и A..E или B^..E. Но я боюсь, что диапазон дат не поддерживается git format-patch. Требуются дополнительные усилия для фильтрации или удаления нежелательных исправлений. - person ElpieKay; 02.03.2017

Вам просто нужно отправить коммиты из одного локального репо в другое локальное репо?

git remote add local /path/to/repo.git
git push local master
person jaredready    schedule 01.03.2017
comment
да, но не все из них. специфические. Я предполагаю, что смогу выбрать вишню после первого шага - person likeachamp; 01.03.2017
comment
Да, после первой команды вы можете обращаться с пультом как с другим пультом, потому что он ничем не отличается. - person jaredready; 01.03.2017
comment
Спасибо, я пропустил эту часть - person jaredready; 01.03.2017

Удаленные устройства не ограничены другой машиной: если у вас есть один репозиторий на /repo1, а другой на /repo2, вы можете копировать коммиты с repo1 на repo2, просто добавив repo1 в качестве удаленного на repo2, используя пути файловой системы:

cd /repo2
git remote add repo1 /repo1

Теперь вы можете совершать fetch, pull и cherry-pick коммитов с repo1 по repo2.

person Guildencrantz    schedule 01.03.2017
comment
есть ли способ выбрать вишню, не добавляя ее? один файл в .git/objects поврежден, поэтому я не могу добавить его в качестве удаленного или отправить свои изменения и т. д. - person likeachamp; 01.03.2017
comment
Нет, вы не можете сделать cherry-pick, если вы не можете добавить репо в качестве удаленного: лучше всего попробовать ответ @ElpieKay, чтобы экспортировать патч (фактически руководство cherry-pick). - person Guildencrantz; 01.03.2017