URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9787
[ Назад ]

Исходное сообщение
"GIT влепил коммит в середину истории. Не могу откатиться."

Отправлено xintrea , 27-Ноя-13 01:03 
Ох, не любит меня Git.

Сейчас произошло нечто, что выше моего понимания. Всегда делаю коммит и заливку в репозитарий командами:


git add .
git commit -a
git push

У меня, по большей части, все линейно. Есть всего две ветки - master и try_django. Ветка try_django - это тупиковая ветка (была раньше тупиковой), и должна была остаться тупиковой.

Картинка:

http://i.piccy.info/i9/7e33e6eee876e90a8a2425c8480d95ae/1385...

При последнем коммите 27.11.13 0:02 вылезло предупреждение, что что-то не так (я особенно не понял), и предложение сделать git pull:


! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:xintrea/local_rash.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Я сделал git pull, он завершился ошибкой:


Renaming apprash/config/config.php => misc/06_linuxthash_php/apprash/config/config.php
Auto-merging misc/06_linuxthash_php/apprash/config/config.php
CONFLICT (rename/modify): Merge conflict in misc/06_linuxthash_php/apprash/config/config.php
CONFLICT (rename/delete): Rename css/main.css->misc/06_linuxthash_php/css/main.css in 081262b214d515aba563ded9dc8eeb9ff0896cc6 and deleted in HEAD
Renaming index.php => misc/06_linuxthash_php/rash.php
Auto-merging misc/06_linuxthash_php/rash.php
Removing data/base/db_20120901172549.sqlite
Removing data/pic/team_avatar/0157a760f5710c2d92f44bb5e6f49817.png
Removing data/pic/team_avatar/c11f8869892fa7462b9970e2f29d87c6.png
Removing data/pic/team_avatar/team_avatar_avangard.png
Removing data/pic/team_avatar/team_avatar_dinamo.png
Removing data/pic/team_avatar/team_avatar_ksov.png
Removing data/pic/team_avatar/team_avatar_spartak.png
Removing data/pic/trainer_avatar/3f7ca692c08f26d11c339e84f5c1809e.png
Removing data/pic/trainer_avatar/eff8e5e721d198a4cc2addc965df5b8d.png
Removing main.html
Automatic merge failed; fix conflicts and then commit the result.

Тогда я снова сделал "три команды". Git что-то сказал про merge (причем, я прямой команды на merge не давал!):


[master c3e8a45] Merge branch 'master' of bitbucket.org:xintrea/local_rash
Counting objects: 50, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (30/30), done.
Writing objects: 100% (34/34), 4.09 KiB, done.
Total 34 (delta 19), reused 0 (delta 0)
To git@bitbucket.org:xintrea/local_rash.git
   081262b..c3e8a45  master -> master

И результат вы видите на картинке - коммит 27.11.13 0:09 со слиянием! Который мне, честно говоря, никуда не впал, я на слияние команды не давал.

Видно, что коммит 27.11.13 0:02 находится в середине истории (почему???), ПОСЛЕ более ранних коммитов.

Теперь задача: мне нужно к этому коммиту (27.11.13 0:02) вернуться.

И я не могу это сделать!

Пробую:

git checkout a906f16ce7147911e9f950d569f2aeeb51091970

где a9...70 - это ID коммита 27.11.13 0:02.

Не помогает, я не вижу файлов которые я делал при этом коммите.

Пробую:

git reset --soft a906f16ce7147911e9f950d569f2aeeb51091970

Такая же фигня, состояние не возвращается к состоянию, в котором находился проект при коммите 27.11.13 0:02.


Вопрос: Как вернуться к состоянию, которое было при коммите 27.11.13 0:02?

* * *

Вот история коммитов (git log) ветки master, если поможет. Сейчас в ней почему-то нет финального коммита 27.11.13 0:09, хотя на картинке он виден. Может быть это из-за git reset.


$ ./git_log.sh
commit a906f16ce7147911e9f950d569f2aeeb51091970
Author: xintrea <xintrea@gmail.com>
Date:   Wed Nov 27 00:02:45 2013 +0400

    - Добавлен начальный двухколоночный макет главной страницы

commit e99bd9cc6df72e57632064db849b31ac5cb3830a
Author: xintrea <xintrea@gmail.com>
Date:   Sun Nov 17 18:35:46 2013 +0400

    - Первый коммит после отката от Django

commit 0e7b5221595c44be888b27b980ab45c6ea2dde25
Author: xintrea <xintrea@gmail.com>
Date:   Tue Sep 4 23:12:02 2012 +0400

    Сделан перенос обнаруженных удаленных новостей в базу публикаций
    в раздел новостей

commit 577d9b379d12e51e87c25b24d2a53ceb72568f44
Author: xintrea <xintrea@gmail.com>
Date:   Sat Sep 1 10:53:36 2012 +0400

    Подготовлен скрипт lorpad, он начал наполнять базу

commit 7a0757665ad7821342f1a221bae5d791e110cfa1
Author: xintrea <xintrea@gmail.com>
Date:   Mon Aug 27 01:25:30 2012 +0400

    Почти рабочий вариант с самодельным SQLite3 драйвером sqlite3pdo

commit 632f20b66ee8d9468732161ca1f210db1f79edce
Author: xintrea <xintrea@gmail.com>
Date:   Sun Aug 19 01:14:31 2012 +0400

    Сделан переход на CodeIgniter 2.1.2
    Исправлен PDO драйвер чтоб можно было работать с SQLite базой
    Заведена пробная база news
    Хранение сессий в базе данных временно отключено

commit 2b90796b230d31428c24d215a6ecbb28a7c2e0f0
Author: xintrea <xintrea@gmail.com>
Date:   Fri Aug 17 21:59:48 2012 +0400

    Заменен CodeIgniter Debug Tool bar на более свежую версию, взятую
    с github. Для установки пришлось изменить только конструктор в MY_Log.php
    Этот вариант показывает используемые файлы.

...



Содержание

Сообщения в этом обсуждении
"GIT влепил коммит в середину истории. Не могу откатиться."
Отправлено skb7 , 27-Ноя-13 02:04 
>[оверквотинг удален]
> commit 2b90796b230d31428c24d215a6ecbb28a7c2e0f0
> Author: xintrea <xintrea@gmail.com>
> Date:   Fri Aug 17 21:59:48 2012 +0400
>     Заменен CodeIgniter Debug Tool bar на более свежую
> версию, взятую
>     с github. Для установки пришлось изменить только конструктор
> в MY_Log.php
>     Этот вариант показывает используемые файлы.
> ...
>

Как откатиться:


$ git reflog
$ git checkout @номер_коммита_в_reflog


Как всё сделать правильно: по комманде git pull происходит git fetch и git merge. Теперь вы знаете откуда лезет merge. Чтобы избежать этого, используйте git pull --rebase. А переде этим проверьте, что находитесь на нужной ветке у себя локально, и также укажите в git pull --rebase имя удаленной ветки, на которую ребейзить ваши локальные изменения. Как то так:


$ git branch -a
$ git checkout branch_a
$ git pull --rebase origin branch_a


Если и после этого конфликты будут -- значит надо их решать. Решаются они с помощью "git mergetool", а в качестве утилиты мержа можно поставить на выбор: vimdiff (если любите vim), meld (если гномер) или kdiff3 (если кде-шник). Ну еще есть kdiff3-qt, если у вас не КДЕ, но тулза нравится. Дальше в этой утилите резолвятся конфликты и всё это дело сохраняется и делается вроде как "git rebase --continue" (он вам перед конфликтом напишет).


"GIT влепил коммит в середину истории. Не могу откатиться."
Отправлено Andrey Mitrofanov , 27-Ноя-13 13:10 
> Ох, не любит меня Git.
> Сейчас произошло нечто, что выше моего понимания.
> Всегда делаю коммит и заливку в репозитарий командами:

А надо всегда делать то, что понимаешь. Или минимум понимаешь, как вернуть назад. А то "не любит".

Мне для понимания помог просмотр двух видео Линуса в Гугле (язык: англ.), какое-то к-во чтения про (кста, теперь есть "Pro Git" - подробно в картинках) и собственно _делание_руками_.

Очень важно понять разницу working tree, index и ./.git/.

> У меня, по большей части, все линейно. Есть всего две ветки -
> При последнем коммите 27.11.13 0:02 вылезло предупреждение, что что-то не так (я
> особенно не понял), и предложение сделать git pull:
> To prevent you from losing history, non-fast-forward updates were rejected
> 'Note about fast-forwards' section of 'git push --help' for details.

Ну, вот тут уже случилось не "всё линейно", если fast-forward не сработал.
Надо было не "Я сделал"(ниже который), а остановиться и осмотреться.
Сходить на сервер, например, сравнить историю с локальной.

> Я сделал git pull, он завершился ошибкой:
> Тогда я снова сделал "три команды". Git что-то сказал про merge (причем,
> я прямой команды на merge не давал!):

pull - это fetch + merge. И это написано в его (git-pull) man-е.

Если у тебя был незавершённый merge, то ты его и закоммитил в таком недоделанном виде своими "тремя командами".

Научись уже пользоваться git status! (Да, он _показывает_ незавешшённый мерж. И git diff, вроде, тоже.)

> Теперь задача: мне нужно к этому коммиту (27.11.13 0:02) вернуться.
> И я не могу это сделать!
> Не помогает, я не вижу файлов которые я делал при этом коммите.

Ну, там же у тебя про removing чего-то писало:

 Auto-merging misc/06_linuxthash_php/rash.php
Removing data/base/db_20120901172549.sqlite
Removing data/pic/team_avatar/0157a760f5710c2d92f44bb5e6f49817.png

Попробуй взять (checkout) не мерж-коммит, а какого ни то из его предков.

> Пробую: