Как вернуться к последней версии в Git?


303

Я недавно перешел из SVN в Git и немного смущен чем-то. Мне нужно было запустить предыдущую версию скрипта через отладчик, поэтому я сделал git checkout <previous version hash>и сделал то, что мне нужно было сделать.

Теперь я хочу вернуться к новейшей версии, но я не знаю хэш для этого. Когда я печатаю git log, я этого не вижу.

Как я могу это сделать? Кроме того, есть ли более простой способ изменить версии, чем вводить хэши - что-то вроде «вернуться к двум версиям» или «перейти к самой последней в хронологическом порядке»?

Ответы:


371

git checkout masterдолжен сделать свое дело. Чтобы вернуться к двум версиям, вы можете сказать что-то вроде git checkout HEAD~2, но лучше создать временную ветку на основе этого времени, поэтомуgit checkout -b temp_branch HEAD~2


7
Прохладно! git checkout masterименно так я переключаюсь обратно с ветки. Значит ли это, что когда я проверяю предыдущую версию, я по сути создаю ветку?
Натан Лонг

4
@Nathan: В git ветка - это в основном подвижный указатель на определенную ревизию. Концептуально, вы как бы создаете ветку, но не в том смысле, в каком git думает о ветках.
DLH

2
Так что в простейшем случае, когда у меня есть куча линейных изменений, когда я извлекаю более раннюю ревизию, я перемещаю туда указатель HEAD, что означает, что git logбудет отображаться относительно этой точки? И когда я извлекаю мастер, я перемещаю указатель на последнюю версию мастер ветки?
Натан Лонг

7
@ Натан: Точно. HEAD - это то, что называется символьной ссылкой - это вообще указатель на другую ссылку (текущую проверенную ветку). git checkoutэто способ двигаться ГОЛОВА вокруг. Когда вы отключили HEAD, вы указали прямо на этот коммит; когда вы снова проверяете мастер, он снова указывает на мастер. (И многие многие команды, такие как git logфактически, принимают диапазон ревизий, который по умолчанию равен HEAD.)
Каскабель

3
Да - HEAD - это местоимение, используемое для обозначения «версии кода, которая находится в рабочем каталоге». Это также местоимение «Родитель всего, что вы делаете дальше»
Ана Беттс,

54

Когда вы извлекаете конкретный коммит, git создает отдельную ветку. Итак, если вы позвоните:

$ git branch 

Вы увидите что-то вроде:

* (detached from 3i4j25)
  master
  other_branch

Чтобы вернуться к главе ветки master, вам просто нужно снова зайти в вашу ветку master:

$ git checkout master

Эта команда автоматически удалит отдельную ветку.

Если git checkoutне работает, вы, вероятно, изменили файлы, конфликтующие между ветвями. Чтобы предотвратить потерю кода, git требует, чтобы вы имели дело с этими файлами. У вас есть три варианта:

  1. Спрятать ваши модификации (вы можете добавить их позже):

    $ git stash
    
  2. Отмените изменения, сбросив отдельную ветку:

    $ git reset --hard
    
  3. Создайте новую ветку с предыдущими изменениями и передайте их:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

После этого вы можете вернуться в свою основную ветку (самая последняя версия):

$ git checkout master

36

Это помогло мне (я все еще был в основной ветке):

git reset --hard origin/master

34
reset --hard - это перебор, и он показывает, что вы не знаете о внесенных вами изменениях. Это может привести к потере кода.
Томио

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


7

Вы можете проверить, используя имена филиалов, с одной стороны.

Я знаю, что есть несколько способов перемещать ГОЛОВКУ, но я оставлю это для эксперта по мерзавцам, чтобы перечислить их.

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


7

Я только начинаю копать глубже в мерзавец, так что не уверен , если я правильно понимаю, но я думаю , что правильный ответ на вопрос OP является то , что вы можете работать git log --allсо спецификацией формата , как это: git log --all --pretty=format:'%h: %s %d'. Это помечает текущую выписанную версию как, (HEAD)и вы можете просто взять следующую из списка.

Кстати, добавьте псевдоним, подобный этому, .gitconfigс немного лучшим форматом, и вы можете запустить git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

Что касается относительных версий, я нашел этот пост , но он говорит только о старых версиях, вероятно, нет ничего, чтобы ссылаться на более новые версии.


6

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

git checkout -

Укажет вам обратно на ветку, в которой вы были ранее (независимо от того, была ли она главной или нет).


Не обязательно ветвь, она будет указывать HEAD туда, куда она указывала раньше; если вы сделали git checkout hash2после git checkout hash1, git checkout -вернет вас к hash1.
Михаил Васин

3

Когда вы вернетесь к предыдущей версии,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

С помощью этой команды вы можете просмотреть свой журнал функций (хэш) даже в этой ситуации;

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master может быть заменено другим именем ветви.

Затем проверьте его, и вы сможете вернуться к этой функции.

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

1

В Git 2.23+ (август 2019 г.) лучше всего использовать git switchвместо запутаннойgit checkout команды.

Чтобы создать новую ветку на основе более старой версии:

git switch -c temp_branch HEAD~2

Чтобы вернуться к текущей основной ветке:

git switch master

0

Более элегантным и простым решением является использование

git stash

Он вернется к самой последней версии локальной ветки и также сохранит ваши изменения в stash, поэтому, если вы хотите отменить это действие, выполните:

git stash apply

Я знаю, что он очень старый, но я должен это прокомментировать (так как я думаю, что это решение не следует использовать) - я бы не стал использовать это решение, потому что оно не решает эту проблему, а представляет собой другую проблему. С этим решением для тайника каждый раз, когда вы хотите оформить предыдущий коммит, вы на самом деле «сохраняете» данные, которые в этом случае совершенно не нужны. Правильный и более элегантный способ - это (как указано выше) просто оформить заказ <branch>.
Maayao
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.