Если ваш коммит НЕ последний, сделанный в ветке
1) Cherry-выбрать весь коммит, из которого вы хотите только часть, с опцией -n
(дляпредотвратите его фактическую фиксацию в ветке и просто импортируйте изменения из , которые фиксируют)
git cherry-pick -n abc123
2) Избавьтесь от ненужных частей, вернув их в состояние доcherry-picking:
git checkout -- path/to/file1 path/to/file2
3) Завершите операцию простым коммитом
git commit -m "Cherry-picked abc123 (only took such and such part)"
Если ваш коммит последний из сделанных на ветке
Пример дерева:
A--B--C<<<master<<<HEAD
C
- это коммит, который вы хотите изменить.
1) Вернитесь к точке непосредственно перед этим коммитом с помощьюgit reset
(--mixed
- режим по умолчанию), чтобы сохранить ваши изменения в рабочем дереве, но не в индексе
git reset B
2) Добавьте только часть "не для выбора" исделать коммит
git add path/to/file1 path/to/file2
git commit -m "some message here"
(в качестве sidenote здесь, если в файле есть и нежелательные изменения и , вы можете выборочно добавлять чанкис git add -p
, см. doc )
3) Затем добавьте часть, которую нужно выбрать из вишни, и сделайте еще один коммит.(то же самое, что и выше, с добавлением соответствующих частей)
Это переписает недавнюю историю ветки, поэтому, если вы уже выдвинули коммит, который хотите разделить, вам придется согласиться с вашими коллегами позаблаговременно эту операцию, затем нажмите ее с --force
на пульте, чтобы заменить память о плохом коммите (очевидно, если вы не один на репо).