Подтвердить что ты не робот

Git переформатировать одну ветку поверх другой ветки

В моем реестре git у меня есть ветвь Master. Один из удаленных разработчиков создал ветвь Branch1 и имел кучу коммитов на ней. Я разветкился от Branch1, создав новую ветвь с именем Branch2 (git checkout -b Branch2 Branch1), так что Branch2 head был на последнем коммите добавлен в Branch1:( Выглядит так)

Master---
         \
          Branch1--commit1--commit2
                                   \
                                    Branch2 (my local branch) 

Branch1 имеет ряд изменений. Другой дэв раздавил свои коммиты, а затем добавил еще несколько коммитов. Между тем, у меня была куча изменений в моей ветке, но я еще ничего не совершал. Текущая структура выглядит следующим образом:

  Master---
             \
             Branch1--squashed commit1,2--commit3--commit4
                                       \
                                        Branch2 (my local branch)

Теперь мне нужно изменить мои изменения поверх Branch1. Я в высшей степени озадачен тем, как это сделать. Я знаю, что первый шаг будет состоять в том, чтобы зафиксировать мои изменения, используя git add . и git commit -m "message". Но тогда я толкаю? используя git push origin Branch2? или git push origin Branch2 Branch1? Помощь очень нужна и ВЕЛИКОЕ оценили, также, если я могу как-то создать резервную копию моей ветки, это будет здорово, если я что-то прикручу.

4b9b3361

Ответ 1

Сначала создайте резервную копию текущего Branch2:

# from Branch2
git checkout -b Branch2_backup

Затем rebase Branch2 on Branch1:

# from Branch2
git fetch origin           # update all tracking branches, including Branch1
git rebase origin/Branch1  # rebase on latest Branch1

После перезагрузки структура вашего ветки должна выглядеть так:

master --
         \
          1 -- 2 -- 3 -- 4 -- Branch2'

В приведенной выше диаграмме апостроф на Branch2 указывает, что каждая фиксация в rebased Branch2 после commit 4 фактически переписывается.

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

git push --force origin Branch2

Силовое нажатие может вызвать проблемы для других пользователей, использующих Branch2, поэтому при этом нужно быть осторожным.

Ответ 2

git rebase branch1 branch2 перебазирует ветвь branch2 на branch1. На branch2 это означает, что любые коммиты, которые содержатся только в branch2 (а не в branch1), будут воспроизводиться поверх branch1, перемещая указатель branch2 вместе с ними. См. git rebase --help для получения дополнительной информации, включая схемы этой операции.

Операция может вызвать некоторые конфликты, которые затем вам придется разрешить вручную. Редактируйте затронутые файлы, объединяя контент и удаляя любые неудачные блоки. Затем отметьте файлы как объединенные с помощью git add <file> а затем продолжите перебазирование с помощью git rebase --continue. Повторяйте, пока это не будет сделано.

После этого вам больше нечего делать. Тебе не нужно давить. Однако, если вы хотите отразить ваши новые изменения в каком-либо другом репозитории (например, поделиться им с другими или сохранить эти изменения в другом вашем репозитории), сделайте последний git push.

Ответ 3

Я хочу переустановить мои изменения (от локального branch2) поверх branch1.

git checkout branch2   # Go to your local branch. Use -f to force the checkout.
git reset HEAD --hard  # Drop all non-committed changes.
git rebase branch1     # Rebase on top of branch1. Use -i for an interactive list.

Примечание. Если ветвь находится на удаленном компьютере, например origin, префикс имени ветки origin/.

Устранение неполадок

  • Если вы застряли в середине rebase и хотите начать все заново, запустите:

    rm -fr .git/rebase-merge # Abort a rebase-merge mode.
    git reset HEAD --hard    # Reset everything to the current HEAD.
    
  • Если вы находитесь на отдельной ветке (запустите: git branch и найдите символ звезды), запустите:

    git checkout branch2 -f # and start again.
    
  • Если у вас возникли конфликты, вам необходимо исправить их, используйте другую точку перегрузки.

  • Если вы хотите сделать шаг назад вручную, используйте вишневый подбор. Например.

    git reflog              # Note hashes of for your commits.
    git checkout master     # Go to your base branch.
    git cherry-pick C0MM1T1 # Cherry pick first commit based on its hash.
    # Go to the next one or solve the conflicts.
    git cherry-pick C0MM1T2 # Cherry pick another commit and so on.
    
  • Если ваш rebase показывает слишком много коммиттов в интерактивном списке после запуска git rebase branch1 -i, вы можете начать свою переустановку с учетом конкретной фиксации непосредственно перед вашими изменениями, например. git rebase pr3v1ios.

Ответ 4

Прежде всего, вы должны убедиться, что ваша ссылка на Branch1 обновлена ​​(особенно, поскольку история была изменена).

Если вам нравится работать с локальными копиями, вы можете сделать что-то вроде этого:

git push origin Branch2 # this ensures you have at least one copy in your remote
git fetch origin
git checkout Branch1
git reset --hard origin/Branch1
git checkout Branch2
git rebase Branch1 # solve conflicts ... and check that everything is ok
git push -f origin Branch2