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