git-rebase: объединяет две расходящиеся ветви / репозитории - PullRequest
2 голосов
/ 22 июня 2011

Предположим, у меня следующая ситуация:

Существует основной репозиторий User Foo. Пользовательская панель разветвляет этот репозиторий, поэтому оба репозитория синхронизированы. Теперь пользователь Bar реализует функцию и создает локальную ветвь с именем "barbranch". К тому времени, когда пользователь Bar завершил реализацию функции, Foo зафиксировал и отправил что-то в главный репозиторий. Так что в основном ситуация выглядит так:

A---B---C---D    main repository
         \
          E      forked repository (where C=E)
           \
            F    barbranch on forked repository

Теперь, как можно вернуть вещи в нормальное состояние в репо пользователя Foo?

Наивно я бы сказал:

# switch to the local master and merge barbranch into it
git checkout master
git pull
git pull upstream
git push
git merge barbranch
# merge conflicts occur
vi somefile
git commit -a
git rebase origin master
# this conflict occurs again
vi somefile
git commit -a
git status # says I'm on (no branch) ?!
git push
g    it checkout master
# conflict occurs again!
vi somefile
git commit -a
git push
# send merge request to user Foo

Наконец, это дает мне три безобразных коммита вместо одного.

Проверка документации git-rebase, которую я нашел git rebase --onto .... Хотя я не могу понять, какой будет точная команда и как будет выглядеть весь этот процесс в конце.

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Это зависит от дерева, которое вы хотите получить.

Если вы хотите, чтобы дерево представляло реальную историю работы, вы не должны использовать «rebase», а только «объединить»

# on bar repo
git fetch upstream
git checkout master
git merge upstream/master (fast-forward)
git merge barbranch
# resolve conflicts (adding resolved files)
git commit
git push upstream master

Если вы хотите «линеаризовать» работу с rebase, вот что вы должны сделать:

# on bar repo
git fetch upstream
git checkout master
git merge upstream/master (fast-forward)
git checkout barbranch
git rebase master
# resolve conflicts + commits (each commit will be processed separately: so you may need to do that several times if various commits are in conflict with the upstream)
git checkout master
git merge barbranch **(fast-forward after the rebase)**
git push upstream master
2 голосов
/ 22 июня 2011

Я думаю, что следующий сценарий должен подойти для вашей ситуации.

  • Мастер проверки
  • Вставьте разветвленную ветвь в локального мастера
  • Исправьте конфликты вручную
  • Зафиксируйте изменения в разрешении конфликтов
  • Нажмите на мастера

Это фактически приведет к 3 коммитам в вашем мастере (у вас будут коммиты E & F иваш коммит разрешения конфликтов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...