Как переадресовать другие ветки отслеживания в git?

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

Таким образом, нам не редкость:

(branch) $ git commit -a -m"blah blah blah"
(branch) $ git fetch  # origin/trunk is updated
(branch) $ git checkout trunk
(trunk) $ git pull  # trunk is fast-forwarded to current version of origin/trunk.
(trunk) $ git checkout branch
(branch) $ git merge trunk
(branch) $ git push

Мне не нравится цикл git checkout trunk/git pull/git checkout branch ". Обычно он сочетается с Visual Studio, жалуясь на то, что все мои файлы и проекты были изменены на диске, и если они перезагружают их. Для обоих проверок. И тянуть. И слияние. Слияние неизбежно, но из-за того, как работает git, он должен иметь возможность выполнять быструю перемотку на соединительной линии, не требуя, чтобы это проверить.

Но я не знаю эту команду, и мой google-foo не помог мне в этом. Кто-нибудь знает как?

Ответ 1

Вам действительно нужно обновить локальную ветвь trunk?

Просто fetch origin/trunk и merge он непосредственно в ветке, над которой вы работаете.
И это Mark Longair совет: git: fetch и merge, dont pull.


Oliver упоминает в его ответ (вверху):

git fetch upstream trunk:trunk

Как он комментирует:

вы можете пропустить слияние и просто перемотать вперед, используя однострочный.

Он переадресовывает локальную ветвь trunk в удаленную ветвь HEAD.

Подробнее на странице git: обновить локальную ветку без проверки?"

Ответ 2

Я думаю, что самый простой способ избежать цикла git checkout trunk, git pull, git checkout branch - использовать этот ответ:

git fetch upstream trunk:trunk

Это делает именно то, что вы хотите - переадресовывайте свою локальную ветвь trunk в удаленную ветвь HEAD.

Ответ 3

Я согласен с ответом VonC, но подумал, что было бы интересно ответить на вопрос "Как быстро переправить master, если вы находитесь на другой ветке?" так или иначе. Я не думаю, что есть способ сделать это, просто используя команды фарфора, но этот script выполняет задание (очевидно, вы хотели бы изменить master на trunk в вашем случае):

#!/bin/sh

BRANCH=master
NEWER=origin/master

if [ x"$(git symbolic-ref HEAD)" = x"refs/heads/$BRANCH" ]
then
    echo "This doesn't make sense if you're already on the branch '$BRANCH'"
    echo "Just run: git merge $NEWER"
    exit 1
fi

BRANCH_HASH=$(git rev-parse $BRANCH)
NEWER_HASH=$(git rev-parse $NEWER)
MERGE_BASE=$(git merge-base $BRANCH_HASH $NEWER_HASH)

if [ "$MERGE_BASE" = "$BRANCH_HASH" ]
then
    git update-ref "refs/heads/$BRANCH" "$NEWER_HASH" "$BRANCH_HASH"
else
    echo "$BRANCH can't be fast-forwarded to $NEWER"
    exit 1
fi

Обновление 2012-10-20: этот script был просто быстрым примером; для script, который делает то же самое, но для слияния любого произвольного commit-ish в локальную ветвь (пока слияние будет быстрой перемоткой вперед), см. Ответ Jefromi на аналогичный вопрос.

Ответ 4

Попробуйте следующее:

$ git pull trunk branch