Как я могу сбросить или вернуть файл к определенной ревизии?

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

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

4114
задан MusTheDataGuy 25 July 2019 в 21:18
поделиться

14 ответов

Принятие хеша фиксации, которую Вы хотите, c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

контроль мерзавца страница справочника дает больше информации.

, Если Вы хотите вернуться к фиксации прежде c5f567, добавьте ~1 (работы с любым числом):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

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

5577
ответ дан Just a student 25 July 2019 в 21:18
поделиться

Обратите внимание, однако, что git checkout ./foo и git checkout HEAD ./foo не точно то же самое; рассматриваемый вопрос:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(Второе add этапы файл в индексе, но это делает не , фиксируются.)

Git checkout ./foo средства возвращаются, соединяют каналом ./foo от индекс ; добавление HEAD дает Мерзавцу команду возвращаться, которые соединяют каналом в индексе к HEAD пересмотр прежде, чем сделать так.

18
ответ дан George Stocker 25 July 2019 в 21:18
поделиться

Забавно, git checkout foo не будет работать, если рабочая копия будет в каталоге, названном foo; однако, и git checkout HEAD foo и git checkout ./foo будет:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo
36
ответ дан leiyc 25 July 2019 в 21:18
поделиться
  • 1
    @GlenPeterson Полагают, что неизменное значение снимок состояния в DB. Платформа неявно управляет связью с записями в DB. При сохранении обновленного значения оно видоизменяет соответствующие данные в DB вместо того, чтобы вставить дублирующиеся данные, как Вы подозревали. Вот документы о том, как это на самом деле достигается . – Nikita Volkov 1 October 2013 в 15:41
git checkout -- foo

, Который сбросит foo для ЗАГОЛОВКА. Вы можете также:

git checkout HEAD^ foo

для одного пересмотра назад, и т.д.

266
ответ дан Greg Hewgill 25 July 2019 в 21:18
поделиться
  • 1
    @user1671022 состояния JLS: " действия каждого потока в изоляции должны вести себя, как управляется семантикой того потока, за исключением того, что значения, замеченные каждым чтением, определяются моделью " памяти; = > другими словами, как только Вы начинаете читать совместно использованные значения, reoderings могут произойти, которые не делают необходимый, следуют правилам переупорядочения для единственного потока. Вместо того, чтобы говорить об инструкциях reodering, Вы могли сказать, что, когда то же общее значение читается дважды, witohut синхронизация, второе чтение может считать старое значение, в то время как первое чтение видит более свежее значение. – assylias 25 September 2012 в 14:42

Я должен включиться EasyGit здесь, который является оберткой для создания мерзавца более доступным новичкам, не смущая опытных пользователей. Одна из вещей, которые это делает, , дают больше значений git revert . В этом случае Вы просто сказали бы:

eg revert foo/bar foo/baz

20
ответ дан Aristotle Pagaltzis 25 July 2019 в 21:18
поделиться
  • 1
    You' ре, неправильное относительно NH: это поддерживает семантику объекта только для чтения, которая отличается от общего определения неизменного объекта. Думайте о наборах. – Alex Yakunin 23 April 2010 в 18:57
git revert <hash>

вернется данная фиксация. Это кажется, что Вы думаете git revert только влияние новая фиксация.

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

4
ответ дан Otto 26 July 2019 в 07:18
поделиться
  • 1
    Потрясающая идея со списками! К сожалению, это, кажется, приводит к ClassCastException, выходя RuntimeException... – Lukas Eder 25 September 2012 в 22:53

Я думаю, что находил его.... от http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Иногда, Вы просто хотите возвратиться и забыть о каждом изменении мимо определенного момента, потому что они неправы.

Запускаются с:

$ git log

, который показывает Вам список недавних фиксаций и их хеши SHA1.

Затем, тип:

$ git reset --hard SHA1_HASH

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

80
ответ дан ZMorek 26 July 2019 в 07:18
поделиться
  • 1
    Wouldn' t быть неизменным иначе. Я don' t как платформы для ограничения моего выбора функций языка. – Thomas Jung 24 April 2010 в 00:28

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

git diff <commit hash> <filename>

Затем для возвращения определенного файла к той фиксации используют команду сброса:

git reset <commit hash> <filename>

Вы, возможно, должны использовать --hard опция, если у Вас есть локальные модификации.

А хороший рабочий процесс для managaging waypoints должен использовать теги для чистой маркировки точек во временной шкале. Я не могу вполне понять Ваше последнее предложение, но что можно хотеть, отличают ответвление от предыдущего момента времени. Чтобы сделать это, используйте удобную команду контроля:

git checkout <commit hash>
git checkout -b <new branch name>

можно затем повторно основывать это против магистрали, когда Вы готовы объединить те изменения:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>
574
ответ дан Chris Lloyd 26 July 2019 в 07:18
поделиться
  • 1
    @bestsss - положительная сторона на static - удаленный. Я don' t понимают, как Ваша вторая точка применяется. – OldCurmudgeon 18 March 2013 в 10:27

Необходимо быть осторожными при высказывании "отката". Если Вы раньше имели одну версию файла в $A фиксации и затем позже внесли два изменения в двух отдельных $B фиксаций и $C (поэтому, что Вы видите, третье повторение файла), и если Вы говорите, "Я хочу откатывать к первому", Вы действительно имеете в виду это?

, Если Вы хотите избавиться от изменений и второе и третье повторение, это очень просто:

$ git checkout $A file

и затем Вы фиксируете результат. Команда просит, чтобы "Я хотел проверить файл от состояния, зарегистрированного $A фиксации".

, С другой стороны, то, что Вы имели в виду, должно избавиться от изменения второе повторение (т.е. $B фиксации) введенный при хранении того, что $C фиксации сделал в файл, Вы захотите вернуться $B

$ git revert $B

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

54
ответ дан 26 July 2019 в 07:18
поделиться

Вот то, как rebase работы:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>
<час>

Предполагают, что Вы имеете

---o----o----o----o  master
    \---A----B       <my branch>

, первые две команды... фиксируют ведущее устройство перебазы мерзавцев контроля мерзавца

... проверяют ответвление изменений, к которым Вы хотите обратиться эти master ответвление. Эти rebase команда берет фиксации от [1 110] (которые не найдены в [1 111]), и повторно применяет их к главе [1 112]. Другими словами, родитель первой фиксации в [1 113] больше не является предыдущей фиксацией в master история, но текущий глава [1 115]. Две команды совпадают с:

git rebase master <my branch>

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

. Заключительный результат истории:

---o----o----o----o   master
                   \----A'----B'  <my branch>
<час>

заключительные две команды...

git checkout master
git merge <my branch>

... делают слияние ускоренной перемотки вперед для применения всего <my branch> изменения на [1 117]. Без этого шага переосновная фиксация не становится добавленной к [1 118]. Конечный результат:

---o----o----o----o----A'----B'  master, <my branch>

master и <my branch> обе ссылки B'. Кроме того, от этой точки безопасно удалить <my branch> ссылка.

git branch -d <my branch>
32
ответ дан George Stocker 26 July 2019 в 07:18
поделиться
  • 1
    При рассмотрении примера я вижу неизменный код Scala, поддержанный изменяемой базой данных. Предположите, что сингл был найден Dire Straits, играющих Металл. Сколько строк в таблице Artist в базе данных они тогда подняли бы? Вы были бы в состоянии запрос, чем Dire Straits, играемыми, прежде чем, Металлический сингл был найден, по сравнению с тем, что мы знаем, что они играют теперь? Какой " immutable" версия Dire Straits победила бы, или они станут двумя полосами? – GlenPeterson 1 October 2013 в 14:16

С мерзавца v2.23.0 существует новое восстановление мерзавца метод, который, как предполагается, принимает часть того, что git checkout было ответственно за (даже принятый ответ упоминает, что git checkout довольно сбивает с толку). Посмотрите выделения изменений на блог .

GitHub, поведение по умолчанию этой команды состоит в том, чтобы восстановить состояние рабочего дерева с содержанием, прибывающим из source параметр (который в Вашем случае будет хешем фиксации).

Так на основе ответа Greg Hewgill (принимающий хеш фиксации c5f567) команда была бы похожа на это:

git restore --source=c5f567 file1/to/restore file2/to/restore

Или если Вы хотите восстановить к содержанию одной фиксации прежде c5f567:

git restore --source=c5f567~1 file1/to/restore file2/to/restore
1
ответ дан mjarosie 14 September 2019 в 15:50
поделиться

Если Вы знаете, сколько фиксаций необходимо возвратиться, можно использовать:

git checkout master~5 image.png

Это предполагает, что Вы идете master ответвление и версия, которую Вы хотите, являются 5 фиксациями назад.

91
ответ дан 17 December 2019 в 16:00
поделиться

Можно использовать любую ссылку на фиксацию мерзавца, включая SHA-1, если это является самым удобным. Дело в том, что команда похожа на это:

git checkout [commit-ref] -- [filename]

352
ответ дан 17 December 2019 в 16:00
поделиться

У меня только что была такая же проблема, и я нашел этот ответ наиболее простым для понимания ( commit-ref - это значение SHA изменения в log, к которому вы хотите вернуться):

git checkout [commit-ref] [filename]

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

104
ответ дан 17 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: