git merge ветка в стиле молнии - PullRequest
2 голосов
/ 13 апреля 2011

У меня есть репозиторий Git, например, с двумя ветками "master" и "other".Они содержат коммиты почти в одной подпапке каждая, поэтому в истории изменений не было столкновений.Теперь я люблю удалять ветку "другое";и объединить его коммиты в "master" в стиле молнии, например:

Master A1 A2 -  -  -  M3 M4  
Other  B1 -  -  -  B2 -  -   B3

становится

Master A1 B1 A2 B2 M3 M4 B3

и "прочее" исчезает.Таким образом, остается только одна линейная основная ветвь.

Возможно ли это с помощью инструментария Git?

Ответы [ 4 ]

5 голосов
/ 14 апреля 2011

Прежде всего, вы уверены, что это то, что вы хотите сделать? Есть два довольно стандартных решения для подобной ситуации в Git, но ни одно из них не «застегивает» коммиты именно так, как вы хотите. Первый вариант - просто объединить «прочее» с «основным» и удалить ветку «прочее». Это не оставляет линейной истории, но все находится в «основной» ветке, и вы можете просматривать ревизии в любом конкретном порядке, который вы хотите (например, вы можете сделать git log --date-order, чтобы получить коммиты, перечисленные в порядок, который вы хотите). Вы получите эту историю в конце концов:

    A1 A2 M3 M4
    *--*--*--*
   /          \
--*            *-- < master
   \          /
    *----*---*
    B1   B2  B3

Вы бы достигли этого, запустив:

git checkout master
git merge other
git branch -d other

Другой вариант - перебазировать вашу "другую" ветку поверх вашей главной ветки. Это даст вам линейную историю, но все ваши коммиты в «другой» ветке появятся после коммитов в «master». Даты будут сохранены, поэтому, если вы хотите знать, когда на самом деле произошли коммиты, вы все равно можете это выяснить, но топологически они будут отсортированы впоследствии:

  A1 A2 M3 M4 B1 B2 B3
--*--*--*--*--*--*--*-- < master

Вы можете сделать это, запустив:

git checkout other
git rebase master
git checkout master
git merge other
git branch -d other

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

Если вы не против сделать заказ вручную, вы можете использовать git rebase -i, чтобы упорядочить коммиты так, как вы хотите. Вы должны выполнить следующие команды (где base - первый коммит до того, как две ветви разошлись; если a1 - первый коммит, не общий между ними, тогда вы можете использовать a1~ для ссылки на этот коммит):

 git checkout master
 git merge other
 git rebase -i base

Во время интерактивного перебазирования вам будет представлен текстовый файл, содержащий список изменений, которые вы можете редактировать в любом порядке, в котором вы хотите, чтобы они были применены. Конечно, это полностью вручную, так что только вариант, если вы иметь небольшую историю и хотите изменить коммиты вручную. Если есть какие-либо конфликты слияния, вам может потребоваться разрешить их несколько раз вручную, если вы сделаете это. И, как уже упоминалось, это будет означать, что любой другой, кто основывал свою работу на master, теперь должен будет также сделать ребаз.

Вы также можете несколько автоматизировать этот процесс, создав новую ветку, начинающуюся с base, и вставив вишневые коммиты из одной или другой ветви в эту новую, и, наконец, заменив master этой новой веткой.

Но, как я уже говорил, вы, вероятно, не хотите этого делать. Мои первые два решения, которые не дают вам достаточно истории, которую вы ищете, но дают вам что-то близкое к ней, будут вести себя лучше всего в большинстве рабочих процессов на основе Git.

1 голос
/ 13 апреля 2011

Может быть, вы могли бы объединить Other с Master, а затем запустить git rebase -i A1, чтобы интерактивно перебазировать - реорганизовать коммиты в текстовом редакторе по своему вкусу.Вероятно, у вас все еще есть коммит слияния, с которым вам придется иметь дело.

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

0 голосов
/ 13 апреля 2011

Создайте еще одну ветку с именем temp. git cherry-pick соответствующие коммиты в порядке в temp. Переименуйте ветку temp в master: git branch -M master.

0 голосов
/ 13 апреля 2011

Если вас не интересует фактический порядок коммитов, и все будет в порядке:

A1 A2 M3 M4 B1 B2 B3

Затем на ветке Other выполните git rebase master.

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