Я попытаюсь собрать воедино команды.
git checkout feature
git pull --rebase origin develop
- исправьте конфликты, завершите ребазинг
git push
В этот момент вы получите что-то вроде этого.
To github.com:org/repo.git
! [rejected] feature -> feature (non-fast-forward)
error: failed to push some refs to 'git@github.com:org/repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Подсказка неверна , git pull
здесь неправильно. Вместо этого вы должны git push --force
перезаписать вышестоящий feature
своим собственным. Это потому, что вы переписали ветку feature
и она расходится с восходящей.
Вот что произошло более подробно. В начале все выглядело примерно так. Обратите внимание, что вышестоящий origin/feature
и ваш локальный feature
находятся на одном и том же коммите.
[origin/develop]
A - B - C - D - E - F [develop]
\
G - H - I [feature]
[origin/feature]
После того, как git pull --rebase origin develop
и все конфликты были исправлены, ваш репозиторий выглядел следующим образом.
[origin/develop]
[develop]
A - B - C - D - E - F - G1 - H1 - I1 [feature]
\
G - H - I [origin/feature]
rebase
не переписывает коммиты. Он создает новые и делает вид, что так было всегда. Теперь feature
и origin/feature
имеют расходящиеся , что означает, что один не является предком другого.
При попытке git push
ваш feature
Git отказывается. Это не просто вопрос перемещения origin/feature
по нескольким коммитам, называемый «ускоренной перемоткой вперед». Потребуется объединение, и git push
не сделает этого по соображениям безопасности. Ваша работа, похоже, отличается от от всех остальных. push
рискует перевалить за работу других людей в той же ветке.
Вот почему git push --force
необходим. В любом случае, он говорит Git сделать это, поставив origin/feature
на commit I1
. После git push --force
у вас будет это.
[origin/develop]
[develop]
A - B - C - D - E - F - G1 - H1 - I1 [feature]
\ [origin/feature]
G - H - I
Теперь все хорошо. Ваша feature
работа такова, как если бы она была на вершине develop
все время.
Если вы снова git pull --rebase origin develop
и на develop
нет новых коммитов, ничего не должно произойти. Если есть новые коммиты, вам придется иметь дело только с ними.