Возврат одного файла к предыдущей версии в git [duplicate]

Стандартный метод генерации числа (без метода утилиты) в диапазоне состоит в том, чтобы просто использовать double с диапазоном:

long range = 1234567L;
Random r = new Random()
long number = (long)(r.nextDouble()*range);

даст вам длинный промежуток между 0 (включительно) и диапазон (эксклюзивный). Аналогично, если вы хотите, чтобы число между x и y:

long x = 1234567L;
long y = 23456789L;
Random r = new Random()
long number = x+((long)(r.nextDouble()*(y-x)));

даст вам длину от 1234567 (включительно) до 123456789 (исключая)

Примечание: проверьте круглые скобки, для long имеет более высокий приоритет, чем умножение.

543
задан Cascabel 29 April 2010 в 00:40
поделиться

4 ответа

Начнем с качественного описания того, что мы хотим делать (многое из этого сказано в ответе Бена Штрауба). Мы сделали некоторое количество коммитов, пять из которых изменили данный файл, и мы хотим вернуть файл к одной из предыдущих версий. Во-первых, git не сохраняет номера версий для отдельных файлов. Он просто отслеживает контент - фиксация - это, по сути, снимок рабочего дерева вместе с некоторыми метаданными (например, сообщением фиксации). Итак, мы должны знать, в каком коммите есть нужная нам версия файла. Как только мы это узнаем, нам нужно будет сделать новую фиксацию, возвращающую файл в это состояние. (Мы не можем просто возиться с историей, потому что мы уже отправили этот контент, а редактирование истории мешает всем остальным.)

Итак, давайте начнем с поиска правильного коммита. Вы можете очень легко увидеть коммиты, которые внесли изменения в данный файл (ы):

git log path/to/file

Если ваши сообщения о фиксации недостаточно хороши, и вам нужно увидеть, что было сделано с файлом в каждой фиксации, используйте -p / - patch option:

git log -p path/to/file

Или, если вы предпочитаете графический вид gitk

gitk path/to/file

, вы также можете сделать это после запуска gitk через меню просмотра; один из вариантов представления - это список включаемых путей.

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

# get the version of the file from the given commit
git checkout <commit> path/to/file
# and commit this modification
git commit

(Команда checkout сначала считывает файл в индекс, затем копирует его в рабочее дерево, поэтому нет необходимости использовать git add , чтобы добавить его в индекс при подготовке к фиксации.)

Если у вашего файла нет простой истории (например,переименовывает и копирует), см. отличный комментарий VonC. git можно направить на более тщательный поиск таких вещей в ущерб скорости. Если вы уверены, что история проста, вам не о чем беспокоиться.

829
ответ дан 22 November 2019 в 22:07
поделиться

Git не думает о версиях файлов. Версия в git - это снимок всего дерева.

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

Я не знаю, есть ли однострочный файл, который вернет один файл к содержимому 5 коммитов назад, но решение lo-fi должно работать: checkout master ~ 5 , скопируйте файл где-нибудь еще, проверьте master , скопируйте файл обратно, затем выполните фиксацию.

7
ответ дан 22 November 2019 в 22:07
поделиться

Вы можете взять разницу, которая отменяет нужные вам изменения, и зафиксировать это.

Например. Если вы хотите отменить изменения в диапазоне от..до , выполните следующие действия

git diff to..from > foo.diff  # get a reverse diff
patch < foo.diff
git commit -a -m "Undid changes from..to".
5
ответ дан 22 November 2019 в 22:07
поделиться

Git очень гибкий. Вам не нужны сотни веток, чтобы делать то, что вы просите. Если вы хотите полностью вернуть состояние ко второму изменению (и это действительно изменение, которое уже было зафиксировано и отправлено), используйте git revert . Что-то вроде:

git revert a4r9593432 

, где a4r9593432 - это начальные символы хэша фиксации, от которой вы хотите отказаться.

Если фиксация содержит изменения во многих файлах, но вы просто хотите вернуть только один из файлов, вы можете использовать git reset (2-я или 3-я форма):

git reset a4r9593432 -- path/to/file.txt
# the reverted state is added to the staging area, ready for commit
git diff --cached path/to/file.txt        # view the changes
git commit
git checkout HEAD path/to/file.txt        # make the working tree match HEAD           

Но это красиво сложный, а git reset опасен. Вместо этого используйте git checkout <путь к файлу> , как предлагает Джефроми.

Если вы просто хотите посмотреть, как выглядел файл в фиксации x, вы можете использовать git show :

git show a4r9593432:path/to/file.txt

Для всех команд существует множество способов ссылаться на фиксацию, кроме через хеш фиксации (см. Именование коммитов в Руководстве пользователя Git).

74
ответ дан 22 November 2019 в 22:07
поделиться
Другие вопросы по тегам:

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