С помощью Git можно ли повторно применить ревизию предка?
Скажем, у меня есть версия A, которая давно и сделала желаемое изменение.
Затем, позже, у меня была ревизия B, которая делала много изменений в большом количестве файлов, включая удаление A.
Теперь, намного позже, я хочу повторно применить ревизию A. Есть ли хороший способ сделать это? Команды слияния и вишни, похоже, пропускают ревизии, которые являются предками, и я не вижу никаких флагов, чтобы игнорировать родословную.
Всегда есть diff/apply, но действительно ли это лучший способ? Похоже, что это может быть "потеряно" (проходя через формат промежуточного патча) и может не позволить git использовать все инструменты, которые обычно находятся в его распоряжении... но это неосведомленная догадка с моей стороны.
Ответы
Ответ 1
git cherry-pick A
сделает именно то, что вы хотите. Он не смотрит на родословную - он смотрит только, какие изменения уже были применены.
Вот пример:
git cherry-pick A
git cherry-pick A
git cherry-pick A
создаст только одну новую фиксацию (самое большее). Вторая и третья команды не являются операциями, так как изменения A
уже применяются. Тем не менее,
git cherry-pick A
git cherry-pick B
git cherry-pick A
git cherry-pick B
создаст четыре новых коммита. Первый и третий коммиты будут делать то же самое, а второй и четвертый возвратят первый и третий (даже если commit B
сделал другие изменения, чем возврат A
). Другими словами, это то же самое, что
git cherry-pick A
git revert --no-edit HEAD
git revert --no-edit HEAD
git revert --no-edit HEAD
Надеюсь, что это поможет.
Ответ 2
Вы можете использовать git checkout $REVISION, чтобы вернуться к своей версии (Commit). Затем вам нужно создать новую ветку.
git.cmd branch YOURCOMMIT
Вы можете использовать кирку, чтобы получить коммиты, необходимые для вашей новой ветки.