Как поддерживать несколько независимых стабильных веток Git - PullRequest
0 голосов
/ 17 ноября 2018

Вот проблема мерзавца.Я делаю приложение по изучению программирования в чистом (командной строке) Ruby.Это приложение позволяет пользователю создавать и планировать обзоры задач программирования, управлять файлами, в которых выполняются задачи, и автоматически запускать результат из приложения.Для этих целей мне не нужен git, когда есть один файл.Но наиболее сложные задачи и задачи веб-программирования включают редактирование и использование нескольких файлов, и для управления этим мне нужно использовать git , и я не очень хорош в git.

В приложенииОжидается, что создатель этих более сложных «повторных задач» задаст вопросы на основе git-ветки (по своему выбору) репо (по своему выбору).Поэтому я полагаю, что для этого требуется, чтобы для каждого репо существовала серия ветвей, каждая из которых поддерживается независимо друг от друга, и каждая из которых является относительно стабильной;и приложение в основном проверяет филиалы по мере необходимости, чтобы ответить на вопросы.Это звучит просто ...

Проблемы:

  • После того, как я сделаю новые ветви (вручную, с git checkout -b branch_name) и добавлюновые файлы, я, кажется, не могу проверить некоторые предыдущие ветки.Например:

    $ git checkout foobar_JS_enabled_missing_prompt error: The following untracked working tree files would be overwritten by checkout: display_nodename.html Please move or remove them before you switch branches. Aborting

  • Мне (кажется, мне) нужно git reset --hard ответвлений после того, как пользователь закончит отвечать на вопрос.Но выполнение этого, похоже, непреднамеренно очистило файл, над которым я усердно работал при создании более поздней ветви.Я думаю, это потому, что я жестко переустановил более раннюю ветку, в которой указанный файл был пустым.

Взаимодействие с git, которое выполняет приложение (в основном используя ruby-git )far is:

  • На самом деле создавать репо и ветки вручную.
  • Список ветвей для тех, кто задает вопросы на выбор.
  • Оформить ветки, когда онивыбранный, используя

    g = Git.open("data/repos/#{repo}") g.branch(branch).checkout

  • Выполните полный сброс ветви, на которой основан вопрос, когда пользователь начинает отвечать на вопрос, используя:

    g = Git.open("data/repos/#{repo}") g.reset_hard

  • Я еще не сделал этого, но я хочу создать ветвь архива для каждого вопроса, т. Е. Хочу разрешить автору вопроса ответитьстарый ответ, затем переключитесь на основную ветку для этого вопроса, чтобы создать новый ответ.

В основном, я хочу замороженные версии каждой ветви, но процесс (описанный выше)кажется, создает нежелательные взаимодействия.Я думал, что ветви были изолированы друг от друга автоматически.Что я делаю неправильно?Что мне нужно сделать, чтобы заморозить последнюю зафиксированную версию каждой ветви, независимо от того, что происходит в других ветках, в то время как я часто переключаюсь между ветками?

ОБНОВЛЕНИЕ (11/18): я уйдуэто скорее комментарий, чем ответ, потому что вопрос немного неясен.Я никогда не понимал, что индекс и дерево не зависят от ветвей.Так что в моем коде действительно было несколько тонких ошибок, связанных с тем, что я позволил своему дереву стать нечистым.В нескольких местах мне нужно было выполнить полную перезагрузку кода, прежде чем позволить ответчику начать работу над ответом, даже если в большинстве случаев это не требуется.Мне также нужно было сделать полный сброс кода после того, как ответчик завершит работу.Еще одна вещь, которую мне нужно было сделать, это проверить, какая ветка в настоящий момент проверена, и переключиться на нужную (я уже сделал это, но не везде, где должен был).

Кажется, сейчас работает, и я больше не могу копировать ошибки.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Вы можете сохранить свою работу в тайнике, прежде чем переключать филиалы. Читайте здесь .
Непосредственно перед переключением на другую ветку используйте git stash.
Когда вы вернетесь в эту ветку снова, вы можете загрузить свою работу, сохраненную в тайнике, на git stash pop.
«pop» удалит ваш тайник после применения, вы также можете назвать свои тайники и делать другие вещи, например, не удаляя тайник после применения.

0 голосов
/ 17 ноября 2018

За исключением восстановления старой версии или если вы допустили ошибку, git reset hard должен быть очень и очень редким.Единственное реальное использование сброса git - это когда вы не хотите сохранять свою работу.

При каждом перемещении между ветвями вы должны выполнить git commit и git push (т.е. отправить на сервер), прежде чем уйтии вам нужно выполнить git pull (то есть получить с сервера) после проверки git.

Если вы этого не сделаете, вы получите ошибки, о которых говорите.

Frozenветвь и отсутствие взаимодействия - нонсенс для git.Единственный способ не «взаимодействовать» - это правильно завершить свою работу (зафиксировать, подтолкнуть) и правильно выполнить работу коллег (потянуть).

...