Перейти к определенной ревизии

582

Я клонировал git-репозиторий определенного проекта. Могу ли я перевести файлы в исходное состояние и при просмотре файлов перейти к ревизии 2, 3, 4 ... самой последней? Я хотел бы получить общее представление о том, как развивался проект.

xralf
источник

Ответы:

876

Используйте git checkout <sha1>для проверки конкретного коммита.

Марсело Кантос
источник
2
Вы можете сделать это git log -n1. Но если git checkoutне удалось, это пустая трата усилий.
Марсело Кантос
2
Оно работает. Мне пришлось использовать полный sha1 (не частичный). А если я хочу поставить проект на второй ревизии? git logсейчас показывает только первый коммит, могу ли я узнать sha1 следующего коммита?
xralf
6
Вам нужно только использовать достаточно sha1, чтобы гарантировать уникальность. Возможно, у вас было несчастливое совпадение. Git не имеет понятия «следующий» коммит; история - это DAG со всеми стрелками, указывающими назад. Вы должны запустить git log --onelineи вставить вывод в текстовый файл для справки (сокращенные суммы, которые он предоставляет, гарантированно будут уникальными). Другой вариант, если ваша история линейна, это выяснить, сколько существует коммитов от первого коммита до masterи использования git checkout master~543(если есть 543 коммитов), затем git checkout master~542и т. Д.
Marcelo Cantos
20
и как вернуться к текущему коммиту из "git checkout <sha1>"?
ス レ ッ ク ス
6
@AlexanderSupertramp Оформить заказ в филиале.
Марсело Кантос
50

Для перехода к определенной версии / коммиту выполните следующие команды. Хэш-код вы можете получить отgit log --oneline -n 10

git reset --hard HASH-CODE

Примечание. После сброса до определенной версии / коммита вы можете запустить git pull --rebase, если хотите вернуть все коммиты, которые были отброшены.

J4cK
источник
1
Обратите внимание, что a resetне только проверяет конкретную точку на графике, но и перемещает вашу
Лиам
Кроме того reset, все ожидающие изменения отменяются.
WilliamKF
2
--hard flag удалит все коммиты после указанного хэша .... возможно, вы захотите добавить этот маленький бит tid здесь. Я уверен, что люди потеряли историю и задавались вопросом, почему.
Urasquirrel
git pull --rebaseработает, только если у вас есть пульт для репо, и он в курсе.
Кит Томпсон
19

Вы можете получить графическое представление истории проекта с помощью таких инструментов, как gitk. Просто беги:

gitk --all

Если вы хотите оформить заказ на конкретную ветку:

git checkout <branch name>

Для конкретного коммита используйте хэш SHA1 вместо имени ветви. (См. Treeishes в Git Community Book , которая хорошо читается, чтобы увидеть другие варианты навигации по вашему дереву.)

git log имеет целый набор параметров для отображения подробной или сводной истории тоже.

Я не знаю простого способа двигаться вперед в истории коммитов. Проекты с линейной историей, вероятно, не так уж часто встречаются. Идея «ревизии», как у вас с SVN или CVS, не очень хорошо отображает в Git.

Мат
источник
2
Помните: git не будет вам лгать, предоставляя вам единую линейную историю проекта. Это если проект фактически не развивался таким образом.
Андрес Яан Тэк
Движение вперед логически бессмысленно (даже в линейной истории), поскольку коммит не ссылается на «будущее». В лучшем случае вы можете идентифицировать все коммиты, у которых данный коммит находится как родительский. Имейте в виду, что движение назад не является тривиальным упражнением из-за слияний.
Марсело Кантос
5

Используя ключ SHA1 коммита, вы можете сделать следующее:

  • Сначала найдите коммит, который вы хотите для определенного файла:

    git log -n <# commits> <file-name>

    Это, основываясь на вашем <# commits>, сгенерирует список коммитов для конкретного файла.

    Совет: если вы не уверены в том, что совершает вы ищете, хороший способ выяснить это с помощью следующей команды: git diff <commit-SHA1>..HEAD <file-name>. Эта команда покажет разницу между текущей версией коммита и предыдущей версией коммита для определенного файла.

    ПРИМЕЧАНИЕ: ключ SHA1 коммита отформатирован в git log -nсписке как:

совершить <SHA1 id>

  • Во-вторых, оформите желаемую версию:

    Если вы нашли нужный коммит / версию, которую вы хотите, просто используйте команду: git checkout <desired-SHA1> <file-name>

    Это поместит указанную вами версию файла в область подготовки. Чтобы вывести его из области подготовки, просто используйте команду:reset HEAD <file-name>

Чтобы вернуться туда, куда указывает удаленный репозиторий, просто используйте команду: git checkout HEAD <file-name>

колдун
источник
2

Я был в ситуации, когда у нас есть главная ветвь, а затем другая ветвь с именем 17.0, и внутри этой 17.0 был хеш коммита, скажем, "XYZ" . И клиенту дается сборка до этой ревизии XYZ. Теперь мы столкнулись с ошибкой, которая должна быть решена для этого клиента. Поэтому нам нужно создать отдельную ветку для этого клиента до этого хеш-кода. Так вот как я это сделал.

Сначала я создал папку с этим именем клиента на моем локальном компьютере. Скажите, что имя клиента «AAA», как только эта папка создана, выполните следующую команду внутри этой папки:

  1. мерзавец
  2. git clone После этой команды вы будете на главной ветке. Так что переключитесь на нужную ветку
  3. git checkout 17.0 Это приведет вас к ветке, где присутствует ваш коммит
  4. git checkout Это займет ваше хранилище до тех пор, пока этот хеш не зафиксируется. Посмотрите название вашей ветки, которая была заменена на хэш коммита no. Теперь дайте имя ветви этому хешу
  5. git branch ABC Это создаст новую ветку на вашем локальном компьютере.
  6. git checkout ABC
  7. git push origin ABC Это переместит эту ветку в удаленный репозиторий и создаст ветку на git server. Вы сделали.
Ashish
источник
1

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

использовать git format-patch <initial revision>и потом git checkout <initial revision>. Вы должны получить кучу файлов в вашем директоре, начиная с четырех цифр, которые являются патчами.

когда вы закончите читать свою ревизию, просто сделайте то, git apply <filename>что должно выглядеть git apply 0001-*и рассчитывать.

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

Руководство git также дает мне это:

git show next~10:Documentation/README

Показывает содержимое файла Documentation / README в том виде, в каком оно было актуально в 10-м последнем коммите ветки next.

Вы также можете взглянуть на git blame filenameсписок, где каждая строка связана с коммитом хеш + автор.

Alex
источник
1

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

  1. Получите его из своей учетной записи github / gitlab / bitbucket. (Он находится на вашем коммит- адресе , например: github.com/user/my_project/commit/ commit_hash_code ), или вы можете
  2. git logи проверьте свои последние коммиты на этой ветке. Он покажет вам хеш-код вашего коммита и сообщение, которое вы оставили во время коммита вашего кода. Просто скопируйте и затем сделайтеgit checkout commit_hash_code

После перехода к этому коду, если вы хотите работать с ним и вносить изменения, вы должны сделать еще одну ветвь git checkout -b <new-branch-name>, в противном случае изменения не будут сохранены.

Янив Хойман
источник
0

Чтобы проверить фиксацию (обратите внимание на прошлое!).

  • git checkout "commmitHash"

Чтобы жестоко перезапустить коммит и удалить те более поздние ветки, которые вы, вероятно, испортили.

  • git reset --hard "commmitHash"
Джереми
источник