Отменить часть неиндексированных изменений в 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 только для отката изменений. Какие-нибудь лучшие методы?

393   7  
git

7 ответов:

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

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

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

$ git stash; git stash apply

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

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

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

git diff > patchfile

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

patch -R < patchfile

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

git checkout master -- path/to/file

для каждого файла, который вы хотите сбросить.

как о

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

когда я запускаю '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

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

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

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

Comments

    Ничего не найдено.