С помощью 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

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