Сброс или возврат определенного файла к определенной ревизии с помощью Git? - PullRequest
3989 голосов
/ 19 октября 2008

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

Я сделал git log вместе с git diff, чтобы найти нужную мне ревизию, но просто не знаю, как вернуть файл в прежнее состояние в прошлом.

Ответы [ 31 ]

10 голосов
/ 26 сентября 2013

git checkout ref | commitHash - filePath

например.

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar
8 голосов
/ 07 декабря 2016

Многие ответы здесь утверждают, что используют git reset ... <file> или git checkout ... <file>, но при этом вы потеряете все модификации на <file>, зафиксированные после коммита, который вы хотите отменить.

Если вы хотите отменить изменения из одного коммита только для одного файла, точно так же, как git revert, но только для одного файла (или, скажем, подмножества файлов коммитов), я предлагаю использовать как git diff, так и git apply вот так (с <sha> = хэш коммита, который вы хотите отменить):

git diff <sha>^ <sha> path/to/file.ext | git apply -R

По сути, он сначала сгенерирует патч, соответствующий изменениям, которые вы хотите отменить, а затем примените к нему патч в обратном порядке, чтобы удалить эти изменения.

Конечно, он не будет работать, если перевернутые строки были изменены любым коммитом между <sha1> и HEAD (конфликт).

8 голосов
/ 06 декабря 2011

Используйте git log, чтобы получить хеш-ключ для конкретной версии, а затем используйте git checkout <hashkey>

Примечание: не забудьте набрать хеш перед последним. Последний хеш указывает вашу текущую позицию (HEAD) и ничего не меняет.

7 голосов
/ 16 декабря 2011

Очевидно, что кто-то должен либо написать вразумительную книгу по git, либо git нужно лучше объяснить в документации. Столкнувшись с этой же проблемой, я догадался, что

cd <working copy>
git revert master

отменяет последний коммит, который, кажется, делает.

Ian

6 голосов
/ 23 августа 2018

если вы делаете неправильный файл в ваших последних коммитах, следуйте инструкциям:

  1. дерево с открытым исходным кодом, измените этот коммит

open source tree

  1. измените строки и найдите ваш коммит, который неверный файл отправил как коммит

enter image description here

  1. вы можете увидеть список ваших изменений в этом коммите list of files in the source tree
  2. выберите его, а затем нажмите ... кнопки справа ... щелкните обратный файл
  3. тогда вы можете увидеть его на вкладке статуса файла внизу слева затем нажмите нестандартно:

file status tab

  1. откройте код Visual Studio и вернитесь обратно, зафиксировав удаленные файлы
  2. после всех них вы можете увидеть результаты вашего последнего коммита в дереве исходных текстов

enter image description here

5 голосов
/ 06 февраля 2019
  1. Git вернуть файл к определенной фиксации

git checkout Last_Stable_commit_Number - fileName

2.Git вернуть файл в определенную ветку

git checkout branchName_Which_Has_stable_Commit fileName
4 голосов
/ 08 мая 2018

Вы можете сделать это в 4 шага:

  1. отменить весь коммит с файлом, который вы хотите специально отменить - это создаст новый коммит в вашей ветви
  2. программный сброс, который фиксирует - удаляет коммит и перемещает изменения в рабочую область
  3. вручную выберите файлы, чтобы восстановить и зафиксировать их
  4. удалить все остальные файлы в вашей рабочей области

Что нужно набрать в своем терминале :

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert> && git commit -m 'reverting file'
  4. git checkout .

удачи

4 голосов
/ 17 декабря 2008
git revert <hash>

Вернет данный коммит. Похоже, вы думаете, git revert влияет только на самый последний коммит.

Это не решит вашу проблему, если вы хотите отменить изменение в определенном файле, и эта фиксация изменила больше, чем этот файл.

3 голосов
/ 24 января 2019

Это очень простой шаг. Извлеките файл с требуемым идентификатором фиксации, здесь один идентификатор фиксации ранее, а затем просто выполните команду git commitmend.

# git checkout <previous commit_id> <file_name>
# git commit --amend

Это очень удобно. Если мы хотим вывести какой-либо файл с любым идентификатором предыдущей фиксации в верхней части фиксации, мы можем легко это сделать.

1 голос
/ 26 сентября 2017

Если вы используете Git Extensions и хотите вернуть только родительский коммит для файла, вы можете выбрать коммит, содержащий изменения, которые вы хотите отменить, затем выберите вкладку «Diff» в области сведений, щелкните правой кнопкой мыши файл, который вы хотите восстановить, затем «Сбросить файл (ы) в» ...., затем «A» (родитель)

...