3

Пытаюсь закоммитить на GitHub большой проект по частям - по 500Мб, постепенно удаляя определенные папки из .gitignore. Пока так делал все было хорошо.

Но случайно закоммитил сразу 1.5Гб, теперь выдает ошибку при синхронизации с GitHub. Как можно отменить этот коммит, чтобы с моим локальным проектом никаких изменений не произошло?

И еще вопрос. Это нормальная практика - коммитить проекты по 5Гб?

Nick Volynkin
  • 34,094
  • 1
    Рекомендуется обходиться проектами не более 1 Gb объёмом: https://help.github.com/articles/what-is-my-disk-quota/ – Timofei Bondarev Jul 06 '15 at 09:06
  • Думаю, для того, чтобы кто-то мог помочь, стоит описать ситуацию подробнее, например, добавить используемую последовательность действий и полученные сообщения – Timofei Bondarev Jul 06 '15 at 09:08
  • Речь об этом репозитории? https://github.com/dmitrykozyr/Home – Nick Volynkin Jul 06 '15 at 09:28
  • Делаю все через интерфейс GitHub:
    1. Нажал "Закоммитить"
    2. Нажал "Синхронизировать"

    Уже часть проекта так загрузил на GitHub, часть еще осталась

    – Amazing User Jul 06 '15 at 09:28
  • @NickVolynkin Да – Amazing User Jul 06 '15 at 09:29
  • 1
    Это абсолютно ненормальная практика, код - это текстовые файлы, и сложно представить себе проект с таким весом. Что у вас там, бинарные данные? – etki Jul 06 '15 at 09:58
  • Игра на Unreal Engine, кода там еще почти нет. Там много тяжелых файлов самого движка и плюс модели – Amazing User Jul 06 '15 at 10:01
  • @dmitrykozyr: а тяжелые файлы самого движка разве не устанавливаются вместе с движком на рабочую машину каждого разработчика? – Nick Volynkin Jul 06 '15 at 10:03
  • @NickVolynkin В Unity я знаю, какие файлы можно не загружать, там у меня меньше гигабайта выходит. А проект на Unreal загружаю впервые. Еще не разобрался, какие каталоги можно не загружать. Но я согласен, что это неправильно – Amazing User Jul 06 '15 at 10:08
  • @dmitrykozyr: значит нужно начать с этого: точно определить, что туда будет входить, а что - нет. Предлагаю вам задать про это отдельный вопрос вида «Что должно быть в .gitignore для Unreal Engine». Отличный вопрос будет. – Nick Volynkin Jul 06 '15 at 10:12

2 Answers2

4

Скажем, что история коммитов выглядет вот так, где В - ваш HEAD, и (Ф) - состояние ваших файлов.

         (ф)
A -> Б -> В
          ↑
        master

(1) Если хотите совсем уничтожить коммит В и больше никогда не видеть его, то можно так:

git reset --hard HEAD~1

В результат,

    (ф)
A -> Б
     ↑
   master

В больше не существует. Так как мы использовали --hard, превратились к состоянию файлов после коммита Б.

(2) Если хотите отменить коммит В, но сохранить состояние файлов, то можно без --hard:

git reset HEAD~1

В результат,

         (ф)
A -> Б -> В
     ↑
   master

HEAD изменился, но состояние файлов то же самое. Ничего не потеряли.


(Ответ взят с английского сайта)

Peter Olson
  • 10,462
2

Вариант 1

Решение про возврат к более раннему коммиту есть здесь:

Как вернуться (откатиться) к более раннему коммиту?

В данном случае наиболее удобным мне представляется вариант с 4.1 При этом сохранить изменения в индекс репозитория

git reset --soft 3b61b1

Хотя вы можете использовать просто reset и добавлять файлы.

git reset 3b61b1
git add ...
git commit -m'part 1'
git add ...
git commit -m'part 2'
...

После чего вы разбиваете этот коммит на несколько и делаете push.

Вариант 2 - разбить через rebase -i

Как разделить/склеить старый комит?

Rebase делаем к коммиту перед тем, который хотим разделять:

git rebase -i 3b61b1^

О репозиториях в 5ГБ

И еще вопрос. Это нормальная практика - коммитить проекты по 5Гб?

Это возможно, но накладывает определенные ограничения.

Version control system for game development with UDK?

How to use Git for Unity3D source control?

Glorfindel
  • 1,187
  • 2
  • 14
  • 19
Nick Volynkin
  • 34,094
  • Проект на Unreal Engine, но с Unity тоже есть такие проблемы. Спасибо, почитаю – Amazing User Jul 06 '15 at 09:40