Вы можете использовать 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
Отмена отдельных фрагментов или строк может быть еще проще, если вы используете хороший режим редактора или плагин, который может обеспечить поддержку выбора строк для прямого возврата, что -p
иногда может быть немного неуклюжим для использования. Я использую Magit , режим Emacs, который очень полезен для работы с Git. В Magit вы можете запустить magit-status
, найти различия для изменений, которые вы хотите отменить, выбрать строки, которые вы хотите отменить (или просто навести курсор на блоки, которые вы хотите отменить, если вы хотите отменить блок за раз вместо линия за раз), и нажмите, k
чтобы отменить эти конкретные линии. Я настоятельно рекомендую Magit, если вы используете Emacs.
git checkout
также имеет-p
флаг, который делает именно то, что вы просили в одной команде. Извинения за предыдущий сложный набор шагов; Вы можете просто использоватьgit checkout -p
. Что касается сохранения, перед тем как сделать что-то потенциально разрушительное, я часто делаюgit stash; git stash apply
(или создаю псевдоним, который делает это какgit checkpoint
или что-то), чтобы записать текущее дерево в тайник, чтобы я мог вернуться к нему, если что-то пойдет не так.git commit -a -m "Backup Commit" --edit; git reset HEAD^
было бы лучше, потому что тогда это не испортило бы мое состояние тайника, которое я могу использовать для чего-то другого. Затем, если у вас есть SHA1, вы можете выбрать его в течение следующих 30 дней. --Edit позволяет вам добавить информацию к сообщению фиксации, чтобы помочь вам найти SHA1 позже, если вы этого хотите. С другой стороны, это испортило бы git reflog, поэтому я думаю, что это компромисс, основанный на том, что вы делаете.git checkout -p
не применять патчи к индексу, а только ставить их?Затем отредактируйте файл заплатки и удалите части, которые вы не хотите отменять, затем:
источник
patchfile
выглядит отлично в Vim, и это действительно помогает!git apply -R
вместоpatch
(просто чтобы остаться в рамках git или в отличие отpatch
недоступного события )patch: **** malformed patch at line 41: @@ -428,9 +443,9 @@ you should place your code here."
Вы могли бы сделать
Для каждого файла вы хотите сбросить.
источник
Как насчет
git add -p
для добавления только тех изменений, которые вы хотите внести в индекс.источник
Когда я запускаю «git status», он говорит:
Итак, чтобы отменить неустановленные правки, он говорит мне:
источник
Ответ Брайан Кэмпбелл выходит из строя мой мерзавца, версия 1.9.2.msysgit.0, по неизвестным причинам, так что мой подход к стадии Hunks я хочу сохранить, Сбросьте изменения в рабочей копии, а затем убрать из буфера.
источник
git stash -p
. Вы могли бы сделатьgit stash -p; git reset --hard; git stash pop
. Это практически то же самое, что вы делаете, за исключением того, что вам не нужно писать сообщение коммита.Вы можете сделать
git checkout
и дать ему названия частей, которые вы хотите отменить.источник