Непрерывное перемещение ветки git из мастера приводит к дублированию коммитов

У меня есть ветка выпуска, которая ответвлена ​​от мастера. И в ветке релиза будет несколько локальных коммитов. Мне нужно синхронизировать ветку выпуска с мастером. Поэтому каждое утро я запускаю сценарий со следующими шагами:

  1. git checkout releasebranch
  2. git rebase -Xtheirs master (Xtheirs, чтобы локальные изменения в ветке выпуска отменяли в случае конфликтов)
  3. git pull origin releasebranch --rebase (чтобы мои локальные коммиты оставались на месте после перебазирования)
  4. git push origin releasebranch

Это вызывает дублирование коммитов и большое количество различий из основной ветки. Любая подсказка, следую ли я правильному методу синхронизации ветки?

Примечание:
а. Мне нужно запустить автоматический сценарий для синхронизации, поэтому разрешение конфликтов вручную нецелесообразно. Поэтому использовался вариант Xtheirs.
б. Пробовал git merge -Xours master и он выкидывает хрен конфликтов. c. У меня есть еще одна ветка, которая синхронизируется от мастера с помощью команды git rebase -s ours master, и она работает нормально. Но в этом случае мне нужны локальные изменения на releasebranch, чтобы переопределить изменения в master.


109
1

Ответ:

Мне кажутся подозрительными ваши третий и четвертый шаги. В идеале, если вы используете рабочий процесс перебазирования для releasebranch, вы должны быть единственным, кто использует эту ветвь. Так что второй шаг имеет смысл, потому что именно так вы будете в курсе master. Но я не уверен в синхронизации с другими изменениями, исходящими от людей, делящихся этой веткой.

Для вашего четвертого шага, поскольку вы, возможно, переписали историю releasebranch, следующее в большинстве случаев не работает:

git push origin releasebranch

Вместо этого вам нужно будет нажать сила на ветку выпуска через:

git push --force origin releasebranch

Так что, возможно, советуем по возможности исключить шаг 3, если можете, а затем принудительно нажать на четвертом шаге.