Я внес некоторые изменения в файл, который был зафиксирован несколько раз как часть группы файлов, но теперь хочу сбросить/вернуть изменения в нем к предыдущей версии.
Я сделал git log
вместе с git diff
, чтобы найти нужную мне ревизию, но не представляю, как вернуть файл в его прежнее состояние.
Предположим, что хэш нужного вам коммита - c5f567
:
git checkout c5f567 -- file1/to/restore file2/to/restore
На странице руководства git checkout дана дополнительная информация.
Если вы хотите вернуться к коммиту до c5f567
, добавьте ~1
(работает с любым числом):
git checkout c5f567~1 -- file1/to/restore file2/to/restore
В качестве примечания, мне всегда было не по себе от этой команды, потому что она используется как для обычных вещей (изменение между ветками), так и для необычных, разрушительных вещей (отбрасывание изменений в рабочем каталоге).
Вы можете быстро просмотреть изменения, внесенные в файл, с помощью команды diff:
git diff <commit hash> <filename>
Затем для возврата конкретного файла к этому коммиту используйте команду reset:
git reset <commit hash> <filename>
Вам может понадобиться использовать опцию --hard
, если у вас есть локальные модификации.
Хорошим рабочим процессом для управления путевыми точками является использование тегов для чистого обозначения точек на вашей временной шкале. Я не совсем понимаю ваше последнее предложение, но, возможно, вы хотите отклонить ветвь от предыдущей точки во времени. Чтобы сделать это, используйте удобную команду checkout:
git checkout <commit hash>
git checkout -b <new branch name>
Затем, когда вы будете готовы объединить эти изменения, вы сможете пересогласовать их с основной веткой:
git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>
Вы можете использовать любую ссылку на git-коммит, включая SHA-1, если это удобнее. Главное, чтобы команда выглядела следующим образом:
git checkout [commit-ref] -- [filename]
.
git checkout -- foo
Это сбросит foo
в HEAD. Вы также можете:
git checkout HEAD^ foo
на одну ревизию назад и т.д.
А для возврата к последней зафиксированной версии, что чаще всего и требуется, вы можете использовать эту более простую команду.
git checkout HEAD file/to/restore
У меня была та же проблема, только теперь и я нашел этот ответ легкий для понимания (совершить-Реф
является значением ша смены в журнале вы хотите, чтобы вернуться к):
git checkout [commit-ref] [filename]
Это приведет к тому, что старую версию в вашем рабочем каталоге, а оттуда вы можете совершить его, если вы хотите.
Если вы знаете, на сколько коммитов вам нужно вернуться назад, вы можете использовать:
git checkout master~5 image.png
Это предполагает, что вы находитесь на ветке master
, а нужная вам версия находится на 5 коммитов назад.
Я думаю, что я'вэ нашел его....от http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html
Иногда просто хочется вернуться назад и забыть все изменения до определенного момента, потому что они'вновь все не так.
Начать с:
$ журнале git
который показывает вам список последних коммитов, и их SHA1 хэши.
Далее, введите:
$ ГИТ сброс --жесткий SHA1_HASH
чтобы восстановить состояние на данный фиксацию и стереть все более новые коммиты из записи постоянно.
Вы должны быть осторожны, когда вы сказать"откат " и;. Если вы привыкли иметь одну версию файл в коммит $A, а затем сделал два изменения в двух отдельных коммитов $B и $с (так что вы видите, это третья итерация файл), и если вы говорите "Я хочу вернуться к первому и", вы это серьезно?
Если вы хотите избавиться от изменений, как во втором и третьем проходе, он очень прост:
$ git checkout $A file
и тогда вы фиксируете результат. Команда спрашивает "Я хочу, чтобы проверить файл от государства, записанные совершают $А".
С другой стороны, что вы имели в виду, чтобы избавиться от смена второй итерации (т. е. совершают $Б) привезли, сохраняя при этом, что совершают $c никак файла, вы хотите вернуть $б
$ git revert $B
Обратите внимание, что тот, кто создавал совершают $B может не быть очень дисциплинированным и, возможно, совершили, совершенно не связанные изменения в тот же коммит, и этот возврат может касаться других файлов файл вы видите оскорбительный изменения, так что вы можете проверить результат тщательно после этого.
Забавно, ГИТ кассе фу
не будет работать, если рабочая копия в папку фу
; однако, как руководитель ГИТ кассе фуи
Git в кассе ./ФОО` будет:
$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo
Здесь's, как перебазировка
работы:
ГИТ кассе <моя ветка> ГИТ перебазирования мастер ГИТ выезд мастера ГИТ слияния <моя ветка>
Предположим, у вас есть
---О----О----О----Владыко ---А----Б <моя ветка>
Первые две команды ... совершать ГИТ кассе <моя ветка> ГИТ перебазирования мастер
... проверить филиал изменения, которые вы хотите применить к мастер-ветке. Команда перебазировка
берет коммиты из в <моя ветка>
(, что не нашли в "Мастер") и применяет их в голову "мастер". Другими словами, родитель первый коммит в <моя ветка>
это уже не предыдущий коммит в мастер-истории, но нынешний глава "мастер". Две команды такие же, как и:
git rebase master <my branch>
Это может быть легче запомнить эту команду как в "базу" и "изменить" и филиалы являются явными.
. Конечный результат истории:
---О----О----О----Владыко ----а'----б' <моя ветка>
Последние две команды ...
git checkout master
git merge <my branch>
... делать перемотка вперед сливаться, чтобы применить все в <моя ветка>
меняется на мастер
. Без этого шага, перебазировать совершить не добавляются в "мастер". Окончательный результат:
---О----О----О----О----А'----б' мастер <моя ветка>
Мастер
и в <моя ветка>
исходной б'
. Кроме того, с этого момента это безопасно, чтобы удалить `<моя ветка> ссылка.
git branch -d <my branch>
Первый Сброс Головой На Целевой Файл
git reset HEAD path_to_file
Вторая Проверка, Что Файл
git checkout -- path_to_file
ГИТ-псевдонимы, как awk и Shell-функций к спасению!
git prevision <N> <filename>
где в <П>
- количество изменений в файл для отката на файл в <имя>
.
Например, чтобы оформить предыдущей редакции один файл `х/г/з.с выполните
git prevision -1 x/y/z.c
Добавьте следующие строки в ваш gitconfig хранит настройки
[alias]
prevision = "!f() { git checkout `git log --oneline $2 | awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"
команда в основном
- выполняет
журнале Git
на указанный файл и- выбирает соответствующую фиксацию-идентификатор в историю файла и
- выполнение
Git в кассе
на коммит-идентификатор для указанного файла.
По сути, все, что можно было бы вручную сделать в этой ситуации свернул в один прекрасный, эффективный ГИТ-псевдоним - ГИТ-предвидение
В случае, если вы хотите вернуть файл к предыдущему коммиту (и файл, который вы хотите отменить уже совершенные) вы можете использовать
git checkout HEAD^1 path/to/file
или
git checkout HEAD~1 path/to/file
Затем просто организовать и совершить в "Новой" по версии.
Вооружившись знанием, что фиксация может иметь двух родителей в случае слияния, вы должны знать, что Глава^1-первый родитель и Глава~1 является вторым родителем.
Либо будет работать, если есть только один родитель в дереве.
Мне нужно подключить EasyGit, который является оберткой, чтобы сделать git более доступным для новичков без толку опытных пользователей. Одна из вещей, он делает это [дать больше значения ГИТ вернуться
](http://www.gnome.org/~newren/ЭГ/ГИТ-ЭГ-различия.сообщение: возврат). В этом случае, вы бы просто сказать:
<код>напр вернуться <б>фу/фу бар/баз</б></код>
Заметим, однако, что Git в кассе ./фу
и Git в кассе головы ./ФОО
не точно то же самое; дело в точку:
$ 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
(Второй "Добавить" файл в индекс, но это не вам совершено.)
Git в кассе ./фу-это значит восстановить путь
./Фу с индекс;
добавление "голова" указывает Git, чтобы вернуться, что путь в указатель
"Голова" доработка, прежде чем делать так.
Здесь много предложений, большинство из линейки Git в кассе пересмотр $ -- файл$
. Пару непонятных альтернатив:
git show $revision:$file > $file
А также, я использую это много, чтобы просто посмотреть, временно определенной версии:
git show $revision:$file
или
git show $revision:$file | vim -R -
(Примечание: $
файл должен начинаться с ./
если это относительный путь к `ГИТ показывают пересмотр$:$файл работать)
И еще более странно:
git archive $revision $file | tar -x0 > $file
Для меня ни один из ответов, казалось, очень ясно, и поэтому я хотел бы добавить мину, которая, кажется, очень легко.
У меня есть обязательства АВС1 +
и после этого я сделал несколько (или одну модификацию) в файл file.txt
.
Теперь сказать, что я напутал что-то в file.txt файл `и я хочу вернуться к одной из предыдущих фиксаций
АВС1+`.
1.`ГИТ кассе file.txt-это будет удалить локальные изменения, если вы Don'т нуждаются в них
2.`ГИТ кассе АВС1 + file.txt-это принесет ваш файл вашей хотел версия
3.в Git коммит -м и"восстановлен file.txt до версии АВС1 + "
в : это будет совершать ваш возврат.
git толчок
: это будет толкать все на удаленный репозиторий Между шагом 2 и 3 Конечно, вы можете сделать статус ГИТ
, чтобы понять, что происходит. Как правило, вы должны увидеть file.txt уже добавил, и поэтому нет необходимости
добавить в Git`.
Для того, чтобы перейти к предыдущей фиксации версию файла, сделать фиксацию количество, скажем eb917a1 тогда
git checkout eb917a1 YourFileName
Если вам нужно просто вернуться в последний совершил версия
git reset HEAD YourFileName
git checkout YourFileName
Это просто последний совершил государственный файла