Принцип Pigeonhole объясняет, почему то, что вы просите, невозможно в отношении уникальности.
Вы можете использовать git checkout -p
, который позволяет вам выбирать отдельные hunks из различия между вашей рабочей копией и индексом для возврата. Аналогичным образом, git add -p
позволяет вам выбирать отдельные hunks для добавления в индекс, а git reset -p
позволяет вам выбирать отдельные hunks из разницы между индексом и 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
может быть немного неудобно использовать иногда. Я использую -p, режим Emacs, который очень полезен для работы с Git'ом. В Magit'е можно запустить magit-status
, найти различия для изменений, которые нужно вернуть, выбрать линии, которые нужно вернуть (или просто навести курсор на те, которые нужно вернуть, если нужно вернуть подвеску за раз вместо линии за раз), и нажать k
, чтобы вернуть эти конкретные линии. Я настоятельно рекомендую Magit, если вы используете Emacs.
Как насчёт
git добавление -p
, чтобы добавить обратно только те изменения, которые вы хотите внести в индекс.Вы можете сделать
git checkout master -- path/to/file
Для каждого файла, который вы хотите сбросить.
.] Когда я запускаю "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 checkout
и дать ему названия частей, которые вы хотите отменить.