Как переадресовать другие ветки отслеживания в 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