Как синхронизировать две ветки в одном репозитории Git?
Вот обычное препятствие рабочего процесса, с которым я часто сталкиваюсь:
мастер наша "стабильная" ветка
$ git status
# On branch master
nothing to commit (working directory clean)
создать модуль на ветке
$ git checkout -b foo
$ echo "hello" > world
$ git add .
$ git commit -m "init commit for foo module"
$ git checkout master
$ git merge foo
делать работу на мастера или другие отрасли
В течение следующих нескольких недель будет добавлено больше кода для непосредственного освоения и другими ветвями. foo
ветка останется нетронутой за этот промежуток времени
возобновить работу / внести изменения в ветку foo
$ git checkout foo
о нет! foo
сильно устарел! Я понимаю почему, но мне нужно foo
обратно в синхронизации.
вопрос
Как я могу получить последнюю информацию из master
ветка?
4 ответа
Если вам не нужна ветка вокруг:
Если вы слили foo обратно с master, "git branch -d foo" убьет ветку темы, а затем "checkout -b foo" в будущем, когда вам нужно будет снова взломать его.
Если вам нужна ветка вокруг:
Вы можете перебазировать свою ветку темы на основную ветку:
git checkout foo
git rebase master
Или же:
git rebase master foo
Перебазирование - это процесс перемещения или объединения последовательности коммитов в новый базовый коммит. Перебазирование наиболее полезно и легко визуализируется в контексте рабочего процесса ветвления элемента. Общий процесс можно представить следующим образом:
Пример ниже объединяет git rebase с git merge для поддержки линейной истории проекта. Это быстрый и простой способ обеспечить быструю пересылку ваших слияний.
# Start a new feature
git checkout -b new-feature master
# Edit files
git commit -a -m "Start developing a feature"
Посреди нашей функции мы понимаем, что в нашем проекте есть дыра в безопасности
# Create a hotfix branch based off of master
git checkout -b hotfix master
# Edit files
git commit -a -m "Fix security hole"
# Merge back into master
git checkout master
git merge hotfix
git branch -d hotfix
После слияния исправления с мастером у нас есть разветвленная история проекта. Вместо простого git-слияния мы интегрируем ветвь функций с ребазой, чтобы поддерживать линейную историю:
git checkout new-feature
git rebase master
Это перемещает новую функцию к кончику мастера, что позволяет нам выполнять стандартное ускоренное слияние с мастером:
git checkout master
git merge new-feature
Взято из учебника Atlassian Git Rebase
Я использую следующее, чтобы объединить изменения из двух ветвей (моей и вашей) и синхронизировать обе ветви для продолжения работы. Кажется, это работает. Кто-нибудь видит проблему с этим?
git checkout mine # make sure I'm on my branch
git commit -a # commit changes
git push origin mine
git checkout yours # switch to your branch
git pull origin yours # get changes you've committed & pushed
git checkout mine
git merge yours # merge your changes into mine
git push origin mine
git checkout yours
git rebase mine # set your branch to the merged result
git push origin yours # push the merged result up to your branch on origin
git checkout mine # get back to my branch
Адам ответ хороший.
Кроме того, для тех, кто использует IntelliJ и нуждается в помощи относительно перебазирования и слияния, вот ссылка на видео на YouTube. Это поможет вам визуально понять, как работает rebase.