Как правильно исправить мой рабочий процесс git - PullRequest
0 голосов
/ 24 апреля 2018

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

Так что, если я правильно понимаю этот урок или этот (очень похож), у меня должно быть ветвление, похожее на это:

(version)        0.1                 0.2  

Master            C'                 H''  
                  |                  |  
Client1           C'                 H''     
                  |                  |  
Release        C--C'             H'--H''  
               |   \             |  
Develop--A--B--C----C'-D----G----H'------I--J  
                        \       /  
Feature1                 E--F--H  

Моя проблема в том, что я начал разрабатывать (и использовать git), не задумываясь об этом способе работы с потоками. Это означает, что в настоящее время у меня есть основная ветка, которая фактически является моей веткой разработки ...

Итак, вот мои вопросы:

  1. Могу ли я переименовать мою основную ветвь как развивающуюся ветвь, а затем воссоздать основную ветвь? Или я должен создать новую ветвь с именем Develop, вытолкнуть все из главной и начать использовать ветку delveop, как я использовал свою основную ветку? (и только прикасайтесь к основной ветке, когда у меня есть стабильные версии моего кода, готовые к отправке)

  2. Я не уверен, что действительно понимаю, как правильно «перенести» мою работу из ветви в другую, я бы сказал, используя git merge, но всякий раз, когда я вижу графики, показывающие, что объединение кажется более похожим 'закрытие' ветки, которая обновляет его, это так? Например, когда я хочу поместить код из моей ветки релиза в master или клиент, я хочу, чтобы эти ветки были доступны для будущих обновлений слияний. Я неправильно понял концепцию слияния?

  3. При локальной работе я должен оставаться только в ветвях разработки, выпуска, исправлений и функций для изменения кода, верно? (Если я оформлю заказ в главном или клиентском филиале, это будет только для их обновления?)

  4. Также, если я работаю локально, если я обращаюсь в другую ветку перед тем, как перейти к удаленному репо, потеряю ли я сделанные мной изменения? (Я бы сказал, что, если бы я использовал git commit, я найду эти изменения, когда снова проверю предыдущую ветку.)

  5. Допустим, у меня есть моя ветвь разработки и основная ветка, какие команды мне нужно использовать для получения этой конфигурации? Можно ли пометить версии?

(version)     0.1      0.2  

Master         C        F     
               |        |       
Develop--A--B--C--D--E--F--H

Извините за эти вопросы новичка, я прочитал и попробовал несколько уроков, но он все еще очень размыт, и никто в моей команде не использует git. Фактически, они как бы поручают мне изучать и продвигать его, поэтому я хочу иметь правильный способ управления рабочими процессами, а не выбрасывать все ...

Спасибо за вашу помощь и не стесняйтесь спрашивать, если вам нужно больше точности.

1 Ответ

0 голосов
/ 24 апреля 2018

Не могу сказать, что полностью понимаю рабочий процесс, для которого вы снимаете.График, который вы нарисовали, не является типичным для графа git commit, что само по себе нормально, но этот график, кажется, не представляет отношения между коммитами и ветвями таким образом, который может быть точным в git.Поэтому мне, в основном, придется поверить на слово, что вы нашли более или менее подходящий рабочий процесс, и ограничить мой ответ прямыми вопросами, которые вы задали:

1) Поскольку ветвь - это просто указатель накоммит, вы можете легко переименовать master в develop и затем воссоздать master где бы вы ни хотели.

git checkout master
git checkout -b develop
git branch -d master

Имейте в виду, что как только вы создадите master где-то в другом месте, оно, вероятно, появитсячтобы двигаться непредвиденным образом.Таким образом, если master было отправлено на удаленный компьютер, следующая попытка нажать master завершится неудачей, если вы не используете push -f (или, лучше, push --force-with-lease).Это приведет к принудительному принудительному запуску, но принудительное принудительное переключение переведет всех, кто совместно использует пульт, в «сломанное» состояние, поэтому некоторая очистка должна быть согласована с ними.(Невозможность скоординировать это может привести к отмене принудительного толчка.) См. Документы git rebae в разделе «восстановление после исходной перебазировки».https://git -scm.com / docs / git-rebase

2) Слияние не «закрывает» ветвь.Исходная ветвь не затронута слиянием.Целевая ветвь либо (a) перемещается к коммиту, указанному в исходной ветке (в случае ускоренной перемотки вперед), либо (b) получает новый «коммит слияния», который включает изменения из исходной ветки.

3) Возможно.Опять же, я не знаю, чтобы правила вашего рабочего процесса были полностью объяснены, чтобы мы могли это прокомментировать.

4) После того, как работа зафиксирована, ее очень трудно потерять, даже если она зафиксирована только «локально»;в этом смысл git

5) Опять же, эти диаграммы не отражают то, как коммиты и ветви связаны в git.Вы можете получить что-то вроде

O ----------- MC ----------------- MH <--(master)
 \           /                   /
  A -- B -- C -- D -- E -- F -- H <--(develop)

, где MC и MH - это слияния develop в master.Обратите внимание, что в этом случае отдельные коммиты все еще являются частью истории master.Иногда вы можете «сфокусироваться» только на коммитах в «верхней строке» этой диаграммы - т.е. git log --first-parent master;но если вы поделитесь master с другим репо, он получит все.Избежать этого сложнее, чем просто «создать правильные ветви».

Существует несколько подходов к обмену текущими обновлениями с ограниченной историей.

Один из способов - сохранить ветку клиента, о которой думает gitкак "не связанные" с историей развития.Это может работать так:

У вас есть какая-либо структура веток, которая используется в вашем локальном репо, и вы в конечном итоге объединяетесь, чтобы освоить «версию 1.0», которой вы хотите поделиться.Таким образом, вы создаете ветку client следующим образом:

git checkout master
git checkout --orphan client
git commit -m "Version 1.0"

Теперь у вас есть

C1 <--(client)

... V1 <--(master)

Теперь некоторые вещи происходят локально, пока у вас не появится Версия 2.0

C1 <--(client)

... V1 -- V2 <--(master)
         /
    ... X

В прошлом я разработал все виды схем для отслеживания того, что уже находится в клиентской ветви, и / или расчета изменения от V1 и V2, чтобы его можно было применить к клиентской ветви.... но правда в том, что если V1 и C1 совпадают, то все, что вас действительно волнует, это как создать новый коммит C2, чей родитель C1 и чей контент (TREE объект) совпадения V2? "

git checkout client
git merge $(git commit-tree -p client -m "Version 2.0" master^{tree})

Теперь у вас есть

C1 -- C2 <--(client)

... V1 -- V2 <--(master)
         /
    ... X

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...