Git селективный отменить локальные изменения из файла

Я не думаю, что это возможно. Что вы можете сделать, это несколько компонентов, которые используют один и тот же обработчик событий. В основном, в вашем случае, объявите две кнопки и используйте один и тот же метод обработчика событий.

140
задан p.campbell 11 July 2009 в 00:51
поделиться

5 ответов

Вы можете сделать это напрямую с помощью git checkout -p . См. ответ Даниэля Штутцбаха ниже.


Старый ответ (до появления checkout -p ):

Вы можете сделать это следующим образом:

git add -i

(выберите скряга вы хотите сохранить)

git commit -m "tmp"

Теперь у вас есть фиксация только с теми изменениями, которые вы хотите сохранить, а остальные неустановлены.

git reset --hard HEAD

На этом этапе незафиксированные изменения были отброшены, поэтому у вас есть чистый рабочий каталог с изменения, которые вы хотите сохранить наверху.

git reset --mixed HEAD^

Это удаляет последнюю фиксацию ('tmp'), но сохраняет изменения в рабочем каталоге, неустановленными.

РЕДАКТИРОВАТЬ: заменено - soft на - смешанный , чтобы очистить промежуточную зону.

90
ответ дан 23 November 2019 в 22:41
поделиться

Re-reading the question, it sounds like you want to revert changes that are in your working tree and not changes that have been previously committed but some of the other answers make it sound like my reading may be wrong. Can you clarify?

If the changes are just in your working copy then the easiest way to do this is to stage the changes you want to keep with:

git add -i <file>

Then throw away the changes that you don't want to keep by checking out the index version:

git checkout -- <file>

Then unstage the changes if you don't want them staged yet:

git reset -- <file>

This recipe only reverts selected changes to the file (or files that you specify) and doesn't create any temporary commit that then needs reverting.

If you want to selectively apply only some of the changes made in previous commits then you can reset a file to a previous committed state first:

git reset <commit_before_first_unwanted_change> -- <file>

Then you can follow the previous recipe of git add -i to stage those changes that you want to keep, git checkout -- to throw away the unwanted changes and git reset -- to 'unstage' the changes.

1
ответ дан 23 November 2019 в 22:41
поделиться

Вы можете запустить git diff для файла, сохранить полученный diff, отредактировать его, чтобы удалить изменения, которые вы do хотите сохранить, а затем запустить это через патч -R , чтобы отменить оставшиеся различия.

git diff file.txt >patch.tmp
# edit patch.tmp to remove the hunks you want to keep
patch -R <patch.tmp
3
ответ дан 23 November 2019 в 22:41
поделиться

Похоже, вы хотите

 git revert --no-commit $REVSISON 

Затем вы можете использовать

 git diff --cached

, чтобы увидеть, какие изменения будут внесены перед фиксацией (например, возврат это просто фиксация в прямом направлении, которая воспроизводит обратное изменение в прошлом)

Если бы вы использовали чистый репозиторий Git, вы могли бы, в зависимости от ваших целей, использовать интерактивную перебазировку ( git rebase - i ), чтобы вернуться к фиксации, которая вам не понравилась, и отредактировать фиксацию задним числом, чтобы изменения, которые вам не нравятся, никогда не происходили, но это обычно только в том случае, если вы ЗНАЕТЕ , что вы никогда не хочу видеть это снова.

используйте интерактивную перебазировку ( git rebase -i ), чтобы вернуться к фиксации, которая вам не понравилась, и отредактируйте фиксацию задним числом, чтобы изменения, которые вам не нравились, никогда не происходили, но это обычно только в том случае, если вы ЗНАЙТЕ , что вы больше никогда не захотите его видеть.

используйте интерактивную перебазировку ( git rebase -i ), чтобы вернуться к фиксации, которая вам не понравилась, и отредактируйте фиксацию задним числом, чтобы изменения, которые вам не нравились, никогда не происходили, но это обычно только в том случае, если вы ЗНАЙТЕ , что никогда больше не захотите его видеть.

2
ответ дан 23 November 2019 в 22:41
поделиться

Я считаю, что вы можете сделать это проще всего с помощью:

git checkout -p <optional filename(s)>

Из справочной страницы:

  -p, −−patch 
Интерактивно выберите блоки в разнице между  {{1 }} (или индекс, если не указан) и рабочее дерево. Выбранные блоки 
затем применяются в обратном порядке к рабочему дереву (и, если 
  был указан, индекс). 
 
       This means that you can use git checkout −p to selectively discard
       edits from your current working tree.
305
ответ дан 23 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: