Могу ли я интерактивно выбирать куски из другого git commit?

Я ищу точно такое же поведение, как

git add -i -p

Но вместо составления фиксации из моего рабочего каталога я хотел бы составить мой рабочий каталог из (частей) коммита. Как я могу это сделать?

Мой вариант использования состоит в том, что у меня есть несколько различных функций, которые сгруппированы вместе в одном коммите, и я бы хотел их протестировать один за другим.

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

Ответ 1

Использование cherry -p ick -n на самом деле неудовлетворительно, так как оставляет мне грязную работу по удалению всего ненужного кода. Мне бы очень хотелось выбрать выбранные изменения, которые я хочу протестировать.

git checkout --patch эта работа могла быть грязной, но с появлением git checkout --patch теперь вы можете выборочно отменить изменения, аналогично git add -p для добавления.

Ответ 2

Вы можете использовать git reset --mixed HEAD^1, чтобы вернуть индекс, затем выберите нужные вам hunks с помощью git add -i.

reset вернет индекс к предыдущему фиксации (по сути, не выполнив все, что было HEAD), но он не коснется рабочего дерева. Теперь вы можете скомпоновать нужные вам ханки, передать их и выбросить остальное с помощью git reset --hard HEAD.

Ответ 3

Основываясь на великолепном ответе Кэмерона Скиннера, я немного расширю его, чтобы включить случай, когда у вас есть ветвь с несколькими коммитами, возможно, слияния, возможно, много "шума", и вы хотите, чтобы вишня -p была только очень конкретные куски от этого. (что было именно то, что случилось со мной сегодня)

Следуй этим шагам:

git checkout source-branch
git checkout -b cherry-pick-branch # Gives you a new branch based on source-branch
git reset --mixed master

Это оставит вас с веткой, где все изменения находятся в файловой системе, но ничего не было зафиксировано/поставлено. Затем используйте git add -p чтобы выборочно добавить, какие части вы хотите поставить, а затем зафиксируйте и нажмите как обычно.