Git: Как переустановить много ветвей (с одним и тем же базовым фиксацией) сразу?

У меня есть главный филиал в моем проекте, который я использую, чтобы тянуть изменения от других людей. От этого у меня обычно есть несколько ветвей тем, в которых я сейчас работаю.

Мой вопрос: есть ли способ, чтобы я вносил новые изменения в своего хозяина, а затем сразу же возвращал ВСЕ свои ветки темы?

В этой ситуации:

        D--E topic1
       /
A--B--C  master
       \
        F--G topic2

И я хочу сделать это с помощью одной единственной команды (H пришел из восходящего потока):

               D'--E' topic1
              /
    A--B--C--H  master
              \
               F'--G' topic2

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

Эта операция (несколько переустановок), когда она выполняется вручную, является устаревшей и подверженной ошибкам.

Есть ли более простой способ?

Спасибо!

Ответ 1

Я уверен, что нет возможности автоматически сделать это. Помните, что "git мастер перезаписи" также может вернуть вас в оболочку, требующую разрешения конфликтов слияния, поэтому, если вы хотите написать script для автоматизации всего этого, вам нужно принять это во внимание.

Вы можете довольно легко отслеживать, какие ветки нуждаются в обновлении. Hmm, для любой ветки "git rev-list branch..master" будет выводить вывод, если ветка не обновляется по-верхнему (т.е. Просто заканчивается поверх). Таким образом, вам нужно пройти через все локальные головки, за исключением того, что мастер для создания отчета (nb "git show-branch" примерно сделает это):

git for-each-ref 'refs/heads/*' | \
  while read rev type ref; do
    branch=$(expr "$ref" : 'refs/heads/\(.*\)' )
    revs=$(git rev-list $rev..master)
    if [ -n "$revs" ]; then
      echo $branch needs update
      git diff --summary --shortstat -M -C -C $rev master
    fi
  done

Итак, если вы чувствовали себя храбрыми, вы могли бы заменить этот "git diff" чем-то вроде "git checkout $branch & git master basase" (или, может быть, просто "git pull - -rebase", если вы это установили). Я думаю, вам нужно будет проверить наличие каталога ".git/rebase-apply" или проверить индекс для несвязанных файлов ( "git ls-files -u" ), чтобы проверить, остались ли мы ожидая слияния.

Конечно, если конфликтов нет, то легко... он создает что-то, что также работает, когда нелегко, что проблема: p

И это не обязательно относится к тому, что происходит, если один из ваших ветвей основан на чем-то еще... поэтому я упомянул об использовании "git pull -rebase" вместо этого, потому что это было бы rebase в соответствии с конфигурацией ветки, а не слепо от мастера. Хотя обнаружение не основано на конфигурации ветки... возможно, было бы проще всего проверить каждую ветку и сделать "git pull" и разрешить конфигурацию ветки обрабатывать все, в том числе, нужно ли пересобирать или объединять?

Ответ 2

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

for branch in topic1 topic2 topic3;do git rebase master $branch;done

Поскольку ветки тем, которые вы хотели бы переустановить, со временем, вероятно, со временем изменится, это быстрое и правильное решение H ^ H ^ Hflexible: -)

Ответ 3

Я превратил это в надежный script, содержащийся в my git -extensions repository:

$ git-urebaselocalbr --help
Rebase all / the last committed N local branches (except for the current branch
and master) to the updated upstream head.
Usage: git-urebaselocalbr [--continue|--skip|--abort] [--branches "<branch1> ..."] [N] [-i|--interactive] [options]