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

106

В git, если в моем индексе есть несколько фрагментов из одного файла, как я могу отключить один из них в интерактивном режиме?

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

Эндрю Гримм
источник

Ответы:

137

Попробуйте git reset --patch filename; git add --patchсогласно документации, это должно делать противоположное . Краткая форма -pтакже работает для обеих команд.

Осмунд Эльдхусет
источник
Не думаю, что в моей версии он есть (это 1.6.3.3), но похоже, что это правильный ответ.
Эндрю Гримм
2
В этом случае (и при условии, что вы не можете git stash save --keep-indexвыполнить обновление по какой-либо причине), я предлагаю вам использовать для сохранения и сброса изменений текущей рабочей копии. Затем вы можете сбросить свой файл и отменить изменения, которые вам не нужны. Если вы сначала скопируете файл во временное место, вы можете использовать его diffдля сохранения отмененных изменений. Затем вы можете снова добавить файл (нет необходимости в интерактивном добавлении, поскольку вы спрятали другие изменения, которые вас не интересовали). Используйте, git stash popчтобы вернуть старые изменения и diffприменить отмененные вами изменения. Довольно громоздко ... :-(
Осмунд Элдхусет 04
The short form -p also works for both commands... Вы имеете в виду git reset -p filename?
Наваз
1
@Nawaz: Это правильно - git add -p filenameвыборочно этапы изменения из этого файла и git reset -p filenameвыборочно отменяют изменения. Также есть git checkout -p -- filename, что позволяет выборочно отменять изменения из файла. Предупреждение: каждый из addи resetможет использоваться для отмены другого из двух, но если вы используете эту форму для отмены checkoutизменения, вы не сможете вернуть его.
Осмунд Эльдхусет,
2

git guiимеет приличный графический интерфейс для интерактивной постановки или отмены фрагментов или строк. Есть более красивые / лучшие клиенты с графическим интерфейсом, но они git guiлегкие, встроенные и кроссплатформенные (lin, win, mac).

https://git-scm.com/docs/git-gui

Просто щелкните правой кнопкой мыши кусок, чтобы включить / выключить сцену. Для линий сначала выделите линии, затем щелкните правой кнопкой мыши.

Wisbucky
источник
-1

GitX имеет приятный пользовательский интерфейс для отключения фрагментов файла: введите описание изображения здесь

Официальный клиент некоторое время не поддерживался, но в некоторых кругах популярна вилка на GitHub с большим количеством функций. ( сообщение в блоге об этом )

Джон Даутат
источник
1
Для пользователей Windows Git Extensions имеет не менее приятный интерфейс.
Осмунд Эльдхусет
4
То же самое и со встроенным git gui, за исключением того, что я не уверен, что использовал бы слово "хороший";)
MatrixFrog
1
SourceTree (Windows + Mac) также имеет для этого приятный интерфейс.
chrnola
Теперь я должен упомянуть о более поздних графических клиентах Git - GitKraken прекрасен и поддерживает это (хотя теперь за него взимается изрядная плата за коммерческое использование). GitHub Desktop от GitHub бесплатен, красив и поддерживает простую постановку и отключение фрагментов. GitKraken и GitHub Desktop являются кроссплатформенными, но ни один из них не является открытым.
jdgregson