Я внес некоторые изменения в файл, который был зафиксирован несколько раз как часть группы файлов, но теперь хочу сбросить / отменить изменения в нем до предыдущей версии.
Я сделал git log
вместе с a, git diff
чтобы найти нужную мне ревизию, но просто не знаю, как вернуть файл в прежнее состояние в прошлом.
git
version-control
git-checkout
Hates_
источник
источник
--cached
при проверкеgit diff
. ссылкаОтветы:
Предполагая, что хеш коммита вы хотите
c5f567
:Страница руководства git checkout дает больше информации.
Если вы хотите вернуться к фиксации ранее
c5f567
, добавьте~1
(где 1 - количество коммитов , которые вы хотите вернуть, это может быть что угодно):Кстати, мне всегда было неудобно с этой командой, потому что она используется как для обычных вещей (переключение между ветвями), так и для необычных, разрушительных вещей (отбрасывая изменения в рабочем каталоге).
источник
develop
), которое вам нужноgit checkout develop -- file/to/restore
(обратите внимание на двойную черту)Вы можете быстро просмотреть изменения, внесенные в файл, используя команду diff:
Затем, чтобы вернуть определенный файл в этот коммит, используйте команду сброса:
Возможно, вам придется использовать эту
--hard
опцию, если у вас есть локальные модификации.Хорошим рабочим процессом для управления путевыми точками является использование тегов для точной маркировки точек на временной шкале. Я не совсем понимаю ваше последнее предложение, но вам может понадобиться отклонить ветку от предыдущего момента времени. Для этого используйте удобную команду checkout:
Затем вы можете изменить это значение по отношению к основной линии, когда будете готовы объединить эти изменения:
источник
git checkout <commit hash> <filename>
работал лучше для меня, чемgit reset
git checkout <commit hash> <filename>
работал на меня. Это не должно быть принятым ответом, ИМХО.git reset
не.git reset
для сброса одного файла, вы получите ошибкуfatal: Cannot do hard reset with paths
git reset --hard <commit hash> <filename>
. Это ошибка с тем,fatal: Cannot do hard reset with paths.
что сказал Мотти Стром: использованиеgit checkout <commit hash> <filename>
Вы можете использовать любую ссылку на коммит git, включая SHA-1, если это наиболее удобно. Дело в том, что команда выглядит так:
git checkout [commit-ref] -- [filename]
источник
--
, и принятым, который не дает?rm -- -f
(удалить файл с именем-f
) кажется каноническим примером. Более подробно здесьrm
команда использует getopt (3) для анализа своих аргументов.getopt
это команда для анализа аргументов команды. gnu.org/software/libc/manual/html_node/Getopt.htmlЭто сбросит
foo
на ГОЛОВУ. Вы также можете:за одну ревизию назад и т. д.
источник
git checkout -- foo
чтобы избежать ошибок, еслиfoo
что-то особенное (например, каталог или файл с именем-f
). В git, если вы не уверены, всегда ставьте перед всеми файлами и каталогами специальный аргумент--
.--
это не команда git и не специально для git. Это встроенный bash для обозначения конца параметров команды. Вы также можете использовать его со многими другими командами bash.--
это не встроенное специальное слово в bash. Но это общее соглашение, поддерживаемое многими анализаторами командной строки и используемое многими CLI, включая git.И чтобы вернуться к последней подтвержденной версии, которая наиболее часто нужна, вы можете использовать эту более простую команду.
источник
У меня была такая же проблема только сейчас, и я нашел этот ответ
commit-ref
наиболее простым для понимания ( это значение SHA изменения в журнале, к которому вы хотите вернуться):Это поместит старую версию в ваш рабочий каталог, и оттуда вы можете зафиксировать ее, если хотите.
источник
Если вы знаете, сколько коммитов нужно вернуть, вы можете использовать:
Это предполагает, что вы находитесь на
master
ветке, и версия, которую вы хотите, 5 коммитов назад.источник
Я думаю, что нашел это .... от http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html
Иногда вы просто хотите вернуться назад и забыть о каждом изменении после определенного момента, потому что все они не правы.
Начните с:
$ git log
который показывает вам список последних коммитов и их хэши SHA1.
Далее введите:
$ git reset --hard SHA1_HASH
чтобы восстановить состояние данного коммита и удалить все новые коммиты из записи навсегда.
источник
git push --force
Это сработало для меня:
Затем внесите изменения:
источник
Вы должны быть осторожны, когда говорите «откат». Если раньше у вас была одна версия файла в коммите $ A, а затем позже было сделано два изменения в двух отдельных коммитах $ B и $ C (так что вы видите третью итерацию файла), и если вы скажете " Я хочу вернуться к первому ", вы действительно это имеете в виду?
Если вы хотите избавиться от изменений как второй, так и третьей итерации, это очень просто:
и тогда вы фиксируете результат. Команда спрашивает: «Я хочу извлечь файл из состояния, записанного коммитом $ A».
С другой стороны, вы имели в виду избавление от изменений, внесенных второй итерацией (т. Е. Фиксацией $ B), сохраняя то, что коммит $ C сделал с файлом, вы захотите вернуть $ B
Обратите внимание, что тот, кто создал коммит $ B, возможно, не был очень дисциплинированным и мог совершить совершенно несвязанное изменение в том же коммите, и этот возврат может коснуться файлов, отличных от файла, в котором вы видите оскорбительные изменения, поэтому вы можете тщательно проверить результат после выполнения так.
источник
Забавно,
git checkout foo
не будет работать, если рабочая копия находится в каталоге с именемfoo
; однако, и такgit checkout HEAD foo
иgit checkout ./foo
будет:источник
git checkout -- foo
Вот как это
rebase
работает:Предположим, у вас есть
Первые две команды ... совершить git checkout git rebase master
... проверить ветку изменений, которые вы хотите применить к
master
ветке. Командаrebase
получает коммиты<my branch>
(которые не найдены вmaster
) и повторно применяет их к главеmaster
. Другими словами, родитель первого коммита в<my branch>
больше не является предыдущим коммитом вmaster
истории, а текущим главойmaster
. Две команды такие же как:Возможно, будет проще запомнить эту команду, так как ветки "base" и "modify" явные.
, Окончательный результат истории:
Последние две команды ...
... выполнить ускоренное слияние, чтобы применить все
<my branch>
измененияmaster
. Без этого шага коммит ребаз не будет добавлен вmaster
. Окончательный результат:master
и<my branch>
обе ссылкиB'
. Также с этого момента можно безопасно удалить<my branch>
ссылку.источник
Начиная с git v2.23.0, существует новый метод восстановления git, который должен принимать на себя часть
git checkout
ответственности (даже в принятом ответе упоминается, чтоgit checkout
это довольно запутанно). Смотрите основные изменения в блоге GitHub .Поведение этой команды по умолчанию заключается в восстановлении состояния рабочего дерева с содержимым, полученным из
source
параметра (который в вашем случае будет хэшем коммита).Таким образом, основываясь на ответе Грега Хьюгилла (при условии, что хеш коммита
c5f567
), команда будет выглядеть так:Или, если вы хотите восстановить содержимое одного коммита до c5f567:
источник
Первая головка сброса для целевого файла
Вторая проверка этого файла
источник
где
<N>
- количество ревизий файла для отката для файла<filename>
.Например, чтобы оформить немедленную предыдущую ревизию одного файла
x/y/z.c
, запуститеКак работает git prevision?
Добавьте следующее к вашему
gitconfig
По сути, все, что можно было бы сделать вручную в этой ситуации,
заключить в один красивый, эффективный псевдоним - git-prevision.
источник
Здесь я должен подключить EasyGit , который является оболочкой, чтобы сделать git более доступным для новичков, не путая бывалых пользователей. Одна из вещей, которые он делает, это дает больше смысла
git revert
. В этом случае вы бы просто сказали:eg revert foo/bar foo/baz
источник
eg revert --in REVISON -- FILENAME
. Это--in
важно. Для пользователей Windows: откройте git bash. Выполнитьecho %PATH
. Первый путь должен быть в вашем пользовательском каталоге, заканчивающийся наbin
. Создайте этот путь. Хранить, например, там. Назовите этоeg
. Неeg.txt
.В случае, если вы хотите вернуть файл к предыдущей фиксации (и файл, который вы хотите восстановить уже зафиксированную), вы можете использовать
или
Затем просто подготовьте и зафиксируйте «новую» версию.
Вооружившись знанием, что в случае слияния у коммита может быть два родителя, вы должны знать, что HEAD ^ 1 является первым родителем, а HEAD ~ 1 - вторым родителем.
Любой из них будет работать, если в дереве есть только один родитель.
источник
Здесь много предложений, в основном по направлениям
git checkout $revision -- $file
. Пара неясных альтернатив:А также, я часто использую это только для того, чтобы временно увидеть определенную версию:
или
(OBS:
$file
должен быть добавлен префикс,./
если это относительный путь дляgit show $revision:$file
работы)И тем более странно
источник
Обратите внимание, однако, что
git checkout ./foo
иgit checkout HEAD ./foo
это не совсем то же самое; Дело в точке:(Второй
add
этапы файла в индексе, но это не получить совершено.)Git checkout ./foo
означает вернуть путь./foo
из индекса ; добавлениеHEAD
указывает Git вернуть этот путь в индексе к егоHEAD
ревизии, прежде чем сделать это.источник
Для меня ни один из ответов не казался действительно ясным, и поэтому я хотел бы добавить мой, который кажется очень легким.
У меня есть коммит
abc1
и после него я сделал несколько (или одну модификацию) файлаfile.txt
.Теперь скажите, что я что-то испортил в файле
file.txt
и хочу вернуться к предыдущему коммитуabc1
.1
git checkout file.txt
.: это удалит локальные изменения, если они вам не нужны2
git checkout abc1 file.txt
.: это приведет ваш файл к нужной версии3
git commit -m "Restored file.txt to version abc1"
.: это совершит ваше возвращение.git push
: это будет толкать все в удаленном хранилищеМежду шагами 2 и 3, конечно, вы можете сделать,
git status
чтобы понять, что происходит. Обычно вы должны увидетьfile.txt
уже добавленное, и поэтому нет необходимостиgit add
.источник
2.Git вернуть файл в определенную ветку
источник
Чтобы перейти к предыдущей версии коммита, получите номер коммита, скажем eb917a1
Если вам просто нужно вернуться к последней зафиксированной версии
Это просто приведет вас к последнему подтвержденному состоянию файла.
источник
git checkout ref | commitHash - filePath
например
источник
Многие ответы здесь претендуют на использование
git reset ... <file>
илиgit checkout ... <file>
, тем не менее, вы потеряете все изменения<file>
в фиксации после фиксации, которую вы хотите отменить.Если вы хотите отменить изменения от одного коммита
git revert
только для одного файла , как это было бы сделано, но только для одного файла (или, скажем, подмножества файлов коммитов), я предлагаю использовать оба вариантаgit diff
иgit apply
так (with<sha>
= хэш коммит вы хотите вернуть):По сути, он сначала сгенерирует патч, соответствующий изменениям, которые вы хотите отменить, а затем примените патч в обратном порядке, чтобы удалить эти изменения.
Конечно, это не сработает, если измененные строки были изменены любым коммитом между
<sha1>
иHEAD
(конфликтом).источник
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
вместо<sha>^ <sha>
Используйте
git log
для получения хеш-ключа для конкретной версии, а затем используйтеgit checkout <hashkey>
Примечание: не забудьте ввести хеш перед последним. Последний хеш указывает вашу текущую позицию (HEAD) и ничего не меняет.
источник
Очевидно, что кто-то должен либо написать вразумительную книгу по git, либо git нужно лучше объяснить в документации. Столкнувшись с этой же проблемой, я догадался, что
отменяет последний коммит, который, кажется, делает.
Ян
источник
Вы можете сделать это в 4 этапа:
Что нужно набрать в своем терминале :
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&&git commit -m 'reverting file'
git checkout .
удачи
источник
git-revert
действует только на весь репо, поэтому чтобы компенсировать это, мы должны отменить все остальное.git revert --no-commit <commit_hash>
2.git reset HEAD
Это сохраняет дополнительную фиксацию и делает все изменения только в вашем рабочем каталоге.git revert _oldcommit_ --no-commit
git reset -- _unchanged1_ _unchanged2_ ...
git commit -m "branch without changes to specific files"
новая подсказка ветви отразила все изменения, за исключением возвращенных файлов.Это очень простой шаг. Извлеките файл с требуемым идентификатором фиксации, здесь один идентификатор фиксации ранее, а затем просто выполните команду git commit modify и все готово.
Это очень удобно. Если мы хотим вывести какой-либо файл с любым идентификатором предыдущей фиксации в верхней части фиксации, мы можем легко это сделать.
источник
Вернет данный коммит. Похоже, вы думаете, что
git revert
влияет только на самый последний коммит.Это не решит вашу проблему, если вы хотите отменить изменение в определенном файле, и этот коммит изменился больше, чем этот файл.
источник
Если вы делаете неправильный файл в ваших последних коммитах, следуйте инструкциям:
источник