10

В репо у меня есть несколько веток, среди которых "master" и "development", которые настроены на отслеживание удаленных веток «origin /master» и «origin / development».

Можно ли указать, что я хочу, чтобы мастер и разработка были объединены (переадресованы) одновременно?

Когда я делаю git pull сейчас, я получаю что-то вроде этого:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

все удаленные ветви извлекаются, но только ветвь, в которой я сейчас нахожусь, объединяется с соответствующей удаленной веткой.

Так что я должен сделать git checkout master ...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

... и затем снова git pull , а затем переключитесь обратно, чтобы получить желаемый результат.

Я знаю, что могу сделать псевдонимы / сценарии, которые делают эти шаги. Но я хочу избежать этого, если это возможно, так как это подвержено ошибкам и не очень эффективно.
Изменить: хорошо, позвольте мне перефразировать это. Моя цель не состояла в том, чтобы не препятствовать или не одобрять настройку скриптов / псевдонимов в git. Я бы предпочел встроенное решение, если оно существует :)

3 ответа3

8

Вы можете настроить псевдоним, который использует git fetch с refspecs для быстрой перемотки слияния ваших веток с помощью одной команды. Установите это как псевдоним в вашем пользовательском файле .gitconfig :

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

Использование: git sync .

Вот почему это работает:

  1. git checkout --quiet HEAD напрямую проверяет ваш текущий коммит, переводя вас в отдельное состояние головы . Таким образом, если вы работаете с master или develop , вы отсоединяете свою рабочую копию от этих указателей веток, позволяя им перемещаться (Git не позволит вам перемещать ссылки на ветки, пока ваша рабочая копия их извлекает).

  2. git fetch origin master:master develop:develop mastervelop : velop использует refspecs с fetch для быстрой перемотки master и develop веток в вашем локальном репо. Синтаксис в основном говорит Git: «здесь есть ссылка на форму <source>:<destination> , возьмите <destination> и перенесите его в ту же точку, что и <source> ». Таким образом, источники в псевдониме - это ветки от origin , а места назначения - версии этих веток для локального репо.

  3. Наконец, git checkout --quiet - проверяет ветку, в которой вы были в последний раз, независимо от того, был ли сбой в предыдущих командах. Так что, если вы работали с master когда запускали git sync , и все прошло успешно, вы выйдете из отдельного состояния головы и проверите только что обновленный master .

Смотрите также мой ответ на git: обновить локальную ветку без проверки? ,

1

Установите Git-Up. Это дает вам команду git-up которая будет тянуть все локальные ветви в вашем хранилище.

0

Кажется, что нет встроенной опции для git, чтобы тянуть в несколько веток. По крайней мере, не в версии 1.8.0. хотя ответ @ Cupcake близок к этому.

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

Так что чуть более эффективная последовательность будет:

git pull
git checkout master
git merge origin/master
git checkout -

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

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

Конечно, без тестирования этот псевдоним предполагает, что я предоставляю правильное имя ветви ff'able в качестве 1-го аргумента, и в противном случае он имеет неопределенное поведение. Это также не оптимально для вариантов использования с более чем двумя ветвями, но это даст мне то, что мне сейчас нужно.

git pull
git ffwd master

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .