Как синхронизировать две ветки в одном репозитории Git? - PullRequest
29 голосов
/ 25 октября 2010

Вот типичное препятствие рабочего процесса, с которым я часто сталкиваюсь:

Мастер - это наша "стабильная" ветка

$ 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?

Ответы [ 3 ]

33 голосов
/ 25 октября 2010

Если вам не нужна ветвь вокруг:

Если вы слили foo обратно в master, "git branch -d foo", чтобы убить ветку темы, а затем"checkout -b foo" в будущем, когда вам нужно будет снова взломать его.

Если вам нужна ветка вокруг:

Вы можете перебазировать свою ветку темыпо отношению к основной ветви:

git checkout foo
git rebase master

Или:

git rebase master foo
6 голосов
/ 20 февраля 2015

Перебазирование - это процесс перемещения или объединения последовательности коммитов в новый базовый коммит.Перебазирование наиболее полезно и легко визуализируется в контексте рабочего процесса ветвления элемента.Общий процесс может быть визуализирован следующим образом:

Git Rebase visual explanation

В приведенном ниже примере комбинируется 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

Взято из Учебник по Atlasian Git Rebase

1 голос
/ 21 февраля 2019

Я использую следующее, чтобы объединить изменения из двух веток (моей и вашей) и синхронизировать обе ветви для продолжения работы. Кажется, это работает. Кто-нибудь видит проблему с этим?

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
...