Як повернутися до останньої версії в 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
@Nathan: Саме так. HEAD - це щось, що називається символічним відбитком - загалом це вказівник на інший ref (поточна перевірена гілка). git checkoutце спосіб перемістити ГОЛОВУ навколо. Коли ви від'єднали HEAD, ви вказали прямо на цю задану команду; коли ви знову перевірите майстра, він вказує на майстра. (І багато багатьох команд, як git logнасправді, займають область перегляду, яка за замовчуванням відповідає HEAD.)
Cascabel,

3
Так - HEAD - це "займенник", який використовується для позначення "Версія коду, що знаходиться в робочому каталозі". Це також займенник "Батько, що б ви зробили далі"
Ана Беттс

54

Коли ви переходите на певний комітет, git створює окрему гілку. Отже, якщо ви телефонуєте:

$ git branch 

Ви побачите щось на кшталт:

* (detached from 3i4j25)
  master
  other_branch

Щоб повернутися до голови головного відділення, вам потрібно ще раз зайти до вашого головного відділення:

$ 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
скинути --hard - це надмірний набір і демонструє, що ви не знаєте про внесені вами модифікації. Це може призвести до втрати коду.
Томіо

1
У моєму випадку я хотів позбутися невдоволених випадково внесених змін. Я знаю, що для досягнення цього можуть бути й інші методи. Я погоджуюсь, якщо ви не хочете втрачати свої невмілі вчинені зміни, це втрата даних.
Csaba Toth

8

Щоб повернутися до останньої версії:

git checkout <branch-name> 

Наприклад, git checkout masterабоgit checkout dev


7

Ви можете перевірити, використовуючи назви філій, для одного.

Я знаю, що існує кілька способів переміщення ГОЛОВИ навколо, але я залишу це експерту з git, щоб перерахувати їх.

Я просто хотів підказати gitk --all- я вважав це надзвичайно корисним, коли починати з git.


7

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

BTW, додайте подібний псевдонім до свого .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

Він повернеться до найбільш обуреної локальної версії гілки, а також збереже ваші зміни в сховці, тому якщо ви хочете скасувати цю дію, виконайте такі дії:

git stash apply

Я знаю, що це дуже давно, але я повинен коментувати це (оскільки я думаю, що це рішення не слід використовувати) - я б не використовував це рішення, оскільки це не вирішує цю проблему, а іншу проблему. з цим сховищем рішення кожного разу, коли ви хочете отримати замовлення на попереднє зобов’язання, ви фактично "зберігаєте" дані, що в цьому випадку дуже непотрібно. Правильний і витонченіший спосіб - це (як було сказано раніше) просто оформити замовлення <branch>.
Майяо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.