Получение полного журнала git после отката к предыдущей версии - PullRequest
6 голосов
/ 21 апреля 2011

Я новичок в git и, вероятно, не использую правильную терминологию, так что потерпите меня:)

Допустим, у меня есть хранилище с 5 изменениями, например,

D:\test\gitrepo2>git log --oneline
3a5fd33 555
3cfbfae 444
e9a78c8 333
a618586 222
b80d5e1 111

Я узнал, что могу синхронизироваться с более ранней версией, выполнив:

D:\test\gitrepo2>git reset e9a78c8 --hard
HEAD is now at e9a78c8 333

Мой вопрос: после этого, как я могу получить полный журнал, чтобы я мог вернуться к самой последней ревизии?

Запущенный журнал больше не показывает эти ревизии:

D:\test\gitrepo2>git log --oneline
e9a78c8 333
a618586 222
b80d5e1 111

Я также попытался добавить ключ --all, но это ничего не изменило. В Mercurial при том же сценарии запуск журнала hg дает полный журнал даже после обновления до более ранней версии.

Ответы [ 3 ]

9 голосов
/ 21 апреля 2011

Я предполагаю, что под «синхронизацией назад» вы действительно подразумеваете, что просто хотите, чтобы ваша рабочая копия выглядела как предыдущий момент времени.Чтобы сделать это, вы хотите, чтобы checkout, а не reset:

> git checkout e9a78c8

В этот момент ваш репозиторий выглядит следующим образом:

> git log master --oneline
3a5fd33 555   <--- master is still here
3cfbfae 444
e9a78c8 333   <--- HEAD (working copy) is here
a618586 222
b80d5e1 111

Теперь, чтобы вернуться к последней версиизафиксируйте master, просто git checkout master снова.

Используя reset, вы получите это вместо:

> git log master --oneline
e9a78c8 333   <--- HEAD (working copy) and master are here
a618586 222
b80d5e1 111
7 голосов
/ 21 апреля 2011

Использование git reset обновляет указатель (refs /heads / master), чтобы он указывал на более раннюю ревизию. На самом деле он не делает новую ревизию, которая эффективно откатывается к этой более ранней ревизии, что, как я полагаю, и есть то, что делает ваш «ртутный эквивалент» (и это в некоторой степени похоже на то, что делает git revert).

Однако Git хранит файл журнала о том, как со временем менялись refs /heads / master, и отдельный файл для HEAD. Вы можете просмотреть это в довольно сыром виде, используя

git reflog show HEAD

(или мастер) или в более знакомой форме, просто используя

git log -g

Этот режим git log показывает записи reflog вместо того, чтобы проходить по графу ревизий: git log -g -n 10 покажет последние 10 вещей, на которые указал HEAD, так что это будет то же самое, что и git log -n 10, если все, что вы сделали, было простым git commit s.

Однако, он также покажет изменение веток, сброс настроек и т. Д.

git log -g master

будет отображать только записи reflog, где основная ветвь изменилась (смена ветвей вообще не появляется ни в одном журнале веток).

2 голосов
/ 21 апреля 2011

Если вы хотите вернуться, попробуйте вместо этого (без головы) оформить заказ (git checkout HEAD^)


Я думаю, вам просто нужно

git log HEAD@{1}

Так, например, на свежем репо

mkdir -pv /tmp/repo
cd /tmp/repo
git init
touch a 
git add .
git commit -am 1
echo something > a
git commit -am 2
git reset --hard HEAD^
git log HEAD@{1}

Выход:

commit ca6f2c6c1b07895816a1b75973035a20a0238607
Author: Seth <sehe@xxxxxxxxx>
Date:   Thu Apr 21 01:17:06 2011 +0200

    2

commit d71ea3dfa89771af6d3ae2d0e88e1dc6ccce48b8
Author: Seth <sehe@xxxxxxxxx>
Date:   Thu Apr 21 01:16:56 2011 +0200

    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...