Можно ли отменить только один файл или определенные изменения в файле в многофайловой фиксации?
Полная история, которую я передал кучу файлов. Через несколько коммитов кто-то, кто останется безымянным (JACK !!!), скопировал файл в свой репозиторий и зафиксировал несколько файлов, перезаписав некоторые изменения, которые я сделал. Я хочу отменить один файл, который был забит или еще лучше, зайти и отменить два изменения в этом файле. Это должен быть отдельный возвратный коммит, так как он был извлечен.
--3way
приводит к конфликтам слияния вместо того, чтобы не применять патчи.Ответы:
Вы можете отменить коммит, не создавая новый, добавив параметр --no-commit. Это оставляет все возвращенные файлы в области подготовки. Оттуда я выполнил бы мягкий сброс и добавил бы изменения, которые я действительно хотел. Для примера рабочего процесса:
источник
git add -p
можете запустить интерактивный сеанс, который позволяет выборочно добавлять куски файлов вместо целых файлов. (Также естьgit reset -p
выборочно нестандартные изменения. Полезно знать, но, вероятно, не то, что вы хотите в этом сценарии.)revert
,reset
,stash -p
(заначка «отменяет , что я не хочу , чтобы actualy марки»),add
остальные,commit
Вы можете в интерактивном режиме применить старую версию файла с помощью
checkout
команды.Например, если вы знаете,
COMMIT
куда был удален код для добавления, вы можете выполнить следующую команду:Git предложит вам добавить фрагменты, отсутствующие в текущей версии файла. Вы можете использовать
e
для создания патча изменения, прежде чем применить его обратно.источник
git checkout -p path/to/file
Вы можете просто вручную проверить старое, хорошее содержимое файлов, которые вы хотите восстановить, используя
git checkout
. Например, если вы хотите вернутьсяmy-important-file
к версии, которая была в версииabc123
, вы можете сделатьТеперь у вас есть старое содержимое
my-important-file
назад, и вы можете даже отредактировать его, если захотите, и выполнить коммит как обычно, чтобы сделать коммит, который вернет сделанные им изменения. Если есть только некоторые части его коммита, которые вы хотите вернуть, используйте,git add -p
чтобы выбрать только несколько фрагментов из патча, который вы делаете.источник
revert
, вы просто забираете старую версию файла. Правильноеrevert
удаление удалит неверные изменения фиксации в файле, даже если он был изменен несколько раз после этой неудачной фиксации, и вы не хотите терять эти модификации.git checkout -p
.Я нашел способ сделать это в списке рассылки Git:
Источник: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406
вариации
Эта команда не выполняется (не вызывает изменений), если исправление не применяется корректно, но
--3way
вместо этого вы получаете конфликты, которые затем можно разрешить вручную (в этом случае ответ Кейси может быть более практичным):Вы также можете использовать это для частичного возврата нескольких коммитов, например:
вернуть файлы с изменениями, соответствующими
<string>
в любом коммите. Это именно то, что мне было нужно в моем случае использования (несколько отдельных коммитов внесли аналогичные изменения в разные файлы, а также изменили другие файлы несвязанными способами, которые я не хотел возвращать).Если вы
diff.noprefix=true
установили в свой,~/.gitconfig
то вам нужно добавить-p0
вgit apply
команду, например,источник
git show ... > foo.txt
(2) правку,foo.txt
чтобы удалить разногласия, которые я не хотел возвращать (3),git apply --reverse foo.txt
чтобы отменить разности, все еще перечисленные вfoo.txt
.