Ох, не любит меня 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
Этот вариант показывает используемые файлы....
>[оверквотинг удален]
> 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.
> Сейчас произошло нечто, что выше моего понимания.
> Всегда делаю коммит и заливку в репозитарий командами:А надо всегда делать то, что понимаешь. Или минимум понимаешь, как вернуть назад. А то "не любит".
Мне для понимания помог просмотр двух видео Линуса в Гугле (язык: англ.), какое-то к-во чтения про (кста, теперь есть "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) не мерж-коммит, а какого ни то из его предков.
> Пробую: