Вернуть изменения в файл в коммите - PullRequest
83 голосов
/ 12 апреля 2010

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

Могу ли я использовать для этого команду git revert?

Есть ли другой простой способ сделать это?

Ответы [ 7 ]

144 голосов
/ 26 августа 2011

Самый чистый способ, который я когда-либо видел, описан здесь

git show some_commit_sha1 -- some_file.c | git apply -R

Аналогично ответу VonC, но с использованием git show и git apply.

24 голосов
/ 11 сентября 2015

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

Например, вы хотите отменить изменения в 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
19 голосов
/ 12 апреля 2010

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
12 голосов
/ 18 апреля 2010

Я бы просто использовал параметр --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 «unstages» всех файлов, так что мы можем затем добавить только один файл, который мы хотим вернуть. Финальный git-reset --hard избавляет от оставшихся файловых возвратов, которые мы не хотим сохранять.

5 голосов
/ 12 марта 2018
git reset HEAD^ path/to/file/to/revert/in/commit

Приведенная выше команда выведет файл из коммита, но будет отражена в git status.

git checkout path/to/file/to/revert/in/commit

Приведенная выше команда вернет изменения (в результате вы получите файл, аналогичный HEAD).

git commit

(Pass --amend для изменения коммита.)

git push

При этом файл, который уже находится в коммите, удаляется и возвращается.

Вы должны выполнить вышеприведенные шаги из ветки, в которой производится фиксация.

4 голосов
/ 19 мая 2017

Намного проще:

git reset HEAD^ path/to/file/to/revert

тогда

git commit --amend   

, а затем

git push -f

файл пропал и зафиксировал хеш, сообщение и т. Д. То же самое.

0 голосов
/ 09 апреля 2019

Вы можете выполнить эту процедуру:

  1. git revert -n <*commit*> (-n отменить все изменения, но не совершить их)
  2. git add <*filename*> (имя файла / ов, которые вы хотите восстановить и зафиксировать)
  3. git commit -m 'reverted message' (добавить сообщение для возврата)
  4. после фиксации изменения других файлов сохраняются обновляется с изменениями, которые вы сделали до возврата
...