Я хочу вернуть изменения, сделанные конкретной фиксацией только для данного файла.
Могу ли я использовать команду git revert для этого?
Любой другой простой способ сделать это?
Я хочу вернуть изменения, сделанные конкретной фиксацией только для данного файла.
Могу ли я использовать команду git revert для этого?
Любой другой простой способ сделать это?
Самый чистый способ, который я видел для этого, описан здесь
git show some_commit_sha1 -- some_file.c | git apply -R
Как и ответ VonC, но используя git show и git apply.
Предполагая, что можно изменить историю фиксации, здесь приведен рабочий процесс для отмены изменений в одном файле в более ранней фиксации:
Например, вы хотите отменить изменения в 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
git revert для всех файлов в пределах коммитов.
Для одного файла вы можете script it:
#!/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
Я бы просто использовал параметр --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/in/commit
Приведенная выше команда выведет файл из коммита, но это отразится в git status.
git checkout path/to/file/to/revert/in/commit
Приведенная выше команда вернет изменения (в результате вы получите файл, такой же, как HEAD).
git commit
(Передайте --amend чтобы изменить коммит.)
git push
При этом файл, который уже находится в коммите, удаляется и возвращается.
Вышеперечисленные шаги следует выполнить из ветки, в которой производится фиксация.
Гораздо проще:
git reset HEAD^ path/to/file/to/revert
затем
git commit --amend
а затем
git push -f
файл пропал, а хэш, сообщение и т.д. - то же самое.
Вы можете следовать этой процедуре:
git revert -n <*commit*> (-n все изменения, но не -n их)git add <*filename*> (имя файла/ов, которые вы хотите восстановить и зафиксировать)git commit -m 'reverted message' (добавить сообщение для возврата)