Я хочу отменить изменения, внесенные конкретным коммитом только в данный файл.
Могу ли я использовать для этого команду git revert?
Любой другой простой способ сделать это?
git
version-control
revert
Лакшман Прасад
источник
источник
Ответы:
Самый чистый способ, который я видел, описан здесь.
Подобно ответу VonC, но с использованием
git show
иgit apply
.источник
fatal: unrecognized input
-3
флаг в git apply для трехстороннего слияния, когда патч не работает, так как я обычно исправляю изменение немного назад во времени.some_file.c
включает в себя путь к файлу , если есть один в противном случае вы не будете молча заплаты ничего :)Предполагая, что можно изменить историю фиксации, вот рабочий процесс для отмены изменений в одном файле в более ранней фиксации:
Например, вы хотите отменить изменения в 1 файле (
badfile.txt
) при фиксацииaaa222
:Сделайте повторную базу на базовом коммите, исправьте фиксацию проблемы и продолжите.
1) Запустите интерактивную перебазировку:
2) Отметьте фиксацию проблемы для редактирования в редакторе, изменив
pick
наe
(для редактирования):3) Отменить изменения в плохой файл:
4) Добавьте изменения и исправьте фиксацию:
5) Завершите перебазирование:
источник
edit
не отображались как измененные. Но онgit show -- badfile.txt | git apply -R
дал нужный мне ответ <3git revert
для всего содержимого файла в коммитах.Для одного файла вы можете написать сценарий :
(Из утилит git-shell-scripts от smtlaissezfaire )
Примечание:
здесь описан другой способ, если вы еще не зафиксировали текущую модификацию.
git checkout
имеет несколько параметров для файла, изменение файла из HEAD, перезапись вашего изменения.Dropped.on.Caprica упоминает в комментариях :
источник
git revert-file <hash> <file-loc>
и вернуть этот конкретный файл. Я отказался от этого ответа (хотя мне пришлось внести пару изменений, чтобы работать правильно). Вы можете найти копию моего.gitconfig
и отредактированного сценария здесь: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438Я бы просто использовал
--no-commit
опцию,git-revert
а затем удалил файлы, которые вы не хотите возвращать из индекса, прежде чем окончательно зафиксировать его. Вот пример, показывающий, как легко вернуть только изменения в foo.c во второй по времени фиксации:Сначала
git-reset
"деактивирует" все файлы, чтобы затем мы могли добавить обратно только один файл, который мы хотим вернуть. Финалgit-reset --hard
избавляется от оставшихся возвратов файлов, которые мы не хотим сохранять.источник
Гораздо проще:
затем
а потом
файл исчез, а хеш фиксации, сообщение и т. д. остались прежними.
источник
git checkout -- path/to/file/to/revert
шаг? Кроме того, неверно, что после этого хеш остается прежним, верно? Последнее предложение могло бы быть лучше, чем-то вроде: «В результате последняя фиксация заменяется новой, которая отличается только тем, что она не содержит изменений в возвращенном файле».Приведенная выше команда выведет файл из фиксации, но отразится в
git status
.Приведенная выше команда отменит изменения (в результате вы получите такой же файл, как HEAD).
(Пройдите,
--amend
чтобы изменить фиксацию.)При этом файл, который уже находится в фиксации, удаляется и возвращается.
Вышеуказанные шаги должны выполняться из ветки, в которой сделан коммит.
источник
Вы можете выполнить эту процедуру:
git revert -n <*commit*>
(-n
отменить все изменения, но не фиксировать их)git add <*filename*>
(имя файла / ов, которые вы хотите отменить и зафиксировать)git commit -m 'reverted message'
(добавить сообщение для возврата)источник
Если вы хотите сбросить изменения в файле из вашего последнего коммита, я обычно использую это. Думаю, это простейшее решение.
Обратите внимание, что файл будет добавлен в область подготовки.
Надеюсь, поможет :)
источник