@0x0000002F

VCS в квадрате. Можно ли с помощью Git контролировать состояние другого Git-репозитория?

Как у изучающего Git, для меня не является сложной задачей что-либо сломать в своем проекте, да так, что восстановить уже не получится. Я умею обращаться с такими командами, как git status, add, commit, log, push и с ними ничего плохого никогда не происходило. Но тут еще бранчи, мерджи и конфликты, которые часто дают неожиданные результаты... Если умело с ними обращаться, будет сложно что-то сломать, но тут ключевое слово "умело", что не относится к моим навыкам в Git на данный момент. Я не вижу более эффективного способа практиковать Git, чем на реальных проектах.
Я как-то уже пытался работать с ветками, после чего появился конфликт; я пытался его исправить, но в итоге каким-то образом снес половину коммитов. Причем мне это приспичило сделать на середине своего реального проекта. После этого я надолго забыл про бранчи как страшный сон.
Так что знаю из своего опыта, что своими лапками я могу написать какую-то гадость в черном окне терминала, да так, что потом моему проекту и мне будет нехорошо. Все же, ветки - важная вещь, и вначале без боли тут никак. По этому было бы неплохо как-либо сохранять прошлые версии Git репозитория (не проекта, а именно репозитория). Получается "Git над Git".

Можно было бы копировать разные версии репозитория вручную по папкам, но... Серьезно?.. В итоге иметь десятки копий репозитория... Неудобно и непрактично.
test/
| copy1/
| | .git
| | index.html
| | ...
| copy2/
| | .git
| | index.html
| | ...
| ...

Также я пытался создать Git репозиторий-обертку вокруг репозитория с проектом, ну типа:
test
| .git <- это вспомогательный репозиторий
| main_repo <- папка проекта
| | .git <- это основной
| | index.html
| | ...

Но что-то не прокатило. Когда у меня было уже 5 чекпоинтов в оберточном репозитории, при попытке checkout в нем на один из прошлых, основной репозиторий никак не менялся.
Как я это делал?

0. Создал отдельную папку (test) под все это дело
1. В этой папке создал еще одну папку (main_repo), где будет основной репозиторий
2. Инициализировал репозиторий внутри main_repo
3. Инициализировал репозиторий-обертку в test и сделал коммит "checkpoint 0"
4. Создавал и изменял файлы в main_repo, делал в ней коммиты, ветки... Периодически коммитил (создавал чекпоинты) в оберточном репозитории
5. Накопилось 5 чекпоинтов и я в конце концов решил проверить, что у меня получилось.
6. Сделал checkout на четвертый чекпоинт. И нифига. Также переключился на нулевой, но тут тоже ничего не поменялось.
7. Понял что все фигня Миша это не работает и сказал своей директории "sudo rm -rf test"
8. Пошел просить помощи на Habr


Может быть, это все-таки можно реализовать с помощью Git? Может в нем и нет функций, направленных на такую задачу, но может быть это как-то можно обойти с помощью его других встроенных возможностей?
  • Вопрос задан
  • 157 просмотров
Решения вопроса 1
sergey-kuznetsov
@sergey-kuznetsov Куратор тега Git
Автоматизатор
Нет, рекурсия работать не будет. Гит увидит, что внутри каталога лежит вложенный репозиторий и проигнорирует его. А в своей базе пометит этот подкаталог как поддерево (subtree), чтобы не сломать.

Вы пытаетесь соорудить какой-то жуткий костыль только лишь потому, что поленились изучить инструмент, в котором работаете. Поэтому для вас Git сейчас представляется как некая шайтан-машина, которой вы скармливаете команды, которые не понимаете, и в результате получаете ещё более непонятные «неожиданные результаты». Просто потратьте несколько дней, чтобы изучить азы. Не зубрите непонятные команды, а постарайтесь понять логику гита. А она — эта логика предельно проста и гениальна.

не является сложной задачей что-либо сломать в своем проекте

Сломать что-то в гите довольно сложно. Вам может только показаться что всё сломалось, но это лишь потому, что вы не понимаете, что делаете.

каким-то образом снес половину коммитов

Коммиты в гите — это неизменяемые сущности. Можно лишь создать новые «на замену», но старые не исчезают. Коммиты невозможно удалить без специальных команд очистки мусора.
Вам показалось что коммиты исчезли, но на самом деле они все остались в репозитории, вы просто их не видите в текущей ветке. Но всё легко откатывается назад, используя журнал Reflog.

Поэтому было бы неплохо как-либо сохранять прошлые версии Git репозитория

Reflog это и делает, по сути. Это журнал, который хранит указатели на все состояния проекта, в которых вы когда-либо находились ранее. И эти состояния сами по себе не исчезают, так что вы всегда можете откатиться назад в любое место.

Мой вам совет: Пройдите 16 коротких бесплатных уроков и полу́чите просветление.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы