Отменить часть неустановленных изменений в git

Как мне отменить части моих неустановленных изменений в git, но сохранить остальные как нестационарные? Я понял, что:

git commit --interactive
# Choose the parts I want to delete
# Commit the changes
git stash
git rebase -i master # (I am an ancestor of master)
# Delete the line of the most recent commit
git stash apply

Это работает, но было бы неплохо, если бы что-то вроде git commit --interactive было только для исправления изменений. Любые лучшие методы?

Ответ 1

Вы можете использовать git checkout -p, который позволяет вам выбирать отдельные куски из разницы между вашей рабочей копией и индексом для возврата. Аналогично, git add -p позволяет вам выбирать элементы для добавления в индекс, а git reset -p позволяет выбирать отдельные фрагменты из разницы между индексом и HEAD для возврата из индекса.

$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .

Если вы хотите сделать снимок своего репозитория git заранее, чтобы сохранить эти изменения, прежде чем возвращать их, мне нравится делать:

$ git stash; git stash apply

Если вы часто это используете, вам может понадобиться псевдоним:

[alias]
    checkpoint = !git stash; git stash apply

Возвращение отдельных hunks или линий может быть еще проще, если вы используете хороший режим редактора или плагин, который может обеспечить поддержку для выбора строк, которые нужно вернуть, так как -p может быть немного неуклюжим для использования иногда. Я использую Magit, режим Emacs, который очень полезен для работы с Git. В Magit вы можете запустить magit-status, найти различия для изменений, которые хотите вернуть, выбрать строки, которые вы хотите вернуть (или просто поместить курсор на куски, которые вы хотите отменить, если вы хотите вернуть ханк на время вместо строки за раз) и нажмите k, чтобы вернуть эти конкретные строки. Я настоятельно рекомендую Magit, если вы используете Emacs.

Ответ 2

git diff > patchfile

Затем отредактируйте файл патча и удалите части, которые вы не хотите отменять, а затем:

patch -R < patchfile

Ответ 3

Вы могли бы сделать

git checkout master -- path/to/file

Для каждого файла, который требуется reset.

Ответ 4

Как насчет

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

Ответ 5

Когда я запускаю 'git status', он говорит:

$ git status
# On branch fr/fr.002
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   makefile
#
no changes added to commit (use "git add" and/or "git commit -a")
$

Итак, чтобы отменить неустановленные изменения, он говорит мне запускать:

git checkout -- makefile

Ответ 6

вы можете сделать git checkout и дать ему имена имен частей, которые вы хотите отменить.

Ответ 7

Ответ Брайана Кэмпбелла разрушает мой git, версия 1.9.2.msysgit.0, по неизвестным причинам, поэтому мой подход заключается в том, чтобы сценические куски, которые я хочу сохранить, отменить изменения в рабочей копии, а затем отключить.

$ git add -p
   ... select the hunks to keep
$ git checkout -- .
$ git reset HEAD .