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

У меня есть хранилищеadmin, из которого в какой-то момент была разветвлена ветвь ()develop. Это выглядит примерно так

develop            c2        c4        c5
      *------------*---------*---------*------------...
      c1             
                     ____________________*c3
                          admin

Я хочу, чтобы ветвь разработки оставалась прежней, и у административной ветви должен быть собственный репозиторий. Для записи я использую sourcetree + bitbucket.

Я попробовал метод, упомянутый в этом ответе, и попробовал git push url://to/new/repository.git admin:develop. Что он сделал в моем новом РЕПО, так это то, что история началась с первого коммита Development (c1). это выглядит так в новом репозитории.

c1      c2                           c3
*-------*----------------------------*
             develop

Однако я хотел запустить этот новый репозиторий с c2. Это нормальное поведение или я сделал что-то не так? Как правильно достичь желаемого результата?

2 ответа

  1. Поскольку c1является родителемc2, то нет никакого способа выполнить это без перезаписи истории и изменения хэшей фиксации. Но так как вы все равно создаете новый репозиторий, это может быть приемлемо, поэтому у вас есть несколько вариантов.

    Рассмотрим эту историю:

    * cd857c2 (HEAD -> develop) c5
    * eda39a7 c4
    | * 49671f2 (admin) c3
    |/  
    * 53b169b c2
    * 42bf35f c1
    

    Я бы предложил создать сиротский филиал из c2

    git checkout --orphan newDev 53b169b
    

    Это создаст ветвь с новым корнем, не связанным с историей остального репозитория, и перенесет все файлы в репозитории в этот момент времени в индекс, так что теперь вы можете изменить этот индекс, как вы считаете нужным с reset, а затем сделать начальную фиксацию.

    git commit -m "c1/c2"
    

    Наконец, cherry-выберите диапазон коммитов от начального коммита до подсказки административной ветви.

    git cherry-pick 53b169b..admin
    

    Теперь у вас есть новая ветка с совершенно разными хэшами фиксации для одного и того же контента, начиная с нужной точки.

    * d19cdd1 (HEAD -> newDev) c3
    * f886282 c1/c2
    

    Наконец, нажмите эту новую ветку.

    git push url://to/new/repository.git newDev:develop
    
  2. git checkout -b sliced-admin admin                   # start with admin
    git rev-list develop.. | tail -1 >.git/info/grafts   # slice out the develop history
    git filter-branch                                    # .
    rm .git/info/grafts                                  # .
    

    Теперь нажмите ветку sliced-admin, где вы хотите

    git push u://r/l sliced-admin:itsnamethere