Ответ 1
Проблема в том, что мне нужно посмотреть, не будут ли опубликованы ветки, которые я хочу объединить.
Если они не опубликованы, вы должны их переустановить.
Но проверить, действительно ли перебаза действительно возможна, крошечный бит сложный:
Во-первых, после извлечения вы легко можете проверить если у вас еще есть локальные коммиты:
git log origin/master..master
o--o--o (origin/master)
/
x--x--x--y--y (master)
В этом случае вполне нормально переустанавливать, за исключением того, что master
уже был перенесен в другую ветку из вашего репо.
Но вы также можете легко проверить это:
git branch -r --contains master
Если какая-либо удаленная ветвь (-r
) содержит ветвь, которую вы хотите переустановить, то это менее безопасная идея, и предпочтительнее слияние.
Но если удаленная ветвь сама была переустановлена (и принудительно нажата), тогда вам нужно быть осторожным, как описано в разделе "Как вы относитесь к публичному репозиторию, который уже был переустановлен?":
o--o--o (OLD origin/master)
/
x--x--X--y--y (master)
\
o'--o'--o' (origin/master, as seen after a 'git fetch')
Вслепую master
в верхней части origin/master
будет воспроизводиться commit X
, который был опущен, когда origin/master
был переустановлен. Нехорошо.
Сегодня (январь 2014 года) единственный способ справиться с этим делом - это:
- создайте ветвь маркера tmp на
origin/master
, -
git fetch
, - проверьте, что
git branch --contain tmp
перечисляетorigin/master
(который был извлечен и, возможно, с другой историей, если он был переустановлен и принудительно нажат).
Завтра (git 1.9, Q1 2014) вам не нужно будет отмечать удаленную ветвь перед извлечением:
fork_point=$(git merge-base --fork-point origin/upstreamBranch yourBranch)
# return X
git rebase --onto origin/upstreamBranch $fork_point yourBranch
Повторить:
После a git fetch
(после маркировки origin/master
перед выборкой)
- если
git log origin/master..master
возвращает фиксации изmaster
, которые не являются частьюorigin/master
(это означает, что локальные коммиты не были нажаты наorigin/master
) - И если
git branch -r --contains master
пуст (значениеmaster
не было нажато нигде, на любой удаленной ветки отслеживания вы можете увидеть черезgit fetch
)
Тогда:
- if
origin/master
включает ветвь маркера 'tmp
' (значениеorigin/master
не было переустановлено), вы можетеgit rebase origin/master master
. - else: вы можете
git rebase --onto origin/master $(git merge-base tmp master) master
(вам нужноtmp
здесь, чтобы переустановить только вашу ветку. Git 1.9 потребует ненужной ветки tmp)
В любых других случаях: merge origin/master
до master
.