Я хочу отменить изменения, внесенные конкретным коммитом только в данный файл.
Могу ли я использовать для этого команду git revert?
Любой другой простой способ сделать это?
Я хочу отменить изменения, внесенные конкретным коммитом только в данный файл.
Могу ли я использовать для этого команду git revert?
Любой другой простой способ сделать это?
Ответы:
Самый чистый способ, который я видел, описан здесь.
git show some_commit_sha1 -- some_file.c | git apply -R
Подобно ответу VonC, но с использованием git show
и git apply
.
fatal: unrecognized input
-3
флаг в git apply для трехстороннего слияния, когда патч не работает, так как я обычно исправляю изменение немного назад во времени.
some_file.c
включает в себя путь к файлу , если есть один в противном случае вы не будете молча заплаты ничего :)
Предполагая, что можно изменить историю фиксации, вот рабочий процесс для отмены изменений в одном файле в более ранней фиксации:
Например, вы хотите отменить изменения в 1 файле ( badfile.txt
) при фиксации aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Сделайте повторную базу на базовом коммите, исправьте фиксацию проблемы и продолжите.
1) Запустите интерактивную перебазировку:
git rebase -i aaa111
2) Отметьте фиксацию проблемы для редактирования в редакторе, изменив pick
на e
(для редактирования):
e aaa222
pick aaa333
3) Отменить изменения в плохой файл:
git show -- badfile.txt | git apply -R
4) Добавьте изменения и исправьте фиксацию:
git add badfile.txt
git commit --amend
5) Завершите перебазирование:
git rebase --continue
edit
не отображались как измененные. Но он git show -- badfile.txt | git apply -R
дал нужный мне ответ <3
git revert
для всего содержимого файла в коммитах.
Для одного файла вы можете написать сценарий :
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
(Из утилит git-shell-scripts от smtlaissezfaire )
Примечание:
здесь описан другой способ, если вы еще не зафиксировали текущую модификацию.
git checkout -- filename
git checkout
имеет несколько параметров для файла, изменение файла из HEAD, перезапись вашего изменения.
Dropped.on.Caprica упоминает в комментариях :
Вы можете добавить псевдоним к git, чтобы вы могли сделать это
git revert-file <hash> <file-loc>
и восстановить этот конкретный файл.
Смотрите в этом суть .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
git revert-file <hash> <file-loc>
и вернуть этот конкретный файл. Я отказался от этого ответа (хотя мне пришлось внести пару изменений, чтобы работать правильно). Вы можете найти копию моего .gitconfig
и отредактированного сценария здесь: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
Я бы просто использовал --no-commit
опцию, git-revert
а затем удалил файлы, которые вы не хотите возвращать из индекса, прежде чем окончательно зафиксировать его. Вот пример, показывающий, как легко вернуть только изменения в foo.c во второй по времени фиксации:
$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD
Сначала git-reset
"деактивирует" все файлы, чтобы затем мы могли добавить обратно только один файл, который мы хотим вернуть. Финал git-reset --hard
избавляется от оставшихся возвратов файлов, которые мы не хотим сохранять.
Гораздо проще:
git reset HEAD^ path/to/file/to/revert
затем
git commit --amend
а потом
git push -f
файл исчез, а хеш фиксации, сообщение и т. д. остались прежними.
git checkout -- path/to/file/to/revert
шаг? Кроме того, неверно, что после этого хеш остается прежним, верно? Последнее предложение могло бы быть лучше, чем-то вроде: «В результате последняя фиксация заменяется новой, которая отличается только тем, что она не содержит изменений в возвращенном файле».
git reset HEAD^ path/to/file/to/revert/in/commit
Приведенная выше команда выведет файл из фиксации, но отразится в git status
.
git checkout path/to/file/to/revert/in/commit
Приведенная выше команда отменит изменения (в результате вы получите такой же файл, как HEAD).
git commit
(Пройдите, --amend
чтобы изменить фиксацию.)
git push
При этом файл, который уже находится в фиксации, удаляется и возвращается.
Вышеуказанные шаги должны выполняться из ветки, в которой сделан коммит.
Вы можете выполнить эту процедуру:
git revert -n <*commit*>
( -n
отменить все изменения, но не фиксировать их)git add <*filename*>
(имя файла / ов, которые вы хотите отменить и зафиксировать)git commit -m 'reverted message'
(добавить сообщение для возврата)