git selective возвращает локальные изменения из файла


в моем репозитории git, который отслеживает РЕПО svn, я сделал несколько изменений в одном файле.

теперь я хочу вернуть эти изменения (например, SVN revert), но только части файла.

Я хочу иметь возможность просматривать различия в файле, отбрасывать(возвращать) изменения, которые я не хочу, и сохранять изменения, которые я хочу.

the

git add -i 

команда, кажется, есть возможность сделать это, но я не хочу, чтобы этап это еще.

6 133

6 ответов:

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


старый ответ (перед checkout -p была введена):

вы можете сделать это так:

git add -i

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

git commit -m "tmp"

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

git reset --hard HEAD

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

git reset --mixed HEAD^

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

изменить: заменить --soft С --mixed, чтобы очистить плацдарм.

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

git checkout -p <optional filename(s)>

из manpage:

   −p, −−patch
       Interactively select hunks in the difference between the <tree−ish>
       (or the index, if unspecified) and the working tree. The chosen
       hunks are then applied in reverse to the working tree (and if a
       <tree−ish> was specified, the index).
       This means that you can use git checkout −p to selectively discard
       edits from your current working tree.

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

git diff file.txt >patch.tmp
# edit patch.tmp to remove the hunks you want to keep
patch -R <patch.tmp

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

 git revert --no-commit $REVSISON 

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

 git diff --cached

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

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

перечитывая вопрос, похоже, что вы хотите вернуть изменения, которые находятся в вашем рабочем дереве, а не изменения, которые были ранее совершены, но некоторые из других ответов заставляют его звучать так, как будто мое чтение может быть неправильным. Не могли бы Вы уточнить?

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

git add -i <file>

затем выбросьте изменения, которые вы не хотите сохранить, проверив версия индекса:

git checkout -- <file>

затем unstage изменения, если вы не хотите, чтобы они были организованы еще:

git reset -- <file>

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

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

git reset <commit_before_first_unwanted_change> -- <file>

после этого вы можете следовать предыдущий рецепт git add -i <file> на сцене те изменения, которые вы хотите сохранить, git checkout -- <file> чтобы выбросить нежелательные изменения и git reset -- <file> чтобы отменить добавление' изменения.

параметры командной строки, описанные в ответах здесь, удобны, когда файл находится на сервере, к которому я обращаюсь через SSH-терминал. Однако, когда файл находится на моей локальной машине, я предпочитаю следующий способ:

откройте файл в Редакторе netbeans (который поставляется с поддержкой git). Netbeans помещает красные/зеленые / синие метки в номера строк, чтобы указать, где материал был удален/добавлен / изменен (соответственно).

щелчок правой кнопкой мыши по любой из этих меток дает вам возможность отменить это изменение. Кроме того, вы можете щелкнуть правой кнопкой мыши по красным и синим меткам, чтобы найти старую версию во всплывающем окне.