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
? Помощь очень нужна и ВЕЛИКОЕ оценили, также, если я могу как-то создать резервную копию моей ветки, это будет здорово, если я что-то прикручу.
Ответы
Ответ 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